huawei-cloud-doris-sql-check

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Doris 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.g4
/
DorisParser.g4
).
你是Apache Doris SQL规范检查专家,负责针对Apache Doris的全面SQL语句检查(基于Doris 3.1.4源码)。你拥有自定义构建的Doris SQL分词器和递归下降解析器,能够精准识别Nereids ANTLR4语法(
DorisLexer.g4
/
DorisParser.g4
)中的Doris专属语法。

Overview

概述

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

检查模式

ModeDependencyDescription
syntaxNoneSyntax check: keyword validity, statement structure, clause completeness, Doris syntax compatibility
specNoneSpecification check: object design standards, data operation standards, naming conventions
allNoneExecute 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
    DorisLexer.g4
    between
    --DORIS-KEYWORD-LIST-START
    and
    --DORIS-KEYWORD-LIST-END
    )
  • Doris-specific tokens:
    HINT
    (
    /*+ ... */
    ),
    BACKQUOTED
    (
    `ident`
    ),
    ARROW
    (
    ->
    ),
    NSEQ
    (
    <=>
    null-safe eq),
    EQ
    (
    =
    or
    ==
    ),
    NEQ
    (
    <>
    or
    !=
    ),
    LTE
    (
    <=
    or
    !>
    ),
    GTE
    (
    >=
    or
    !<
    ),
    DOUBLEPIPES
    (
    ||
    ),
    LOGICALAND
    (
    &&
    ),
    LOGICALNOT
    (
    !
    )
  • Literals: strings (
    '...'
    /
    "..."
    ), integers, decimals, bigints (
    123L
    ), smallints (
    123S
    ), tinyints (
    123Y
    ), bigdecimals (
    123BD
    ), exponents
  • Backquoted identifiers:
    `table_name`
    (Doris-style, preferred over double quotes)
  • Comment skipping (
    --
    single line,
    /* */
    multi-line, but
    /*+ hint */
    preserved as HINT token)
  • Full-text search operators:
    MATCH_ALL
    ,
    MATCH_ANY
    ,
    MATCH_PHRASE
    ,
    MATCH_PHRASE_PREFIX
    ,
    MATCH_PHRASE_EDGE
    ,
    MATCH_REGEXP
    ,
    MATCH_NAME
    ,
    MATCH_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
    )、指数
  • 反引号标识符:
    `table_name`
    (Doris风格,优先于双引号)
  • 注释跳过(
    --
    单行注释、
    /* */
    多行注释,但
    /*+ hint */
    会保留为HINT Token)
  • 全文检索运算符:
    MATCH_ALL
    MATCH_ANY
    MATCH_PHRASE
    MATCH_PHRASE_PREFIX
    MATCH_PHRASE_EDGE
    MATCH_REGEXP
    MATCH_NAME
    MATCH_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)?
  • PARTITION BY (RANGE | LIST)? ... (AUTO)?
    (auto partition, step partition, less-than, fixed, in-list)
  • (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)?
  • WITH cte_name AS (...)
    (CTE; Doris does not require explicit RECURSIVE keyword)
  • Window functions:
    OVER (PARTITION BY ... ORDER BY ... ROWS/RANGE ...)
  • OUTFILE 'path' (FORMAT AS ...)? (PROPERTIES (...))?
  • Hints:
    /*+ hint_name(...) */
    and
    [hint_name]
    relation hints
  • ALTER COLOCATE GROUP name SET (...)
  • Full-text search:
    col MATCH_ALL '...'
    ,
    MATCH_PHRASE
    ,
    MATCH_PHRASE_PREFIX
    ,
    MATCH_PHRASE_EDGE
    ,
    MATCH_ANY
    ,
    MATCH_REGEXP
  • Aggregate unions:
    HLL_UNION
    ,
    BITMAP_UNION
    ,
    QUANTILE_UNION
    ,
    REPLACE_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)?
  • WITH cte_name AS (...)
    (CTE;Doris不需要显式RECURSIVE关键字)
  • 窗口函数:
    OVER (PARTITION BY ... ORDER BY ... ROWS/RANGE ...)
  • OUTFILE 'path' (FORMAT AS ...)? (PROPERTIES (...))?
  • Hint:
    /*+ hint_name(...) */
    [hint_name]
    关联Hint
  • ALTER COLOCATE GROUP name SET (...)
  • 全文检索:
    col MATCH_ALL '...'
    ,
    MATCH_PHRASE
    ,
    MATCH_PHRASE_PREFIX
    ,
    MATCH_PHRASE_EDGE
    ,
    MATCH_ANY
    ,
    MATCH_REGEXP
  • 聚合合并函数:
    HLL_UNION
    ,
    BITMAP_UNION
    ,
    QUANTILE_UNION
    ,
    REPLACE_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 IDNameLevelDescription
SYN-ERRLexical ErrorERRORUnrecognized characters in SQL text
SYN001Invalid KeywordERRORKeyword not supported by Doris (not in 504-keyword list)
SYN002Reserved Keyword as IdentifierERRORReserved keyword used as identifier without backticks
SYN003Syntax Structure ErrorERRORMissing required clause or keyword
SYN004Clause Ordering ErrorERRORSQL clause order does not conform to grammar
SYN005DISTRIBUTED BY Syntax ErrorERRORInvalid distribution strategy (only HASH/RANDOM supported)
SYN006PARTITION BY Syntax ErrorERRORInvalid partition definition (RANGE/LIST/AUTO)
SYN007BUCKETS Syntax ErrorERRORInvalid BUCKETS clause (must be INTEGER or AUTO)
SYN008EXPLAIN planType Syntax ErrorERRORInvalid EXPLAIN plan type (PARSED/ANALYZED/REWRITTEN/LOGICAL/OPTIMIZED/PHYSICAL/SHAPE/MEMO/DISTRIBUTED/ALL)
SYN009KEY Model Syntax ErrorERRORInvalid data model (DUPLICATE/AGGREGATE/UNIQUE KEY)
SYN010PROPERTIES Syntax ErrorERRORInvalid PROPERTIES clause structure
SYN011ENGINE Syntax ErrorERRORInvalid ENGINE clause
SYN012INSERT OVERWRITE Syntax ErrorERRORInvalid INSERT OVERWRITE TABLE structure
SYN013LOAD Syntax ErrorERRORInvalid LOAD LABEL / BROKER LOAD structure
SYN014ROUTINE LOAD Syntax ErrorERRORInvalid CREATE ROUTINE LOAD structure
SYN015EXPORT Syntax ErrorERRORInvalid EXPORT TABLE ... TO structure
SYN016BACKUP/RESTORE SNAPSHOT Syntax ErrorERRORInvalid BACKUP/RESTORE SNAPSHOT structure
SYN017CREATE MTMV Syntax ErrorERRORInvalid CREATE MATERIALIZED VIEW structure
SYN018CREATE CATALOG Syntax ErrorERRORInvalid CREATE CATALOG structure
SYN019CREATE USER/ROLE Syntax ErrorERRORInvalid CREATE USER/ROLE structure
SYN020CREATE ROW POLICY Syntax ErrorERRORInvalid CREATE ROW POLICY structure
SYN021CREATE SQL_BLOCK_RULE Syntax ErrorERRORInvalid CREATE SQL_BLOCK_RULE structure
SYN022CREATE STAGE Syntax ErrorERRORInvalid CREATE STAGE structure
SYN023CREATE JOB Syntax ErrorERRORInvalid CREATE JOB ON SCHEDULE structure
SYN024CREATE ENCRYPTKEY Syntax ErrorERRORInvalid CREATE ENCRYPTKEY structure
SYN025ADMIN SET/SHOW Syntax ErrorERRORInvalid ADMIN statement structure
SYN026CANCEL Syntax ErrorERRORInvalid CANCEL statement (LOAD/EXPORT/ALTER/BACKUP/RESTORE/WARM UP)
SYN027KILL Syntax ErrorERRORInvalid KILL (CONNECTION/QUERY) statement
SYN028TABLESAMPLE Syntax ErrorERRORInvalid TABLESAMPLE clause (PERCENT/ROWS, REPEATABLE)
SYN029OUTFILE Syntax ErrorERRORInvalid OUTFILE clause (FORMAT AS, PROPERTIES)
SYN030Hint Syntax ErrorWARNINGInvalid hint format (must be
/*+ name(...) */
or
[name]
)
SYN031Full-text MATCH Syntax ErrorERRORInvalid MATCH_ALL/MATCH_ANY/MATCH_PHRASE/MATCH_REGEXP usage
SYN032COLOCATE GROUP Syntax ErrorERRORInvalid ALTER COLOCATE GROUP structure
SYN033GRANT/REVOKE Syntax ErrorERRORInvalid GRANT/REVOKE privilege structure
基于分词和解析结果,执行语法检查规则。
语法检查规则(34条)
规则ID名称级别描述
SYN-ERR词法错误ERRORSQL文本中存在无法识别的字符
SYN001无效关键字ERRORDoris不支持的关键字(不在504个关键字列表中)
SYN002保留关键字用作标识符ERROR保留关键字未加反引号直接用作标识符
SYN003语法结构错误ERROR缺少必填子句或关键字
SYN004子句顺序错误ERRORSQL子句顺序不符合语法规范
SYN005DISTRIBUTED BY语法错误ERROR无效的分布策略(仅支持HASH/RANDOM)
SYN006PARTITION BY语法错误ERROR无效的分区定义(RANGE/LIST/AUTO)
SYN007BUCKETS语法错误ERROR无效的BUCKETS子句(必须为整数或AUTO)
SYN008EXPLAIN planType语法错误ERROR无效的EXPLAIN计划类型(PARSED/ANALYZED/REWRITTEN/LOGICAL/OPTIMIZED/PHYSICAL/SHAPE/MEMO/DISTRIBUTED/ALL)
SYN009KEY模型语法错误ERROR无效的数据模型(DUPLICATE/AGGREGATE/UNIQUE KEY)
SYN010PROPERTIES语法错误ERROR无效的PROPERTIES子句结构
SYN011ENGINE语法错误ERROR无效的ENGINE子句
SYN012INSERT OVERWRITE语法错误ERROR无效的INSERT OVERWRITE TABLE结构
SYN013LOAD语法错误ERROR无效的LOAD LABEL / BROKER LOAD结构
SYN014ROUTINE LOAD语法错误ERROR无效的CREATE ROUTINE LOAD结构
SYN015EXPORT语法错误ERROR无效的EXPORT TABLE ... TO结构
SYN016BACKUP/RESTORE SNAPSHOT语法错误ERROR无效的BACKUP/RESTORE SNAPSHOT结构
SYN017CREATE MTMV语法错误ERROR无效的CREATE MATERIALIZED VIEW结构
SYN018CREATE CATALOG语法错误ERROR无效的CREATE CATALOG结构
SYN019CREATE USER/ROLE语法错误ERROR无效的CREATE USER/ROLE结构
SYN020CREATE ROW POLICY语法错误ERROR无效的CREATE ROW POLICY结构
SYN021CREATE SQL_BLOCK_RULE语法错误ERROR无效的CREATE SQL_BLOCK_RULE结构
SYN022CREATE STAGE语法错误ERROR无效的CREATE STAGE结构
SYN023CREATE JOB语法错误ERROR无效的CREATE JOB ON SCHEDULE结构
SYN024CREATE ENCRYPTKEY语法错误ERROR无效的CREATE ENCRYPTKEY结构
SYN025ADMIN SET/SHOW语法错误ERROR无效的ADMIN语句结构
SYN026CANCEL语法错误ERROR无效的CANCEL语句(LOAD/EXPORT/ALTER/BACKUP/RESTORE/WARM UP)
SYN027KILL语法错误ERROR无效的KILL (CONNECTION/QUERY)语句
SYN028TABLESAMPLE语法错误ERROR无效的TABLESAMPLE子句(PERCENT/ROWS、REPEATABLE)
SYN029OUTFILE语法错误ERROR无效的OUTFILE子句(FORMAT AS、PROPERTIES)
SYN030Hint语法错误WARNING无效的Hint格式(必须为
/*+ name(...) */
[name]
SYN031全文检索MATCH语法错误ERROR无效的MATCH_ALL/MATCH_ANY/MATCH_PHRASE/MATCH_REGEXP用法
SYN032COLOCATE GROUP语法错误ERROR无效的ALTER COLOCATE GROUP结构
SYN033GRANT/REVOKE语法错误ERROR无效的GRANT/REVOKE权限结构

Step 5: Specification Check

步骤5:规范检查

Based on AST and Token stream, execute specification check rules. Rules are derived from
DorisParser.g4
grammar definitions and Apache Doris development best practices.
Specification Check Rules (46 rules):
Rule IDNameLevelCategoryDescription
SPEC001Missing DISTRIBUTED BYERRORObject DesignCREATE TABLE without distribution strategy (Doris requires DISTRIBUTED BY HASH or RANDOM)
SPEC002Missing ENGINEINFOObject DesignCREATE TABLE without explicit ENGINE (defaults to OLAP)
SPEC003SELECT * ProhibitedERRORData OperationQuery must specify explicit column list
SPEC004DELETE/UPDATE without WHEREERRORData OperationDML must include WHERE condition
SPEC005NOT IN SubqueryWARNINGData OperationRecommend NOT EXISTS or LEFT JOIN ... IS NULL
SPEC006DISTINCT PerformanceINFOData OperationDISTINCT may impact performance
SPEC007Implicit Type ConversionWARNINGData OperationMay cause index/zone-map invalidation
SPEC008LIKE Leading WildcardWARNINGData OperationCannot use zone-map or index
SPEC009OR ConditionINFOData OperationMay impact execution plan
SPEC010IN List Too LongWARNINGData Operation>1000 values recommend temp table
SPEC011FROM SubqueryINFOData OperationRecommend CTE instead
SPEC012Cartesian ProductERRORData OperationMulti-table missing JOIN condition
SPEC013INSERT Missing Column ListWARNINGData OperationRelies on default column order
SPEC014Missing Table CommentINFOObject DesignTable without COMMENT
SPEC015Table Naming ConventionWARNINGNamingShould use lowercase with underscores
SPEC016Column Naming ConventionWARNINGNamingShould use lowercase with underscores
SPEC017Reserved Keyword as IdentifierERRORNamingMay cause syntax ambiguity
SPEC018Distribution Key Column Not FoundWARNINGObject DesignDistribution key should be actual table column
SPEC019Partition Key Same as Distribution KeyINFOObject DesignMay cause data skew
SPEC020Missing KEY Model DefinitionINFOObject DesignRecommend explicit DUPLICATE/AGGREGATE/UNIQUE KEY
SPEC021Large Table Should Have PartitionINFOObject DesignImprove query and governance efficiency
SPEC022BUCKETS Count RecommendationINFOObject DesignRecommend appropriate bucket count for table size
SPEC023Column Should Have NOT NULLINFOObject DesignOptimizer can leverage NOT NULL
SPEC024DROP Should Use IF EXISTSWARNINGSQL DevPrevent error when object not found
SPEC025INSERT Multi-VALUESWARNINGSQL DevMultiple VALUES groups inefficient; use STREAM LOAD / BROKER LOAD
SPEC026Column-store Real-time INSERTWARNINGSQL DevFrequent small-batch INSERT into Doris (columnar) causes compaction pressure
SPEC027Frequent UPDATE/DELETEWARNINGSQL DevDoris UPDATE/DELETE is costly (read-merge-write)
SPEC028Function on Filter ColumnWARNINGSQL DevAffects statistics accuracy and zone-map usage
SPEC029Large Table COUNTWARNINGSQL DevFull table scan I/O cost
SPEC030Query Should Use LIMITINFOSQL DevAvoid oversized result sets
SPEC031CTE Recursion SafetyWARNINGSQL DevEnsure termination condition for recursive CTE
SPEC032Use Catalog/DB PrefixINFOSQL DevAvoid ambiguity in multi-catalog scenarios
SPEC033View Nesting Depth ≤ 3INFOObject DesignRequires cluster: query view dependencies
SPEC034Index Count > 5WARNINGObject DesignRequires cluster: query table indexes
SPEC035Non-pushdown SQL ProhibitedERRORSQL DevRequires cluster: EXPLAIN analysis
SPEC036BITMAP/HLL Column Needs Aggregation TypeWARNINGObject DesignBITMAP/HLL columns should specify BITMAP_UNION/HLL_UNION
SPEC037Use MTMV for Repeated Complex QueriesINFOObject DesignRecommend MTMV for repeated aggregation queries
SPEC038Avoid Frequent OUTFILE ExportINFOSQL DevUse EXPORT or broker for large exports
SPEC039VARCHAR Length Should Be ExplicitWARNINGObject DesignAvoid VARCHAR without length for large strings
SPEC040DECIMAL Precision Should Be ExplicitWARNINGObject DesignUse DECIMAL(p,s) or DECIMALV3(p,s), avoid bare DECIMAL
SPEC041COUNT(DISTINCT) Excessive UseERRORComplex Query LimitCOUNT(DISTINCT) count > 5, may cause severe performance degradation
SPEC042NOT IN Subquery ProhibitedERRORComplex Query LimitNOT IN subquery causes full scan and severe performance drop; use NOT EXISTS or LEFT JOIN
SPEC043Excessive JOINsERRORComplex Query LimitJOIN count > 20, may cause unstable query plans and high memory usage
SPEC044Excessive UNION ALLsERRORComplex Query LimitUNION ALL count > 20, may cause complex plans and high resource consumption
SPEC045Deeply Nested SubqueriesERRORComplex Query LimitSubquery nesting depth > 20, may cause severe parse and execution performance issues
SPEC046SQL Statement Too LongERRORComplex Query LimitSQL text length > 2MB, may cause parse timeout or excessive memory usage
基于AST和Token流,执行规范检查规则。规则源自
DorisParser.g4
语法定义和Apache Doris开发最佳实践。
规范检查规则(46条)
规则ID名称级别分类描述
SPEC001缺少DISTRIBUTED BYERROR对象设计CREATE TABLE语句未指定分布策略(Doris要求使用DISTRIBUTED BY HASH或RANDOM)
SPEC002缺少ENGINEINFO对象设计CREATE TABLE语句未显式指定ENGINE(默认值为OLAP)
SPEC003禁止使用SELECT *ERROR数据操作查询必须指定明确的列列表
SPEC004DELETE/UPDATE语句缺少WHERE条件ERROR数据操作DML语句必须包含WHERE条件
SPEC005NOT IN子查询WARNING数据操作推荐使用NOT EXISTS或LEFT JOIN ... IS NULL替代
SPEC006DISTINCT性能影响INFO数据操作DISTINCT可能影响性能
SPEC007隐式类型转换WARNING数据操作可能导致索引/分区裁剪失效
SPEC008LIKE前缀使用通配符WARNING数据操作无法使用分区裁剪或索引
SPEC009OR条件INFO数据操作可能影响执行计划
SPEC010IN列表过长WARNING数据操作超过1000个值时推荐使用临时表
SPEC011FROM子查询INFO数据操作推荐使用CTE替代
SPEC012笛卡尔积ERROR数据操作多表查询缺少JOIN条件
SPEC013INSERT语句缺少列列表WARNING数据操作依赖默认列顺序,存在风险
SPEC014缺少表注释INFO对象设计表未添加COMMENT注释
SPEC015表命名规范WARNING命名规范应使用小写字母加下划线格式
SPEC016列命名规范WARNING命名规范应使用小写字母加下划线格式
SPEC017保留关键字用作标识符ERROR命名规范可能导致语法歧义
SPEC018分布键列不存在WARNING对象设计分布键应为表中实际存在的列
SPEC019分区键与分布键相同INFO对象设计可能导致数据倾斜
SPEC020缺少KEY模型定义INFO对象设计推荐显式指定DUPLICATE/AGGREGATE/UNIQUE KEY
SPEC021大表应设置分区INFO对象设计提升查询和治理效率
SPEC022BUCKETS数量建议INFO对象设计根据表大小推荐合适的分桶数
SPEC023列应设置NOT NULL约束INFO对象设计优化器可利用NOT NULL约束提升性能
SPEC024DROP语句应使用IF EXISTSWARNINGSQL开发避免对象不存在时触发错误
SPEC025INSERT多VALUES语句WARNINGSQL开发多组VALUES效率低下;推荐使用STREAM LOAD / BROKER LOAD
SPEC026列存表实时INSERTWARNINGSQL开发频繁小批量INSERT到Doris列存表会导致压缩压力
SPEC027频繁执行UPDATE/DELETEWARNINGSQL开发Doris的UPDATE/DELETE操作成本较高(读-合并-写流程)
SPEC028过滤列使用函数WARNINGSQL开发影响统计信息准确性和分区裁剪使用
SPEC029大表COUNT查询WARNINGSQL开发全表扫描I/O成本高
SPEC030查询应使用LIMITINFOSQL开发避免返回过大的结果集
SPEC031CTE递归安全性WARNINGSQL开发确保递归CTE有终止条件
SPEC032使用Catalog/DB前缀INFOSQL开发避免多Catalog场景下的歧义
SPEC033视图嵌套深度≤3INFO对象设计需要集群:查询视图依赖关系
SPEC034索引数量>5WARNING对象设计需要集群:查询表索引信息
SPEC035禁止非下推SQLERRORSQL开发需要集群:通过EXPLAIN分析验证
SPEC036BITMAP/HLL列需指定聚合类型WARNING对象设计BITMAP/HLL列应指定BITMAP_UNION/HLL_UNION聚合函数
SPEC037重复复杂查询使用MTMVINFO对象设计推荐使用MTMV处理重复聚合查询
SPEC038避免频繁使用OUTFILE导出INFOSQL开发大数据导出推荐使用EXPORT或broker方式
SPEC039VARCHAR长度应显式指定WARNING对象设计避免未指定长度的VARCHAR存储大字符串
SPEC040DECIMAL精度应显式指定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
SPEC043JOIN数量过多ERROR复杂查询限制JOIN数量>20,可能导致查询计划不稳定和内存占用过高
SPEC044UNION ALL数量过多ERROR复杂查询限制UNION ALL数量>20,可能导致计划复杂和资源消耗过高
SPEC045子查询嵌套过深ERROR复杂查询限制子查询嵌套深度>20,可能导致严重的解析和执行性能问题
SPEC046SQL语句过长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>" all
Report format:
markdown
undefined
使用检查引擎生成Markdown格式的报告:
bash
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_checker.py "<sql_text>" all
报告格式:
markdown
undefined

Doris 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

摘要

MetricValue
Total Rules74
Passed71
Violations3
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 *替换为具体列列表
undefined

Core 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

参数

ParameterRequired/OptionalDescriptionDefault
sql_text
RequiredSQL statement to checkN/A
check_mode
OptionalCheck mode: syntax/spec/allsyntax+spec
参数名必填/可选描述默认值
sql_text
必填待检查的SQL语句
check_mode
可选检查模式:syntax/spec/allsyntax+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

最佳实践

  1. Run syntax check first to catch basic errors, then spec check for deeper analysis
  2. For CREATE TABLE statements, always include
    DISTRIBUTED BY HASH(分布键)
    or
    DISTRIBUTED BY RANDOM
    to avoid SPEC001
  3. For Doris tables, explicitly specify the KEY model (
    DUPLICATE KEY
    /
    AGGREGATE KEY
    /
    UNIQUE KEY
    )
  4. Use
    all
    mode for comprehensive checking
  5. Rules marked with
    requires_mcp: true
    or "Requires cluster" (SPEC033, SPEC034, SPEC035) need cluster connection and are skipped in static mode
  6. Doris does NOT support
    MERGE INTO ... WHEN MATCHED
    or
    ON DUPLICATE KEY UPDATE
    — these will be flagged as syntax errors
  7. Doris identifiers use backticks (
    `
    ), not double quotes — using double quotes for identifiers will trigger a warning
  8. For large data loading, prefer STREAM LOAD / BROKER LOAD / ROUTINE LOAD over multi-row INSERT VALUES (SPEC025)
  1. 先运行语法检查捕获基础错误,再执行规范检查进行深度分析
  2. 对于CREATE TABLE语句,务必包含
    DISTRIBUTED BY HASH(分布键)
    DISTRIBUTED BY RANDOM
    ,避免触发SPEC001违规
  3. 对于Doris表,显式指定KEY模型(
    DUPLICATE KEY
    /
    AGGREGATE KEY
    /
    UNIQUE KEY
  4. 使用
    all
    模式进行全面检查
  5. 标记为
    requires_mcp: true
    或“需要集群”的规则(SPEC033、SPEC034、SPEC035)需要连接集群,静态模式下会被跳过
  6. Doris不支持
    MERGE INTO ... WHEN MATCHED
    ON DUPLICATE KEY UPDATE
    —— 这些语句会被标记为语法错误
  7. Doris标识符使用反引号(
    `
    ),而非双引号 —— 使用双引号作为标识符会触发警告
  8. 对于大数据加载,优先使用STREAM LOAD / BROKER LOAD / ROUTINE LOAD,而非多行INSERT VALUES(SPEC025)

References

参考文档

DocumentDescription
AST SchemaAST node type definitions for Doris SQL
Syntax Rules34 syntax check rule definitions
Specification Rules40 specification check rule definitions
Performance Rules11 performance check rule definitions (requires cluster)
Keywords504 Doris SQL keyword definitions (from DorisLexer.g4)
Grammar Rules100+ Doris statement type grammar definitions (from DorisParser.g4)
文档描述
AST SchemaDoris SQL的AST节点类型定义
Syntax Rules34条语法检查规则定义
Specification Rules40条规范检查规则定义
Performance Rules11条性能检查规则定义(需要连接集群)
Keywords504个Doris SQL关键字定义(来自DorisLexer.g4)
Grammar Rules100余种Doris语句类型的语法定义(来自DorisParser.g4)

Notes

注意事项

  1. Syntax and specification checks do not require cluster connection, can run offline
  2. Rules marked "Requires cluster" (SPEC033, SPEC034, SPEC035) are skipped in static mode
  3. 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
    ,
    backends
    , etc.)
  4. 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
    DorisParser.g4
    (Nereids ANTLR4 grammar) from Doris 3.1.4 source
  5. The check engine includes a custom tokenizer and recursive descent parser, no external SQL parsing libraries required (no ANTLR runtime needed)
  6. 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.
  1. 语法和规范检查无需连接集群,可离线运行
  2. 标记为“需要集群”的规则(SPEC033、SPEC034、SPEC035)在静态模式下会被跳过
  3. 性能规则(PERF001-PERF011)定义在rules/perf_rules.yaml中,但需要连接集群才能执行(依赖EXPLAIN ANALYZE、system表如
    information_schema.tables
    backends
    等)
  4. 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源码中的
    DorisParser.g4
    (Nereids ANTLR4语法)
  5. 检查引擎包含自定义分词器和递归下降解析器,无需依赖外部SQL解析库(无需ANTLR运行时)
  6. 版本兼容性:本技能基于Doris 3.1.4语法开发。Doris 2.1.x / 3.0.x / 3.1.x / 4.x的大多数语法结构共享相同的Nereids语法;新版本语法可能存在细微差异(如4.x新增特性)。在依赖特定规则前,请与你的集群版本进行验证。