huawei-cloud-doris-sql-check について
Apache Doris SQL を静的に検査するスキルです。トークン化、構文解析、ルール判定により、Doris クラスターへ接続せずに構文と規約を確認できます。実行前の検証や、設計・命名・性能上のアンチパターンの確認に適しています。
主な機能
- 01Doris SQL のトークン化と解析
- 02構文・規約の検査モード
- 03多様な Doris 文に対応
- 04性能上のアンチパターンを検出
- 05クラスター接続不要の静的解析
活用シーン
- 01実行前の SQL 構文検証
- 02テーブルのパーティションとバケット設計の確認
- 03INSERT、LOAD、EXPORT 文の検査
- 04SQL 規約や性能上の問題の発見
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ huaweicloud/ huaweicloud-skills --skill huawei-cloud-doris-sql-checkインストール後、Claude Code で/huawei-cloud-doris-sql-checkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/ast_schema.mdrules/grammar_rules.pykeywords.pyperf_rules.yamlspec_rules.yamlsyntax_rules.yamlscripts/doris_sql_checker.pydoris_sql_parser.pydoris_sql_tokenizer.pytemplates/report_template.md詳細
Doris SQL チェックスキル
Apache Doris SQL 仕様のチェックを専門とするエキスパートとして、Apache Doris(Doris 3.1.4 のソースコードに基づく)の SQL 文を包括的にチェックします。Doris 固有の構文を Nereids ANTLR4 文法(DorisLexer.g4/DorisParser.g4)から正確に識別できる、独自開発の Doris SQL トークナイザーと再帰下降パーサーを備えています。
概要
アーキテクチャ:このスキルは、トークナイザー(字句解析)→ パーサー(構文解析)→ ルールエンジン(構文+仕様チェック)→ レポート生成の 3 段階パイプラインを使用します。
適用シナリオ:
- 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、ヒント /*+ /、全文検索 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 ジョブの定義をチェックしてください」
チェックモード
| モード | 依存関係 | 説明 |
|---|---|---|
| syntax | なし | 構文チェック:キーワードの妥当性、文の構造、句の完全性、Doris 構文との互換性 |
| spec | なし | 仕様チェック:オブジェクト設計基準、データ操作基準、命名規則 |
| all | なし | 構文チェックと仕様チェックの両方を実行 |
デフォルト:syntax + spec モード(外部依存関係は不要です)。
前提条件
1. Python の要件
- Python >= 3.8
- 追加パッケージは不要です(標準ライブラリのみ)
2. セキュリティルール
- このスキルは静的 SQL 分析のみを行い、クラスターへの接続は不要です
- SQL テキストはローカルで処理され、データが外部に送信されることはありません
- 認証情報や認証は不要です
ワークフロー
ステップ 1:入力の受け取り
ユーザーから SQL 文とチェックモードを受け取ります。モードが指定されていない場合、デフォルトで syntax + spec を使用します。
ステップ 2:トークン化
トークナイザーを実行し、SQL テキストを Token ストリームに変換します。
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_tokenizer.py "<sql_text>"
トークナイザーは次の要素をサポートします。
- Doris の全 504 キーワード(
DorisLexer.g4の--DORIS-KEYWORD-LIST-STARTと--DORIS-KEYWORD-LIST-ENDの間に記載) - Doris 固有のトークン:
HINT(/*+ ... */)、BACKQUOTED(`ident`)、ARROW(->)、NSEQ(<=>null-safe eq)、EQ(=または==)、NEQ(<>または!=)、LTE(<=または!>)、GTE(>=または!<)、DOUBLEPIPES(||)、LOGICALAND(&&)、LOGICALNOT(!) - リテラル:文字列(
'...'/"...")、整数、10 進数、bigint(123L)、smallint(123S)、tinyint(123Y)、bigdecimal(123BD)、指数表記 - バッククォートで囲まれた識別子:
`table_name`(Doris 形式。二重引用符より優先) - コメントのスキップ(
--の単一行コメント、/* */の複数行コメント。ただし/*+ hint */は HINT トークンとして保持) - 全文検索演算子:
MATCH_ALL、MATCH_ANY、MATCH_PHRASE、MATCH_PHRASE_PREFIX、MATCH_PHRASE_EDGE、MATCH_REGEXP、MATCH_NAME、MATCH_NAME_GLOB
ステップ 3:解析
パーサーを実行して AST を生成し、構文エラーを検出します。
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_parser.py "<sql_text>"
パーサーは、DorisParser.g4 に基づき、主な Doris ステートメントタイプをサポートしています。
- 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(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(テーブル/リソース/ロールの権限)
- 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(レプリカ、フロントエンド設定、タブレット診断、ゴミ箱、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 queryBUILD [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_name(...) */および[hint_name]リレーションヒント 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
ステップ 4:構文チェック
トークン化と解析の結果に基づいて、構文チェックルールを実行します。
構文チェックルール(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 句です(INTEGER または 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 | ヒント構文エラー | WARNING | ヒントの形式が無効です(/*+ name(...) */ または [name] が必要です) |
| SYN031 | 全文 MATCH 構文エラー | ERROR | MATCH_ALL/MATCH_ANY/MATCH_PHRASE/MATCH_REGEXP の使い方が無効です |
| SYN032 | COLOCATE GROUP 構文エラー | ERROR | ALTER COLOCATE GROUP の構造が無効です |
| SYN033 | GRANT/REVOKE 構文エラー | ERROR | GRANT/REVOKE 権限の構造が無効です |
ステップ 5:仕様チェック
AST とトークンストリームに基づいて、仕様チェックルールを実行します。ルールは、DorisParser.g4 の文法定義と Apache Doris の開発ベストプラクティスから導出されています。
仕様チェックルール(46 件):
| ルール ID | 名前 | レベル | カテゴリ | 説明 |
|---|---|---|---|---|
| SPEC001 | DISTRIBUTED BY の欠落 | ERROR | オブジェクト設計 | 分散戦略のない CREATE TABLE(Doris では DISTRIBUTED BY HASH または RANDOM が必要です) |
| SPEC002 | ENGINE の欠落 | INFO | オブジェクト設計 | 明示的な ENGINE のない CREATE TABLE(デフォルトは OLAP です) |
| SPEC003 | SELECT * の禁止 | ERROR | データ操作 | クエリでは列リストを明示的に指定する必要があります |
| SPEC004 | WHERE のない DELETE/UPDATE | 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 開発 | Doris(列指向)への少量データの頻繁な INSERT はコンパクションの負荷を高めます |
| 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 開発 | 複数のカタログがある場合の曖昧さを避けます |
| 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 またはブローカーを使用してください |
| 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 を超えると、解析がタイムアウトしたり、メモリ使用量が過剰になったりする可能性があります |
ステップ 6:レポートを生成する
チェックエンジンを使用して、Markdown形式のレポートを生成します。
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_checker.py "<sql_text>" all
レポート形式:
# Doris SQL Check Report
**Check Time**: 2026-07-17T10:00:00
**Statement Type**: SELECT
**Check Mode**: all
## Summary
| Metric | Value |
|--------|-------|
| Total Rules | 74 |
| Passed | 71 |
| Violations | 3 |
| Errors (ERROR) | 1 |
| Warnings (WARNING) | 1 |
| Infos (INFO) | 1 |
## Syntax Check
### [X] SYN003: Syntax Structure Error
- **Level**: ERROR
- **Position**: Line 1, Column 15
- **Description**: Missing FROM clause
- **Fix Suggestion**: Add FROM table_name
## Specification Check
### [!] SPEC003: SELECT * Prohibited
- **Level**: WARNING
- **Position**: Line 1, Column 8
- **Description**: Query uses SELECT *, should specify explicit column list
- **Fix Suggestion**: Replace SELECT * with specific column list
主なコマンド
doris_sql_checker.py doris_sql_parser.py doris_sql_tokenizer.py
パラメーター
| パラメーター | 必須/任意 | 説明 | デフォルト |
|---|---|---|---|
sql_text | 必須 | チェック対象のSQL文 | なし |
check_mode | 任意 | チェックモード:syntax/spec/all | syntax+spec |
出力形式
チェックレポートはMarkdown形式で出力され、次の内容が含まれます。
- サマリーテーブル:ルールの合計数、合格数、レベル別の違反数
- 構文チェックセクション:構文ルール(SYN-ERR、SYN001-SYN033)による違反
- 仕様チェックセクション:仕様ルール(SPEC001-SPEC040)による違反
- 元のSQL:チェック対象のSQL文
各違反項目には、ルールID、ルール名、レベル、位置(行/列)、説明、コードスニペット、修正案が含まれます。
クイックチェックコマンド
簡単なSQLチェックを行う場合は、直接実行します。
python ~/.cac/skills/huawei-cloud-doris-sql-check/scripts/doris_sql_checker.py "<sql_text>" [syntax|spec|all]
出力はJSON形式です。Markdown形式のレポートを出力するには、Pythonで次のように呼び出します。
from doris_sql_checker import check_sql_markdown
report = check_sql_markdown("SELECT * FROM t1", "all")
print(report)
ベストプラクティス
- まず構文チェックを実行して基本的なエラーを検出し、次に仕様チェックを実行して詳細に分析します。
CREATE TABLE文では、SPEC001を回避するため、必ずDISTRIBUTED BY HASH(分布键)またはDISTRIBUTED BY RANDOMを含めます。- Dorisテーブルでは、KEYモデル(
DUPLICATE KEY/AGGREGATE KEY/UNIQUE KEY)を明示的に指定します。 - 包括的にチェックするには、
allモードを使用します。 requires_mcp: trueまたは「Requires cluster」と記載されたルール(SPEC033、SPEC034、SPEC035)にはクラスター接続が必要であり、静的モードではスキップされます。- Dorisは
MERGE INTO ... WHEN MATCHEDやON DUPLICATE KEY UPDATEをサポートしていないため、構文エラーとして検出されます。 - Dorisの識別子にはダブルクォートではなくバッククォート(
`)を使用します。識別子にダブルクォートを使用すると、警告が発生します。 - 大量のデータをロードする場合は、複数行の
INSERT VALUESよりもSTREAM LOAD/BROKER LOAD/ROUTINE LOADを優先します(SPEC025)。
参考資料
| ドキュメント | 説明 |
|---|---|
| AST Schema | Doris SQLのASTノード型定義 |
| Syntax Rules | 34個の構文チェックルール定義 |
| Specification Rules | 40個の仕様チェックルール定義 |
| Performance Rules | 11個のパフォーマンスチェックルール定義(クラスターが必要) |
| Keywords | Doris SQLのキーワード定義504個(DorisLexer.g4由来) |
| Grammar Rules | Doris文の型に関する文法定義100個以上(DorisParser.g4由来) |
注意事項
- 構文チェックと仕様チェックではクラスターへの接続は不要で、オフラインで実行できます
- 「クラスターが必要」とマークされたルール(SPEC033、SPEC034、SPEC035)は静的モードではスキップされます
- パフォーマンスルール(PERF001-PERF011)は rules/perf_rules.yaml で定義されていますが、実行にはクラスターへの接続が必要です(EXPLAIN ANALYZE、
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 ソースの
DorisParser.g4(Nereids ANTLR4 文法)に基づいています - チェックエンジンにはカスタムトークナイザーと再帰下降パーサーが含まれており、外部の SQL パーサーライブラリは不要です(ANTLR ランタイムは不要)
- バージョン互換性:このスキルは Doris 3.1.4 の文法に基づいています。Doris 2.1.x/3.0.x/3.1.x/4.x はほとんどの構文で同じ Nereids 文法を使用しますが、新しい構文(例:4.x で追加された機能)には軽微な違いがある場合があります。特定のルールを適用する前に、お使いのクラスターのバージョンを確認してください。