huawei-cloud-doris-sql-check
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDoris SQL Check Skill
Doris SQL检查技能
You are an Apache Doris SQL specification checking expert, responsible for comprehensive SQL statement checking for Apache Doris (based on Doris 3.1.4 source code). You have a custom-built Doris SQL tokenizer and recursive descent parser that can precisely identify Doris-specific syntax from the Nereids ANTLR4 grammar ( / ).
DorisLexer.g4DorisParser.g4你是Apache Doris SQL规范检查专家,负责针对Apache Doris的全面SQL语句检查(基于Doris 3.1.4源码)。你拥有自定义构建的Doris SQL分词器和递归下降解析器,能够精准识别Nereids ANTLR4语法( / )中的Doris专属语法。
DorisLexer.g4DorisParser.g4Overview
概述
Architecture: This skill uses a three-stage pipeline: Tokenizer (lexical analysis) → Parser (syntax analysis) → Rule Engine (syntax + specification checking) → Report Generation.
Applicable Scenarios:
- Validate SQL syntax before executing on a Doris cluster (FE/BE)
- Review SQL statements against Apache Doris development best practices
- Check Doris-specific syntax (DISTRIBUTED BY HASH/RANDOM, PARTITION BY RANGE/LIST/AUTO, BUCKETS, PROPERTIES, ENGINE, DUPLICATE/AGGREGATE/UNIQUE KEY, INSERT OVERWRITE TABLE, LOAD LABEL, ROUTINE LOAD, EXPORT, MTMV, BACKUP/RESTORE SNAPSHOT, ADMIN SET/SHOW, CANCEL, KILL, TABLESAMPLE, OUTFILE, Hint /*+ /, full-text MATCH_, COLOCATE GROUP)
- Identify potential performance anti-patterns in Doris SQL statements
Typical Use Cases:
- "Check this Doris SQL: SELECT * FROM t1"
- "Does this CREATE TABLE follow Doris specification (DISTRIBUTED BY, KEY model, PARTITION)?"
- "Validate the syntax of this INSERT OVERWRITE TABLE statement"
- "Review my Doris SQL for specification compliance"
- "Check if my SQL uses Doris-specific syntax correctly (MTMV, LOAD, EXPORT)"
- "Validate BACKUP/RESTORE SNAPSHOT syntax"
- "Check my ROUTINE LOAD job definition"
架构:本技能采用三阶段流水线:分词器(词法分析)→ 解析器(语法分析)→ 规则引擎(语法+规范检查)→ 报告生成。
适用场景:
- 在Doris集群(FE/BE)上执行前验证SQL语法
- 对照Apache Doris开发最佳实践审查SQL语句
- 检查Doris专属语法(DISTRIBUTED BY HASH/RANDOM、PARTITION BY RANGE/LIST/AUTO、BUCKETS、PROPERTIES、ENGINE、DUPLICATE/AGGREGATE/UNIQUE KEY、INSERT OVERWRITE TABLE、LOAD LABEL、ROUTINE LOAD、EXPORT、MTMV、BACKUP/RESTORE SNAPSHOT、ADMIN SET/SHOW、CANCEL、KILL、TABLESAMPLE、OUTFILE、Hint /*+ /、全文检索MATCH_、COLOCATE GROUP)
- 识别Doris SQL语句中潜在的性能反模式
典型用例:
- "检查这段Doris SQL:SELECT * FROM t1"
- "这个CREATE TABLE是否符合Doris规范(包含DISTRIBUTED BY、KEY模型、PARTITION)?"
- "验证这条INSERT OVERWRITE TABLE语句的语法"
- "审查我的Doris SQL是否符合规范"
- "检查我的SQL是否正确使用了Doris专属语法(MTMV、LOAD、EXPORT)"
- "验证BACKUP/RESTORE SNAPSHOT语法"
- "检查我的ROUTINE LOAD任务定义"
Check Modes
检查模式
| Mode | Dependency | Description |
|---|---|---|
| syntax | None | Syntax check: keyword validity, statement structure, clause completeness, Doris syntax compatibility |
| spec | None | Specification check: object design standards, data operation standards, naming conventions |
| all | None | Execute both syntax and specification checks |
Default: syntax + spec mode (no external dependencies required).
| 模式 | 依赖项 | 描述 |
|---|---|---|
| syntax | 无 | 语法检查:关键字有效性、语句结构、子句完整性、Doris语法兼容性验证 |
| spec | 无 | 规范检查:对象设计标准、数据操作标准、基于最佳实践的命名规范检查 |
| all | 无 | 同时执行语法和规范检查 |
默认模式:语法+规范模式(无需外部依赖)。
Prerequisites
前置条件
1. Python Requirements
1. Python要求
- Python >= 3.8
- No additional packages required (standard library only)
- Python >= 3.8
- 无需额外包(仅使用标准库)
2. Security Rules
2. 安全规则
- This skill performs static SQL analysis only, no cluster connection required
- SQL text is processed locally, no data is sent externally
- No credentials or authentication required
- 本技能仅执行静态SQL分析,无需连接集群
- SQL文本在本地处理,无数据外发
- 无需凭证或身份验证
Workflow
工作流程
Step 1: Receive Input
步骤1:接收输入
Receive the SQL statement and check mode from the user. If no mode is specified, default to syntax + spec.
接收用户提供的SQL语句和检查模式。若未指定模式,默认使用语法+规范模式。
Step 2: Tokenization
步骤2:分词
Run the tokenizer to convert SQL text into a Token stream.
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_tokenizer.py "<sql_text>"The tokenizer supports:
- All 504 Doris keywords (from between
DorisLexer.g4and--DORIS-KEYWORD-LIST-START)--DORIS-KEYWORD-LIST-END - Doris-specific tokens: (
HINT),/*+ ... */(BACKQUOTED),`ident`(ARROW),->(NSEQnull-safe eq),<=>(EQor=),==(NEQor<>),!=(LTEor<=),!>(GTEor>=),!<(DOUBLEPIPES),||(LOGICALAND),&&(LOGICALNOT)! - Literals: strings (/
'...'), integers, decimals, bigints ("..."), smallints (123L), tinyints (123S), bigdecimals (123Y), exponents123BD - Backquoted identifiers: (Doris-style, preferred over double quotes)
`table_name` - Comment skipping (single line,
--multi-line, but/* */preserved as HINT token)/*+ hint */ - Full-text search operators: ,
MATCH_ALL,MATCH_ANY,MATCH_PHRASE,MATCH_PHRASE_PREFIX,MATCH_PHRASE_EDGE,MATCH_REGEXP,MATCH_NAMEMATCH_NAME_GLOB
运行分词器将SQL文本转换为Token流。
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_tokenizer.py "<sql_text>"分词器支持:
- 全部504个Doris关键字(来自中
DorisLexer.g4和--DORIS-KEYWORD-LIST-START之间的定义)--DORIS-KEYWORD-LIST-END - Doris专属Token:(
HINT)、/*+ ... */(BACKQUOTED)、`ident`(ARROW)、->(NSEQ空值安全等于)、<=>(EQ或=)、==(NEQ或<>)、!=(LTE或<=)、!>(GTE或>=)、!<(DOUBLEPIPES)、||(LOGICALAND)、&&(LOGICALNOT)! - 字面量:字符串(/
'...')、整数、小数、大整数("...")、小整数(123L)、微整数(123S)、大小数(123Y)、指数123BD - 反引号标识符:(Doris风格,优先于双引号)
`table_name` - 注释跳过(单行注释、
--多行注释,但/* */会保留为HINT Token)/*+ hint */ - 全文检索运算符:、
MATCH_ALL、MATCH_ANY、MATCH_PHRASE、MATCH_PHRASE_PREFIX、MATCH_PHRASE_EDGE、MATCH_REGEXP、MATCH_NAMEMATCH_NAME_GLOB
Step 3: Parsing
步骤3:解析
Run the parser to generate AST and detect syntax errors.
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_parser.py "<sql_text>"The parser supports major Doris statement types (based on ):
DorisParser.g4- DML: SELECT (with CTE, set ops, window, TABLESAMPLE), INSERT INTO/OVERWRITE TABLE, UPDATE, DELETE, LOAD (BROKER LOAD), EXPORT, COPY INTO, TRUNCATE
- DDL: CREATE TABLE (with DISTRIBUTED BY, PARTITION BY, KEY model, ENGINE, PROPERTIES), CREATE TABLE LIKE, CREATE VIEW, CREATE MTMV (Multi-Table Materialized View), CREATE INDEX (BITMAP/NGRAM_BF/INVERTED), ALTER TABLE (ADD/MODIFY/DROP/RENAME COLUMN, ADD/DROP PARTITION, ADD/DROP INDEX, ROLLUP, TAG/BRANCH), DROP TABLE/VIEW/INDEX, CREATE CATALOG, CREATE DATABASE, CREATE USER/ROLE, CREATE RESOURCE, CREATE STAGE, CREATE ENCRYPTKEY, CREATE JOB, CREATE ROW POLICY, CREATE SQL_BLOCK_RULE, CREATE STORAGE VAULT/POLICY, CREATE WORKLOAD GROUP/POLICY
- DCL: GRANT/REVOKE (table/resource/role privileges)
- TCL: BEGIN/START TRANSACTION, COMMIT, ROLLBACK
- Utility: EXPLAIN (PARSED/ANALYZED/REWRITTEN/LOGICAL/OPTIMIZED/PHYSICAL/SHAPE/MEMO/DISTRIBUTED/ALL, VERBOSE/TREE/GRAPH/PLAN), SET (variables/options), SHOW (50+ variants), DESC/DESCRIBE, ADMIN SET/SHOW (replica, frontend config, tablet diagnose, trash, TDE), KILL (CONNECTION/QUERY), CANCEL (LOAD/EXPORT/ALTER TABLE/BACKUP/RESTORE/WARM UP), BACKUP/RESTORE SNAPSHOT, RECOVER (DATABASE/TABLE/PARTITION), CLEAN (LABEL/PROFILE/QUERY STATS), INSTALL/UNINSTALL PLUGIN, LOCK/UNLOCK TABLES, WARM UP, SYNC, HELP, CALL PROCEDURE
Doris-specific syntax:
DISTRIBUTED BY {HASH(cols) | RANDOM} (BUCKETS n | AUTO)?- (auto partition, step partition, less-than, fixed, in-list)
PARTITION BY (RANGE | LIST)? ... (AUTO)? (DUPLICATE | AGGREGATE | UNIQUE) KEY (cols) (CLUSTER BY cols)?ENGINE = olap | mysql | elasticsearch | hive | hudi | iceberg | jdbc | ...PROPERTIES ('key'='value', ...)INSERT OVERWRITE TABLE ...LOAD LABEL ... (DATA INFILE (...) INTO TABLE ...)CREATE ROUTINE LOAD ... FROM type (...)EXPORT TABLE ... TO ...BACKUP SNAPSHOT ... TO repo (ON|EXCLUDE (...))?RESTORE SNAPSHOT ... FROM repo (ON|EXCLUDE (...))?EXPLAIN {PARSED|ANALYZED|REWRITTEN|LOGICAL|OPTIMIZED|PHYSICAL|SHAPE|MEMO|DISTRIBUTED|ALL} [VERBOSE|TREE|GRAPH|PLAN] [PROCESS]CREATE MATERIALIZED VIEW ... (DUPLICATE KEY ...)? PARTITION BY ... DISTRIBUTED BY ... AS query- ,
BUILD [IMMEDIATE|DEFERRED],REFRESH [COMPLETE|AUTO]ON [MANUAL|SCHEDULE|COMMIT]
TABLESAMPLE (...) (REPEATABLE n)?- (CTE; Doris does not require explicit RECURSIVE keyword)
WITH cte_name AS (...) - Window functions:
OVER (PARTITION BY ... ORDER BY ... ROWS/RANGE ...) OUTFILE 'path' (FORMAT AS ...)? (PROPERTIES (...))?- Hints: and
/*+ hint_name(...) */relation hints[hint_name] ALTER COLOCATE GROUP name SET (...)- Full-text search: ,
col MATCH_ALL '...',MATCH_PHRASE,MATCH_PHRASE_PREFIX,MATCH_PHRASE_EDGE,MATCH_ANYMATCH_REGEXP - Aggregate unions: ,
HLL_UNION,BITMAP_UNION,QUANTILE_UNIONREPLACE_IF_NOT_NULL - Doris data types: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, BOOLEAN, FLOAT, DOUBLE, DATE, DATETIME, DATEV2, DATETIMEV2, DATEV1, DATETIMEV1, BITMAP, QUANTILE_STATE, HLL, AGG_STATE, STRING, JSON, JSONB, TEXT, VARCHAR, CHAR, DECIMAL, DECIMALV2, DECIMALV3, IPV4, IPV6, ARRAY, MAP, STRUCT, VARIANT
运行解析器生成AST并检测语法错误。
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_parser.py "<sql_text>"解析器支持主要Doris语句类型(基于):
DorisParser.g4- DML:SELECT(包含CTE、集合操作、窗口函数、TABLESAMPLE)、INSERT INTO/OVERWRITE TABLE、UPDATE、DELETE、LOAD(BROKER LOAD)、EXPORT、COPY INTO、TRUNCATE
- DDL:CREATE TABLE(包含DISTRIBUTED BY、PARTITION BY、KEY模型、ENGINE、PROPERTIES)、CREATE TABLE LIKE、CREATE VIEW、CREATE MTMV(多表物化视图)、CREATE INDEX(BITMAP/NGRAM_BF/INVERTED)、ALTER TABLE(添加/修改/删除/重命名列、添加/删除分区、添加/删除索引、ROLLUP、TAG/BRANCH)、DROP TABLE/VIEW/INDEX、CREATE CATALOG、CREATE DATABASE、CREATE USER/ROLE、CREATE RESOURCE、CREATE STAGE、CREATE ENCRYPTKEY、CREATE JOB、CREATE ROW POLICY、CREATE SQL_BLOCK_RULE、CREATE STORAGE VAULT/POLICY、CREATE WORKLOAD GROUP/POLICY
- DCL:GRANT/REVOKE(表/资源/角色权限)
- TCL:BEGIN/START TRANSACTION、COMMIT、ROLLBACK
- 工具类:EXPLAIN(PARSED/ANALYZED/REWRITTEN/LOGICAL/OPTIMIZED/PHYSICAL/SHAPE/MEMO/DISTRIBUTED/ALL、VERBOSE/TREE/GRAPH/PLAN)、SET(变量/选项)、SHOW(50余种变体)、DESC/DESCRIBE、ADMIN SET/SHOW(副本、前端配置、 tablet诊断、回收站、TDE)、KILL(CONNECTION/QUERY)、CANCEL(LOAD/EXPORT/ALTER TABLE/BACKUP/RESTORE/WARM UP)、BACKUP/RESTORE SNAPSHOT、RECOVER(DATABASE/TABLE/PARTITION)、CLEAN(LABEL/PROFILE/QUERY STATS)、INSTALL/UNINSTALL PLUGIN、LOCK/UNLOCK TABLES、WARM UP、SYNC、HELP、CALL PROCEDURE
Doris专属语法:
DISTRIBUTED BY {HASH(cols) | RANDOM} (BUCKETS n | AUTO)?- (自动分区、步进分区、小于值分区、固定分区、列表分区)
PARTITION BY (RANGE | LIST)? ... (AUTO)? (DUPLICATE | AGGREGATE | UNIQUE) KEY (cols) (CLUSTER BY cols)?ENGINE = olap | mysql | elasticsearch | hive | hudi | iceberg | jdbc | ...PROPERTIES ('key'='value', ...)INSERT OVERWRITE TABLE ...LOAD LABEL ... (DATA INFILE (...) INTO TABLE ...)CREATE ROUTINE LOAD ... FROM type (...)EXPORT TABLE ... TO ...BACKUP SNAPSHOT ... TO repo (ON|EXCLUDE (...))?RESTORE SNAPSHOT ... FROM repo (ON|EXCLUDE (...))?EXPLAIN {PARSED|ANALYZED|REWRITTEN|LOGICAL|OPTIMIZED|PHYSICAL|SHAPE|MEMO|DISTRIBUTED|ALL} [VERBOSE|TREE|GRAPH|PLAN] [PROCESS]CREATE MATERIALIZED VIEW ... (DUPLICATE KEY ...)? PARTITION BY ... DISTRIBUTED BY ... AS query- ,
BUILD [IMMEDIATE|DEFERRED],REFRESH [COMPLETE|AUTO]ON [MANUAL|SCHEDULE|COMMIT]
TABLESAMPLE (...) (REPEATABLE n)?- (CTE;Doris不需要显式RECURSIVE关键字)
WITH cte_name AS (...) - 窗口函数:
OVER (PARTITION BY ... ORDER BY ... ROWS/RANGE ...) OUTFILE 'path' (FORMAT AS ...)? (PROPERTIES (...))?- Hint:和
/*+ hint_name(...) */关联Hint[hint_name] ALTER COLOCATE GROUP name SET (...)- 全文检索:,
col MATCH_ALL '...',MATCH_PHRASE,MATCH_PHRASE_PREFIX,MATCH_PHRASE_EDGE,MATCH_ANYMATCH_REGEXP - 聚合合并函数:,
HLL_UNION,BITMAP_UNION,QUANTILE_UNIONREPLACE_IF_NOT_NULL - Doris数据类型:TINYINT, SMALLINT, INT, BIGINT, LARGEINT, BOOLEAN, FLOAT, DOUBLE, DATE, DATETIME, DATEV2, DATETIMEV2, DATEV1, DATETIMEV1, BITMAP, QUANTILE_STATE, HLL, AGG_STATE, STRING, JSON, JSONB, TEXT, VARCHAR, CHAR, DECIMAL, DECIMALV2, DECIMALV3, IPV4, IPV6, ARRAY, MAP, STRUCT, VARIANT
Step 4: Syntax Check
步骤4:语法检查
Based on tokenization and parsing results, execute syntax check rules.
Syntax Check Rules (34 rules):
| Rule ID | Name | Level | Description |
|---|---|---|---|
| SYN-ERR | Lexical Error | ERROR | Unrecognized characters in SQL text |
| SYN001 | Invalid Keyword | ERROR | Keyword not supported by Doris (not in 504-keyword list) |
| SYN002 | Reserved Keyword as Identifier | ERROR | Reserved keyword used as identifier without backticks |
| SYN003 | Syntax Structure Error | ERROR | Missing required clause or keyword |
| SYN004 | Clause Ordering Error | ERROR | SQL clause order does not conform to grammar |
| SYN005 | DISTRIBUTED BY Syntax Error | ERROR | Invalid distribution strategy (only HASH/RANDOM supported) |
| SYN006 | PARTITION BY Syntax Error | ERROR | Invalid partition definition (RANGE/LIST/AUTO) |
| SYN007 | BUCKETS Syntax Error | ERROR | Invalid BUCKETS clause (must be INTEGER or AUTO) |
| SYN008 | EXPLAIN planType Syntax Error | ERROR | Invalid EXPLAIN plan type (PARSED/ANALYZED/REWRITTEN/LOGICAL/OPTIMIZED/PHYSICAL/SHAPE/MEMO/DISTRIBUTED/ALL) |
| SYN009 | KEY Model Syntax Error | ERROR | Invalid data model (DUPLICATE/AGGREGATE/UNIQUE KEY) |
| SYN010 | PROPERTIES Syntax Error | ERROR | Invalid PROPERTIES clause structure |
| SYN011 | ENGINE Syntax Error | ERROR | Invalid ENGINE clause |
| SYN012 | INSERT OVERWRITE Syntax Error | ERROR | Invalid INSERT OVERWRITE TABLE structure |
| SYN013 | LOAD Syntax Error | ERROR | Invalid LOAD LABEL / BROKER LOAD structure |
| SYN014 | ROUTINE LOAD Syntax Error | ERROR | Invalid CREATE ROUTINE LOAD structure |
| SYN015 | EXPORT Syntax Error | ERROR | Invalid EXPORT TABLE ... TO structure |
| SYN016 | BACKUP/RESTORE SNAPSHOT Syntax Error | ERROR | Invalid BACKUP/RESTORE SNAPSHOT structure |
| SYN017 | CREATE MTMV Syntax Error | ERROR | Invalid CREATE MATERIALIZED VIEW structure |
| SYN018 | CREATE CATALOG Syntax Error | ERROR | Invalid CREATE CATALOG structure |
| SYN019 | CREATE USER/ROLE Syntax Error | ERROR | Invalid CREATE USER/ROLE structure |
| SYN020 | CREATE ROW POLICY Syntax Error | ERROR | Invalid CREATE ROW POLICY structure |
| SYN021 | CREATE SQL_BLOCK_RULE Syntax Error | ERROR | Invalid CREATE SQL_BLOCK_RULE structure |
| SYN022 | CREATE STAGE Syntax Error | ERROR | Invalid CREATE STAGE structure |
| SYN023 | CREATE JOB Syntax Error | ERROR | Invalid CREATE JOB ON SCHEDULE structure |
| SYN024 | CREATE ENCRYPTKEY Syntax Error | ERROR | Invalid CREATE ENCRYPTKEY structure |
| SYN025 | ADMIN SET/SHOW Syntax Error | ERROR | Invalid ADMIN statement structure |
| SYN026 | CANCEL Syntax Error | ERROR | Invalid CANCEL statement (LOAD/EXPORT/ALTER/BACKUP/RESTORE/WARM UP) |
| SYN027 | KILL Syntax Error | ERROR | Invalid KILL (CONNECTION/QUERY) statement |
| SYN028 | TABLESAMPLE Syntax Error | ERROR | Invalid TABLESAMPLE clause (PERCENT/ROWS, REPEATABLE) |
| SYN029 | OUTFILE Syntax Error | ERROR | Invalid OUTFILE clause (FORMAT AS, PROPERTIES) |
| SYN030 | Hint Syntax Error | WARNING | Invalid hint format (must be |
| SYN031 | Full-text MATCH Syntax Error | ERROR | Invalid MATCH_ALL/MATCH_ANY/MATCH_PHRASE/MATCH_REGEXP usage |
| SYN032 | COLOCATE GROUP Syntax Error | ERROR | Invalid ALTER COLOCATE GROUP structure |
| SYN033 | GRANT/REVOKE Syntax Error | ERROR | Invalid GRANT/REVOKE privilege structure |
基于分词和解析结果,执行语法检查规则。
语法检查规则(34条):
| 规则ID | 名称 | 级别 | 描述 |
|---|---|---|---|
| SYN-ERR | 词法错误 | ERROR | SQL文本中存在无法识别的字符 |
| SYN001 | 无效关键字 | ERROR | Doris不支持的关键字(不在504个关键字列表中) |
| SYN002 | 保留关键字用作标识符 | ERROR | 保留关键字未加反引号直接用作标识符 |
| SYN003 | 语法结构错误 | ERROR | 缺少必填子句或关键字 |
| SYN004 | 子句顺序错误 | ERROR | SQL子句顺序不符合语法规范 |
| SYN005 | DISTRIBUTED BY语法错误 | ERROR | 无效的分布策略(仅支持HASH/RANDOM) |
| SYN006 | PARTITION BY语法错误 | ERROR | 无效的分区定义(RANGE/LIST/AUTO) |
| SYN007 | BUCKETS语法错误 | ERROR | 无效的BUCKETS子句(必须为整数或AUTO) |
| SYN008 | EXPLAIN planType语法错误 | ERROR | 无效的EXPLAIN计划类型(PARSED/ANALYZED/REWRITTEN/LOGICAL/OPTIMIZED/PHYSICAL/SHAPE/MEMO/DISTRIBUTED/ALL) |
| SYN009 | KEY模型语法错误 | ERROR | 无效的数据模型(DUPLICATE/AGGREGATE/UNIQUE KEY) |
| SYN010 | PROPERTIES语法错误 | ERROR | 无效的PROPERTIES子句结构 |
| SYN011 | ENGINE语法错误 | ERROR | 无效的ENGINE子句 |
| SYN012 | INSERT OVERWRITE语法错误 | ERROR | 无效的INSERT OVERWRITE TABLE结构 |
| SYN013 | LOAD语法错误 | ERROR | 无效的LOAD LABEL / BROKER LOAD结构 |
| SYN014 | ROUTINE LOAD语法错误 | ERROR | 无效的CREATE ROUTINE LOAD结构 |
| SYN015 | EXPORT语法错误 | ERROR | 无效的EXPORT TABLE ... TO结构 |
| SYN016 | BACKUP/RESTORE SNAPSHOT语法错误 | ERROR | 无效的BACKUP/RESTORE SNAPSHOT结构 |
| SYN017 | CREATE MTMV语法错误 | ERROR | 无效的CREATE MATERIALIZED VIEW结构 |
| SYN018 | CREATE CATALOG语法错误 | ERROR | 无效的CREATE CATALOG结构 |
| SYN019 | CREATE USER/ROLE语法错误 | ERROR | 无效的CREATE USER/ROLE结构 |
| SYN020 | CREATE ROW POLICY语法错误 | ERROR | 无效的CREATE ROW POLICY结构 |
| SYN021 | CREATE SQL_BLOCK_RULE语法错误 | ERROR | 无效的CREATE SQL_BLOCK_RULE结构 |
| SYN022 | CREATE STAGE语法错误 | ERROR | 无效的CREATE STAGE结构 |
| SYN023 | CREATE JOB语法错误 | ERROR | 无效的CREATE JOB ON SCHEDULE结构 |
| SYN024 | CREATE ENCRYPTKEY语法错误 | ERROR | 无效的CREATE ENCRYPTKEY结构 |
| SYN025 | ADMIN SET/SHOW语法错误 | ERROR | 无效的ADMIN语句结构 |
| SYN026 | CANCEL语法错误 | ERROR | 无效的CANCEL语句(LOAD/EXPORT/ALTER/BACKUP/RESTORE/WARM UP) |
| SYN027 | KILL语法错误 | ERROR | 无效的KILL (CONNECTION/QUERY)语句 |
| SYN028 | TABLESAMPLE语法错误 | ERROR | 无效的TABLESAMPLE子句(PERCENT/ROWS、REPEATABLE) |
| SYN029 | OUTFILE语法错误 | ERROR | 无效的OUTFILE子句(FORMAT AS、PROPERTIES) |
| SYN030 | Hint语法错误 | WARNING | 无效的Hint格式(必须为 |
| SYN031 | 全文检索MATCH语法错误 | ERROR | 无效的MATCH_ALL/MATCH_ANY/MATCH_PHRASE/MATCH_REGEXP用法 |
| SYN032 | COLOCATE GROUP语法错误 | ERROR | 无效的ALTER COLOCATE GROUP结构 |
| SYN033 | GRANT/REVOKE语法错误 | ERROR | 无效的GRANT/REVOKE权限结构 |
Step 5: Specification Check
步骤5:规范检查
Based on AST and Token stream, execute specification check rules. Rules are derived from grammar definitions and Apache Doris development best practices.
DorisParser.g4Specification Check Rules (46 rules):
| Rule ID | Name | Level | Category | Description |
|---|---|---|---|---|
| SPEC001 | Missing DISTRIBUTED BY | ERROR | Object Design | CREATE TABLE without distribution strategy (Doris requires DISTRIBUTED BY HASH or RANDOM) |
| SPEC002 | Missing ENGINE | INFO | Object Design | CREATE TABLE without explicit ENGINE (defaults to OLAP) |
| SPEC003 | SELECT * Prohibited | ERROR | Data Operation | Query must specify explicit column list |
| SPEC004 | DELETE/UPDATE without WHERE | ERROR | Data Operation | DML must include WHERE condition |
| SPEC005 | NOT IN Subquery | WARNING | Data Operation | Recommend NOT EXISTS or LEFT JOIN ... IS NULL |
| SPEC006 | DISTINCT Performance | INFO | Data Operation | DISTINCT may impact performance |
| SPEC007 | Implicit Type Conversion | WARNING | Data Operation | May cause index/zone-map invalidation |
| SPEC008 | LIKE Leading Wildcard | WARNING | Data Operation | Cannot use zone-map or index |
| SPEC009 | OR Condition | INFO | Data Operation | May impact execution plan |
| SPEC010 | IN List Too Long | WARNING | Data Operation | >1000 values recommend temp table |
| SPEC011 | FROM Subquery | INFO | Data Operation | Recommend CTE instead |
| SPEC012 | Cartesian Product | ERROR | Data Operation | Multi-table missing JOIN condition |
| SPEC013 | INSERT Missing Column List | WARNING | Data Operation | Relies on default column order |
| SPEC014 | Missing Table Comment | INFO | Object Design | Table without COMMENT |
| SPEC015 | Table Naming Convention | WARNING | Naming | Should use lowercase with underscores |
| SPEC016 | Column Naming Convention | WARNING | Naming | Should use lowercase with underscores |
| SPEC017 | Reserved Keyword as Identifier | ERROR | Naming | May cause syntax ambiguity |
| SPEC018 | Distribution Key Column Not Found | WARNING | Object Design | Distribution key should be actual table column |
| SPEC019 | Partition Key Same as Distribution Key | INFO | Object Design | May cause data skew |
| SPEC020 | Missing KEY Model Definition | INFO | Object Design | Recommend explicit DUPLICATE/AGGREGATE/UNIQUE KEY |
| SPEC021 | Large Table Should Have Partition | INFO | Object Design | Improve query and governance efficiency |
| SPEC022 | BUCKETS Count Recommendation | INFO | Object Design | Recommend appropriate bucket count for table size |
| SPEC023 | Column Should Have NOT NULL | INFO | Object Design | Optimizer can leverage NOT NULL |
| SPEC024 | DROP Should Use IF EXISTS | WARNING | SQL Dev | Prevent error when object not found |
| SPEC025 | INSERT Multi-VALUES | WARNING | SQL Dev | Multiple VALUES groups inefficient; use STREAM LOAD / BROKER LOAD |
| SPEC026 | Column-store Real-time INSERT | WARNING | SQL Dev | Frequent small-batch INSERT into Doris (columnar) causes compaction pressure |
| SPEC027 | Frequent UPDATE/DELETE | WARNING | SQL Dev | Doris UPDATE/DELETE is costly (read-merge-write) |
| SPEC028 | Function on Filter Column | WARNING | SQL Dev | Affects statistics accuracy and zone-map usage |
| SPEC029 | Large Table COUNT | WARNING | SQL Dev | Full table scan I/O cost |
| SPEC030 | Query Should Use LIMIT | INFO | SQL Dev | Avoid oversized result sets |
| SPEC031 | CTE Recursion Safety | WARNING | SQL Dev | Ensure termination condition for recursive CTE |
| SPEC032 | Use Catalog/DB Prefix | INFO | SQL Dev | Avoid ambiguity in multi-catalog scenarios |
| SPEC033 | View Nesting Depth ≤ 3 | INFO | Object Design | Requires cluster: query view dependencies |
| SPEC034 | Index Count > 5 | WARNING | Object Design | Requires cluster: query table indexes |
| SPEC035 | Non-pushdown SQL Prohibited | ERROR | SQL Dev | Requires cluster: EXPLAIN analysis |
| SPEC036 | BITMAP/HLL Column Needs Aggregation Type | WARNING | Object Design | BITMAP/HLL columns should specify BITMAP_UNION/HLL_UNION |
| SPEC037 | Use MTMV for Repeated Complex Queries | INFO | Object Design | Recommend MTMV for repeated aggregation queries |
| SPEC038 | Avoid Frequent OUTFILE Export | INFO | SQL Dev | Use EXPORT or broker for large exports |
| SPEC039 | VARCHAR Length Should Be Explicit | WARNING | Object Design | Avoid VARCHAR without length for large strings |
| SPEC040 | DECIMAL Precision Should Be Explicit | WARNING | Object Design | Use DECIMAL(p,s) or DECIMALV3(p,s), avoid bare DECIMAL |
| SPEC041 | COUNT(DISTINCT) Excessive Use | ERROR | Complex Query Limit | COUNT(DISTINCT) count > 5, may cause severe performance degradation |
| SPEC042 | NOT IN Subquery Prohibited | ERROR | Complex Query Limit | NOT IN subquery causes full scan and severe performance drop; use NOT EXISTS or LEFT JOIN |
| SPEC043 | Excessive JOINs | ERROR | Complex Query Limit | JOIN count > 20, may cause unstable query plans and high memory usage |
| SPEC044 | Excessive UNION ALLs | ERROR | Complex Query Limit | UNION ALL count > 20, may cause complex plans and high resource consumption |
| SPEC045 | Deeply Nested Subqueries | ERROR | Complex Query Limit | Subquery nesting depth > 20, may cause severe parse and execution performance issues |
| SPEC046 | SQL Statement Too Long | ERROR | Complex Query Limit | SQL text length > 2MB, may cause parse timeout or excessive memory usage |
基于AST和Token流,执行规范检查规则。规则源自语法定义和Apache Doris开发最佳实践。
DorisParser.g4规范检查规则(46条):
| 规则ID | 名称 | 级别 | 分类 | 描述 |
|---|---|---|---|---|
| SPEC001 | 缺少DISTRIBUTED BY | ERROR | 对象设计 | CREATE TABLE语句未指定分布策略(Doris要求使用DISTRIBUTED BY HASH或RANDOM) |
| SPEC002 | 缺少ENGINE | INFO | 对象设计 | CREATE TABLE语句未显式指定ENGINE(默认值为OLAP) |
| SPEC003 | 禁止使用SELECT * | ERROR | 数据操作 | 查询必须指定明确的列列表 |
| SPEC004 | DELETE/UPDATE语句缺少WHERE条件 | ERROR | 数据操作 | DML语句必须包含WHERE条件 |
| SPEC005 | NOT IN子查询 | WARNING | 数据操作 | 推荐使用NOT EXISTS或LEFT JOIN ... IS NULL替代 |
| SPEC006 | DISTINCT性能影响 | INFO | 数据操作 | DISTINCT可能影响性能 |
| SPEC007 | 隐式类型转换 | WARNING | 数据操作 | 可能导致索引/分区裁剪失效 |
| SPEC008 | LIKE前缀使用通配符 | WARNING | 数据操作 | 无法使用分区裁剪或索引 |
| SPEC009 | OR条件 | INFO | 数据操作 | 可能影响执行计划 |
| SPEC010 | IN列表过长 | WARNING | 数据操作 | 超过1000个值时推荐使用临时表 |
| SPEC011 | FROM子查询 | INFO | 数据操作 | 推荐使用CTE替代 |
| SPEC012 | 笛卡尔积 | ERROR | 数据操作 | 多表查询缺少JOIN条件 |
| SPEC013 | INSERT语句缺少列列表 | WARNING | 数据操作 | 依赖默认列顺序,存在风险 |
| SPEC014 | 缺少表注释 | INFO | 对象设计 | 表未添加COMMENT注释 |
| SPEC015 | 表命名规范 | WARNING | 命名规范 | 应使用小写字母加下划线格式 |
| SPEC016 | 列命名规范 | WARNING | 命名规范 | 应使用小写字母加下划线格式 |
| SPEC017 | 保留关键字用作标识符 | ERROR | 命名规范 | 可能导致语法歧义 |
| SPEC018 | 分布键列不存在 | WARNING | 对象设计 | 分布键应为表中实际存在的列 |
| SPEC019 | 分区键与分布键相同 | INFO | 对象设计 | 可能导致数据倾斜 |
| SPEC020 | 缺少KEY模型定义 | INFO | 对象设计 | 推荐显式指定DUPLICATE/AGGREGATE/UNIQUE KEY |
| SPEC021 | 大表应设置分区 | INFO | 对象设计 | 提升查询和治理效率 |
| SPEC022 | BUCKETS数量建议 | INFO | 对象设计 | 根据表大小推荐合适的分桶数 |
| SPEC023 | 列应设置NOT NULL约束 | INFO | 对象设计 | 优化器可利用NOT NULL约束提升性能 |
| SPEC024 | DROP语句应使用IF EXISTS | WARNING | SQL开发 | 避免对象不存在时触发错误 |
| SPEC025 | INSERT多VALUES语句 | WARNING | SQL开发 | 多组VALUES效率低下;推荐使用STREAM LOAD / BROKER LOAD |
| SPEC026 | 列存表实时INSERT | WARNING | SQL开发 | 频繁小批量INSERT到Doris列存表会导致压缩压力 |
| SPEC027 | 频繁执行UPDATE/DELETE | WARNING | SQL开发 | Doris的UPDATE/DELETE操作成本较高(读-合并-写流程) |
| SPEC028 | 过滤列使用函数 | WARNING | SQL开发 | 影响统计信息准确性和分区裁剪使用 |
| SPEC029 | 大表COUNT查询 | WARNING | SQL开发 | 全表扫描I/O成本高 |
| SPEC030 | 查询应使用LIMIT | INFO | SQL开发 | 避免返回过大的结果集 |
| SPEC031 | CTE递归安全性 | WARNING | SQL开发 | 确保递归CTE有终止条件 |
| SPEC032 | 使用Catalog/DB前缀 | INFO | SQL开发 | 避免多Catalog场景下的歧义 |
| SPEC033 | 视图嵌套深度≤3 | INFO | 对象设计 | 需要集群:查询视图依赖关系 |
| SPEC034 | 索引数量>5 | WARNING | 对象设计 | 需要集群:查询表索引信息 |
| SPEC035 | 禁止非下推SQL | ERROR | SQL开发 | 需要集群:通过EXPLAIN分析验证 |
| SPEC036 | BITMAP/HLL列需指定聚合类型 | WARNING | 对象设计 | BITMAP/HLL列应指定BITMAP_UNION/HLL_UNION聚合函数 |
| SPEC037 | 重复复杂查询使用MTMV | INFO | 对象设计 | 推荐使用MTMV处理重复聚合查询 |
| SPEC038 | 避免频繁使用OUTFILE导出 | INFO | SQL开发 | 大数据导出推荐使用EXPORT或broker方式 |
| SPEC039 | VARCHAR长度应显式指定 | WARNING | 对象设计 | 避免未指定长度的VARCHAR存储大字符串 |
| SPEC040 | DECIMAL精度应显式指定 | WARNING | 对象设计 | 使用DECIMAL(p,s)或DECIMALV3(p,s),避免使用裸DECIMAL |
| SPEC041 | 过度使用COUNT(DISTINCT) | ERROR | 复杂查询限制 | COUNT(DISTINCT)数量>5,可能导致严重性能下降 |
| SPEC042 | 禁止使用NOT IN子查询 | ERROR | 复杂查询限制 | NOT IN子查询会导致全表扫描和严重性能下降;推荐使用NOT EXISTS或LEFT JOIN |
| SPEC043 | JOIN数量过多 | ERROR | 复杂查询限制 | JOIN数量>20,可能导致查询计划不稳定和内存占用过高 |
| SPEC044 | UNION ALL数量过多 | ERROR | 复杂查询限制 | UNION ALL数量>20,可能导致计划复杂和资源消耗过高 |
| SPEC045 | 子查询嵌套过深 | ERROR | 复杂查询限制 | 子查询嵌套深度>20,可能导致严重的解析和执行性能问题 |
| SPEC046 | SQL语句过长 | ERROR | 复杂查询限制 | SQL文本长度>2MB,可能导致解析超时或内存占用过高 |
Step 6: Generate Report
步骤6:生成报告
Use the check engine to generate a Markdown format report:
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_checker.py "<sql_text>" allReport format:
markdown
undefined使用检查引擎生成Markdown格式的报告:
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_checker.py "<sql_text>" all报告格式:
markdown
undefinedDoris SQL Check Report
Doris SQL检查报告
Check Time: 2026-07-17T10:00:00
Statement Type: SELECT
Check Mode: all
检查时间: 2026-07-17T10:00:00
语句类型: SELECT
检查模式: all
Summary
摘要
| Metric | Value |
|---|---|
| Total Rules | 74 |
| Passed | 71 |
| Violations | 3 |
| Errors (ERROR) | 1 |
| Warnings (WARNING) | 1 |
| Infos (INFO) | 1 |
| 指标 | 数值 |
|---|---|
| 总规则数 | 74 |
| 通过数 | 71 |
| 违规数 | 3 |
| 错误(ERROR) | 1 |
| 警告(WARNING) | 1 |
| 提示(INFO) | 1 |
Syntax Check
语法检查
[X] SYN003: Syntax Structure Error
[X] SYN003: 语法结构错误
- Level: ERROR
- Position: Line 1, Column 15
- Description: Missing FROM clause
- Fix Suggestion: Add FROM table_name
- 级别: ERROR
- 位置: 第1行,第15列
- 描述: 缺少FROM子句
- 修复建议: 添加FROM table_name
Specification Check
规范检查
[!] SPEC003: SELECT * Prohibited
[!] SPEC003: 禁止使用SELECT *
- Level: WARNING
- Position: Line 1, Column 8
- Description: Query uses SELECT *, should specify explicit column list
- Fix Suggestion: Replace SELECT * with specific column list
undefined- 级别: WARNING
- 位置: 第1行,第8列
- 描述: 查询使用了SELECT *,应指定明确的列列表
- 修复建议: 将SELECT *替换为具体列列表
undefinedCore Commands
核心命令
doris_sql_checker.py
doris_sql_parser.py
doris_sql_tokenizer.py
doris_sql_checker.py
doris_sql_parser.py
doris_sql_tokenizer.py
Parameters
参数
| Parameter | Required/Optional | Description | Default |
|---|---|---|---|
| Required | SQL statement to check | N/A |
| Optional | Check mode: syntax/spec/all | syntax+spec |
| 参数名 | 必填/可选 | 描述 | 默认值 |
|---|---|---|---|
| 必填 | 待检查的SQL语句 | 无 |
| 可选 | 检查模式:syntax/spec/all | syntax+spec |
Output Format
输出格式
The check report is output in Markdown format, containing:
- Summary table: Total rules, passed, violations by level
- Syntax check section: Violations from syntax rules (SYN-ERR, SYN001-SYN033)
- Specification check section: Violations from specification rules (SPEC001-SPEC040)
- Original SQL: The checked SQL statement
Each violation entry includes: rule ID, rule name, level, position (line/column), description, code snippet, and fix suggestion.
检查报告以Markdown格式输出,包含:
- 摘要表格: 总规则数、通过数、各级别违规数
- 语法检查章节: 语法规则违规情况(SYN-ERR、SYN001-SYN033)
- 规范检查章节: 规范规则违规情况(SPEC001-SPEC040)
- 原始SQL: 被检查的SQL语句
每个违规条目包含:规则ID、规则名称、级别、位置(行/列)、描述、代码片段和修复建议。
Quick Check Command
快速检查命令
For simple SQL checks, run directly:
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_checker.py "<sql_text>" [syntax|spec|all]Output is in JSON format. For Markdown format report, call in Python:
python
from doris_sql_checker import check_sql_markdown
report = check_sql_markdown("SELECT * FROM t1", "all")
print(report)对于简单SQL检查,可直接运行:
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_checker.py "<sql_text>" [syntax|spec|all]输出为JSON格式。如需Markdown格式报告,可通过Python调用:
python
from doris_sql_checker import check_sql_markdown
report = check_sql_markdown("SELECT * FROM t1", "all")
print(report)Best Practices
最佳实践
- Run syntax check first to catch basic errors, then spec check for deeper analysis
- For CREATE TABLE statements, always include or
DISTRIBUTED BY HASH(分布键)to avoid SPEC001DISTRIBUTED BY RANDOM - For Doris tables, explicitly specify the KEY model (/
DUPLICATE KEY/AGGREGATE KEY)UNIQUE KEY - Use mode for comprehensive checking
all - Rules marked with or "Requires cluster" (SPEC033, SPEC034, SPEC035) need cluster connection and are skipped in static mode
requires_mcp: true - Doris does NOT support or
MERGE INTO ... WHEN MATCHED— these will be flagged as syntax errorsON DUPLICATE KEY UPDATE - Doris identifiers use backticks (), not double quotes — using double quotes for identifiers will trigger a warning
` - For large data loading, prefer STREAM LOAD / BROKER LOAD / ROUTINE LOAD over multi-row INSERT VALUES (SPEC025)
- 先运行语法检查捕获基础错误,再执行规范检查进行深度分析
- 对于CREATE TABLE语句,务必包含或
DISTRIBUTED BY HASH(分布键),避免触发SPEC001违规DISTRIBUTED BY RANDOM - 对于Doris表,显式指定KEY模型(/
DUPLICATE KEY/AGGREGATE KEY)UNIQUE KEY - 使用模式进行全面检查
all - 标记为或“需要集群”的规则(SPEC033、SPEC034、SPEC035)需要连接集群,静态模式下会被跳过
requires_mcp: true - Doris不支持或
MERGE INTO ... WHEN MATCHED—— 这些语句会被标记为语法错误ON DUPLICATE KEY UPDATE - Doris标识符使用反引号(),而非双引号 —— 使用双引号作为标识符会触发警告
` - 对于大数据加载,优先使用STREAM LOAD / BROKER LOAD / ROUTINE LOAD,而非多行INSERT VALUES(SPEC025)
References
参考文档
| Document | Description |
|---|---|
| AST Schema | AST node type definitions for Doris SQL |
| Syntax Rules | 34 syntax check rule definitions |
| Specification Rules | 40 specification check rule definitions |
| Performance Rules | 11 performance check rule definitions (requires cluster) |
| Keywords | 504 Doris SQL keyword definitions (from DorisLexer.g4) |
| Grammar Rules | 100+ Doris statement type grammar definitions (from DorisParser.g4) |
| 文档 | 描述 |
|---|---|
| AST Schema | Doris SQL的AST节点类型定义 |
| Syntax Rules | 34条语法检查规则定义 |
| Specification Rules | 40条规范检查规则定义 |
| Performance Rules | 11条性能检查规则定义(需要连接集群) |
| Keywords | 504个Doris SQL关键字定义(来自DorisLexer.g4) |
| Grammar Rules | 100余种Doris语句类型的语法定义(来自DorisParser.g4) |
Notes
注意事项
- Syntax and specification checks do not require cluster connection, can run offline
- Rules marked "Requires cluster" (SPEC033, SPEC034, SPEC035) are skipped in static mode
- Performance rules (PERF001-PERF011) are defined in rules/perf_rules.yaml but require cluster connection for execution (EXPLAIN ANALYZE, system tables like ,
information_schema.tables, etc.)backends - Doris-specific syntax checking (DISTRIBUTED BY, PARTITION BY, BUCKETS, PROPERTIES, ENGINE, DUPLICATE/AGGREGATE/UNIQUE KEY, INSERT OVERWRITE, LOAD, EXPORT, MTMV, BACKUP/RESTORE, ADMIN, CANCEL, KILL, TABLESAMPLE, OUTFILE, Hint, MATCH, COLOCATE GROUP) is based on (Nereids ANTLR4 grammar) from Doris 3.1.4 source
DorisParser.g4 - The check engine includes a custom tokenizer and recursive descent parser, no external SQL parsing libraries required (no ANTLR runtime needed)
- Version compatibility: This skill is based on Doris 3.1.4 grammar. Doris 2.1.x / 3.0.x / 3.1.x / 4.x share the same Nereids grammar for most constructs; minor differences may exist for newer syntax (e.g., 4.x added features). Verify against your cluster's version before relying on specific rules.
- 语法和规范检查无需连接集群,可离线运行
- 标记为“需要集群”的规则(SPEC033、SPEC034、SPEC035)在静态模式下会被跳过
- 性能规则(PERF001-PERF011)定义在rules/perf_rules.yaml中,但需要连接集群才能执行(依赖EXPLAIN ANALYZE、system表如、
information_schema.tables等)backends - Doris专属语法检查(DISTRIBUTED BY、PARTITION BY、BUCKETS、PROPERTIES、ENGINE、DUPLICATE/AGGREGATE/UNIQUE KEY、INSERT OVERWRITE、LOAD、EXPORT、MTMV、BACKUP/RESTORE、ADMIN、CANCEL、KILL、TABLESAMPLE、OUTFILE、Hint、MATCH、COLOCATE GROUP)基于Doris 3.1.4源码中的(Nereids ANTLR4语法)
DorisParser.g4 - 检查引擎包含自定义分词器和递归下降解析器,无需依赖外部SQL解析库(无需ANTLR运行时)
- 版本兼容性:本技能基于Doris 3.1.4语法开发。Doris 2.1.x / 3.0.x / 3.1.x / 4.x的大多数语法结构共享相同的Nereids语法;新版本语法可能存在细微差异(如4.x新增特性)。在依赖特定规则前,请与你的集群版本进行验证。