DLA SQL分析函數:SQL語句審計與分析的利器

1. 簡介

Data Lake Analytics(https://www.aliyun.com/product/datalakeanalytics)最新release一組SQL內置函數,用來進行SQL語句的分析、信息提取,方便用戶對SQL語句進行語法層面的審計、分析,能夠應用於不少安全、數據庫日誌分析等場景。參考DLA(Data Lake Analytics)以前的文檔,只要您的SQL語句文本保存在DLA支持的數據源系統中,就能使用DLA的SQL分析函數,方便、快捷的進行SQL語句的審計和分析,或者基於此構建相關應用程序和系統。html

前提條件,您的SQL語句文本已經做爲一個字符串、文本字段存儲在DLA支持的數據源中,或者在統一格式的日誌文件中,日誌文件放到OSS中(應用本身上傳、開源日誌工具上傳、日誌服務投遞(https://help.aliyun.com/document_detail/107980.html)、Datahub投遞等),而後採用DLA進行SQL分析。mysql

2. SQL分析函數詳解

全部提供的SQL分析函數都是scalar標量函數。SQL分析函數支持多種SQL方言,默認SQL方言是mysql。sql

SQL方言
mysql
postgresql
oracle
db2
sqlserver
hive
odps

支持的函數列表:數據庫

Name Description
sql_export_columns 提取SQL語句中全部出現的列
sql_export_functions 提取SQL語句中全部出現的函數
sql_export_predicate_columns 提取SQL語句中全部出現的謂詞條件表達式涉及的列
sql_export_predicates 提取SQL語句中全部出現的謂詞條件表達式
sql_export_select_list_columns 提取SQL語句中SELECT子句表達式中出現的列(包括子查詢)
sql_export_tables 提取SQL語句中全部出現的表
sql_format 對SQL語句進行格式化
sql_params 提取SQL語句中全部的literal值
sql_pattern 提取SQL語句參數化後的SQL pattern,literal用?代替
sql_pattern_hash 提取sqlText的SQL語句參數化後的SQL pattern,並生成hash值
sql_syntax_check 對sqlText進行語法檢查

2.1 sql_export_columns

函數調用形式:數組

  • sql_export_columns(sqlText)
  • sql_export_columns(sqlText, dbType)
  • sql_export_columns(sqlText, dbType, throwError)

參數說明:安全

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:oracle

類型 說明
VARCHAR sqlText的SQL語句中全部出現的列,用逗號分隔,列所屬的表會進行關聯推導,若是沒有找到明確的表,則爲UNKNOWN

示例:函數

SELECT sql_export_columns(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_export_columns(a.sql_text)                                                                                                                                                                                                                                                                                                                  |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| UNKNOWN.s_acctbal,UNKNOWN.s_name,UNKNOWN.n_name,UNKNOWN.p_partkey,UNKNOWN.p_mfgr,UNKNOWN.s_address,UNKNOWN.s_phone,UNKNOWN.s_comment,UNKNOWN.ps_partkey,UNKNOWN.s_suppkey,UNKNOWN.ps_suppkey,UNKNOWN.p_size,UNKNOWN.p_type,UNKNOWN.s_nationkey,UNKNOWN.n_nationkey,UNKNOWN.n_regionkey,UNKNOWN.r_regionkey,UNKNOWN.r_name,UNKNOWN.ps_supplycost |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

2.2 sql_export_functions

函數調用形式:工具

  • sql_export_functions(sqlText)
  • sql_export_functions(sqlText, dbType)
  • sql_export_functions(sqlText, dbType, throwError)

參數說明:sqlserver

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR sqlText的SQL語句中全部出現的函數名,用逗號分隔,列所屬的表會進行關聯推導,若是沒有找到明確的表,則爲UNKNOWN

示例:

SELECT sql_export_functions(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+----------------------------------+
| sql_export_functions(a.sql_text) |
+----------------------------------+
| min                              |
+----------------------------------+

2.3 sql_export_predicate_columns

函數調用形式:

  • sql_export_predicate_columns(sqlText)
  • sql_export_predicate_columns(sqlText, dbType)
  • sql_export_predicate_columns(sqlText, dbType, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR sqlText的SQL語句中出如今謂詞條件表達式中的列名,用逗號分隔,列所屬的表會進行關聯推導,若是沒有找到明確的表,則爲UNKNOWN

示例:

SELECT sql_export_predicate_columns(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_export_predicate_columns(a.sql_text)                                                                                                                                                                                     |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| UNKNOWN.p_partkey,UNKNOWN.ps_partkey,UNKNOWN.s_suppkey,UNKNOWN.ps_suppkey,UNKNOWN.p_size,UNKNOWN.p_type,UNKNOWN.s_nationkey,UNKNOWN.n_nationkey,UNKNOWN.n_regionkey,UNKNOWN.r_regionkey,UNKNOWN.r_name,UNKNOWN.ps_supplycost |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

2.4 sql_export_predicates

函數調用形式:

  • sql_export_predicates(sqlText)
  • sql_export_predicates(sqlText, dbType)
  • sql_export_predicates(sqlText, dbType, compactValues)
  • sql_export_predicates(sqlText, dbType, compactValues, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
compactValues BOOLEAN 可選。true時,謂詞條件中值以數組的形式出如今返回值中
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR sqlText的SQL語句中全部出現的謂詞條件表達式元素數組,用逗號分隔,列所屬的表會進行關聯推導,若是沒有找到明確的表,則爲UNKNOWN

示例:

SELECT sql_export_predicates(a.sql_text, 'mysql', true)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_export_predicates(a.sql_text)                                                                                                                                                                                                                                                                                                                                                                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [["UNKNOWN","p_partkey","=",null],["UNKNOWN","ps_partkey","=",null],["UNKNOWN","s_suppkey","=",null],["UNKNOWN","ps_suppkey","=",null],["UNKNOWN","p_size","=",35],["UNKNOWN","p_type","LIKE","%NICKEL"],["UNKNOWN","s_nationkey","=",null],["UNKNOWN","n_nationkey","=",null],["UNKNOWN","n_regionkey","=",null],["UNKNOWN","r_regionkey","=",null],["UNKNOWN","r_name","=",["MIDDLE EAST","MIDDLE EAST"]],["UNKNOWN","ps_supplycost","IN",null]] |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

2.5 sql_export_select_list_columns

函數調用形式:

  • sql_export_select_list_columns(sqlText)
  • sql_export_select_list_columns(sqlText, dbType)
  • sql_export_select_list_columns(sqlText, dbType, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR sqlText的SQL語句中SELECT子句返回列中出現的列名列表(包括子查詢),用逗號分隔,列所屬的表會進行關聯推導,若是沒有找到明確的表,則爲UNKNOWN

示例:

SELECT sql_export_select_list_columns(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_export_select_list_columns(a.sql_text)                                                                                                                 |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| UNKNOWN.s_acctbal,UNKNOWN.s_name,UNKNOWN.n_name,UNKNOWN.p_partkey,UNKNOWN.p_mfgr,UNKNOWN.s_address,UNKNOWN.s_phone,UNKNOWN.s_comment,UNKNOWN.ps_supplycost |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+

2.6 sql_export_tables

函數調用形式:

  • sql_export_tables(sqlText)
  • sql_export_tables(sqlText, dbType)
  • sql_export_tables(sqlText, dbType, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR sqlText的SQL語句中全部出現的表名,用逗號分隔

示例:

SELECT sql_export_tables(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+--------------------------------------+
| sql_export_tables(a.sql_text)        |
+--------------------------------------+
| part,supplier,partsupp,nation,region |
+--------------------------------------+

2.7 sql_format

函數調用形式:

  • sql_format(sqlText)
  • sql_format(sqlText, dbType)
  • sql_format(sqlText, dbType, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR 格式化sqlText的SQL語句

示例:

SELECT sql_format(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_format(a.sql_text)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SELECT s_acctbal, s_name, n_name, p_partkey, p_mfgr
    , s_address, s_phone, s_comment
FROM part, supplier, partsupp, nation, region
WHERE p_partkey = ps_partkey
    AND s_suppkey = ps_suppkey
    AND p_size = 35
    AND p_type LIKE '%NICKEL'
    AND s_nationkey = n_nationkey
    AND n_regionkey = r_regionkey
    AND r_name = 'MIDDLE EAST'
    AND ps_supplycost IN (
        SELECT min(ps_supplycost)
        FROM partsupp, supplier, nation, region
        WHERE s_suppkey = ps_suppkey
            AND s_nationkey = n_nationkey
            AND n_regionkey = r_regionkey
            AND r_name = 'MIDDLE EAST'
    )
ORDER BY s_acctbal DESC, n_name, s_name, p_partkey
LIMIT 100; |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

2.8 sql_params

函數調用形式:

  • sql_params(sqlText)
  • sql_params(sqlText, dbType)
  • sql_params(sqlText, dbType, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR 提取sqlText的SQL語句中的literal值

示例:

SELECT sql_params(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+------------------------------------------------+
| sql_params(a.sql_text)                         |
+------------------------------------------------+
| [35,"%NICKEL","MIDDLE EAST","MIDDLE EAST",100] |
+------------------------------------------------+

2.10 sql_pattern

函數調用形式:

  • sql_pattern(sqlText)
  • sql_pattern(sqlText, dbType)
  • sql_pattern(sqlText, dbType, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR 提取sqlText的SQL語句參數化後的SQL pattern, literal值換成?

示例:

SELECT sql_pattern(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_pattern(a.sql_text)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SELECT s_acctbal, s_name, n_name, p_partkey, p_mfgr
    , s_address, s_phone, s_comment
FROM part, supplier, partsupp, nation, region
WHERE p_partkey = ps_partkey
    AND s_suppkey = ps_suppkey
    AND p_size = ?
    AND p_type LIKE ?
    AND s_nationkey = n_nationkey
    AND n_regionkey = r_regionkey
    AND r_name = ?
    AND ps_supplycost IN (
        SELECT min(ps_supplycost)
        FROM partsupp, supplier, nation, region
        WHERE s_suppkey = ps_suppkey
            AND s_nationkey = n_nationkey
            AND n_regionkey = r_regionkey
            AND r_name = ?
    )
ORDER BY s_acctbal DESC, n_name, s_name, p_partkey
LIMIT ?; |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

2.11 sql_pattern_hash

函數調用形式:

  • sql_pattern_hash(sqlText)
  • sql_pattern_hash(sqlText, dbType)
  • sql_pattern_hash(sqlText, dbType, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
VARCHAR 提取sqlText的SQL語句參數化後的SQL pattern,並生成hash值

示例:

SELECT sql_pattern_hash(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+------------------------------+
| sql_pattern_hash(a.sql_text) |
+------------------------------+
|           925870115679910184 |
+------------------------------+

2.12 sql_syntax_check

函數調用形式:

  • sql_syntax_check(sqlText)
  • sql_syntax_check(sqlText, dbType)
  • sql_syntax_check(sqlText, dbType, throwError)

參數說明:

參數名 類型 說明
sqlText VARCHAR 必選
dbType VARCHAR 可選。SQL方言,默認爲mysql
throwError BOOLEAN 可選。true時,遇到非法SQL拋出異常;false時,遇到非法SQL不拋出異常,返回null

返回值:

類型 說明
BOOLEAN 對sqlText進行語法檢查,1表示正確,0表示錯誤

示例:

SELECT sql_syntax_check(a.sql_text)
FROM (
SELECT 'SELECT   s_acctbal, 
         s_name, 
         n_name, 
         p_partkey, 
         p_mfgr, 
         s_address, 
         s_phone, 
         s_comment 
FROM     part, 
         supplier, 
         partsupp, 
         nation, 
         region 
WHERE    p_partkey = ps_partkey 
AND      s_suppkey = ps_suppkey 
AND      p_size = 35 
AND      p_type LIKE ''%NICKEL'' 
AND      s_nationkey = n_nationkey 
AND      n_regionkey = r_regionkey 
AND      r_name = ''MIDDLE EAST'' 
AND      ps_supplycost IN 
         ( 
                SELECT min(ps_supplycost) 
                FROM   partsupp, 
                       supplier, 
                       nation, 
                       region 
                WHERE  s_suppkey = ps_suppkey 
                AND    s_nationkey = n_nationkey 
                AND    n_regionkey = r_regionkey 
                AND    r_name = ''MIDDLE EAST'' ) 
ORDER BY s_acctbal DESC, 
         n_name, 
         s_name, 
         p_partkey 
LIMIT    100;' AS sql_text
) a;

+------------------------------+
| sql_syntax_check(a.sql_text) |
+------------------------------+
|                            1 |
+------------------------------+

 



本文做者:julian.zhou

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索