mcpField
H
huawei-cloud-dws-sql-check

huawei-cloud-dws-sql-check

github.com/huaweicloudテスト・品質59176 回インストール2 日前に更新
リポジトリ

huawei-cloud-dws-sql-check について

DWS SQL Check Skill は、SQL を静的解析し、DWS の構文と開発規約への適合を確認するスキルです。実行前に SQL をレビューする開発者向けで、静的チェックはクラスター接続なしで行い、JSON または Markdown のレポートを生成します。

主な機能

  1. 01DWS 対応のトークン化と解析
  2. 02構文・規約チェックモード
  3. 03DWS 固有 SQL 構文のルール
  4. 04パフォーマンスと命名規約の検査
  5. 05JSON・Markdown レポートの生成

活用シーン

  1. 01クラスター実行前の SQL 構文チェック
  2. 02DWS 規約に沿った CREATE TABLE 設計の確認
  3. 03クエリやデータ操作の SQL アンチパターン検出

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/huaweicloud/huaweicloud-skills --skill huawei-cloud-dws-sql-check

インストール後、Claude Code で/huawei-cloud-dws-sql-checkを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
ast_schema.md
rules/
grammar_rules.py
keywords.py
perf_rules.yaml
spec_rules.yaml
syntax_rules.yaml
scripts/
dws_sql_checker.py
dws_sql_parser.py
dws_sql_tokenizer.py
templates/
report_template.md

詳細

DWS SQL チェック スキル

あなたはDWS SQL仕様チェックのエキスパートとして、DWS向けSQL文を包括的にチェックします。DWS固有の構文を正確に識別できる、独自開発のDWS SQLトークナイザーと再帰下降パーサーを備えています。

概要

アーキテクチャ:このスキルは、トークナイザー(字句解析)→ パーサー(構文解析)→ ルールエンジン(構文+仕様チェック)→ レポート生成の3段階パイプラインを使用します。

対象シナリオ:

  • DWSクラスターで実行する前にSQL構文を検証する
  • DWS開発設計仕様に照らしてSQL文をレビューする
  • DWS固有の構文(DISTRIBUTE BY、PARTITION BY、MERGEなど)をチェックする
  • SQL文に潜むパフォーマンス上のアンチパターンを特定する

一般的な使用例:

  • 「このSQLをチェックしてください:SELECT * FROM t1」
  • 「このCREATE TABLEはDWS仕様に準拠していますか?」
  • 「このMERGE文の構文を検証してください」
  • 「仕様への準拠という観点でSQLをレビューしてください」
  • 「SQLでDWS固有の構文が正しく使われているかチェックしてください」

チェックモード

モード依存関係説明
syntaxなし構文チェック:キーワードの有効性、文の構造、句の完全性、DWS構文との互換性
specなし仕様チェック:オブジェクト設計標準、データ操作標準、命名規則
allなし構文チェックと仕様チェックの両方を実行

デフォルト:構文+仕様モード(外部依存関係は不要)。

前提条件

1. Python の要件
  • Python >= 3.8
  • 追加パッケージは不要(標準ライブラリのみ)
2. セキュリティルール
  • このスキルはSQLの静的解析のみを実行するため、クラスターへの接続は不要です
  • SQLテキストはローカルで処理され、データが外部に送信されることはありません
  • 認証情報や認証は不要です

ワークフロー

ステップ1:入力の受け取り

ユーザーからSQL文とチェックモードを受け取ります。モードが指定されていない場合は、構文+仕様をデフォルトとして使用します。

ステップ2:トークン化

トークナイザーを実行して、SQLテキストをトークンストリームに変換します。

python ~/.cac/skills/huawei-cloud-dws-sql-check/scripts/dws_sql_tokenizer.py "<sql_text>"

トークナイザーは以下をサポートします:

  • DWSキーワード594個すべて(4カテゴリ:RESERVED=91、COL_NAME=68、TYPE_FUNC_NAME=28、UNRESERVED=407)
  • DWS固有のトークン:ORA_JOINOP(Oracle (+) 結合)、TYPECAST(::)、HINT(/*+ ... */)
  • リテラル:文字列、整数、浮動小数点数、ビット文字列、16進数文字列
  • パラメーター参照:$1、$2...
  • コメントのスキップ(-- 単一行、/* / 複数行。ただし、/+ hint */ はHINTトークンとして保持)
ステップ3:解析

パーサーを実行してASTを生成し、構文エラーを検出します。

python ~/.cac/skills/huawei-cloud-dws-sql-check/scripts/dws_sql_parser.py "<sql_text>"

パーサーは主な文の種類をサポートします:

  • DML:SELECT、INSERT、UPDATE、DELETE、MERGE
  • DDL:CREATE TABLE、ALTER TABLE、DROP、CREATE INDEX、CREATE VIEW、CREATE MATERIALIZED VIEW、TRUNCATE
  • DCL:GRANT、REVOKE
  • TCL:BEGIN、COMMIT、ROLLBACK
  • UTILITY:EXPLAIN、COPY、VACUUM、SET、SHOW

DWS固有の構文:

  • DISTRIBUTE BY {HASH|MODULO|REPLICATION|ROUNDROBIN}
  • PARTITION BY {RANGE|LIST|INTERVAL}
  • TO {NODE|GROUP}
  • COMPRESS {YES|NO}
  • TIMECAPSULE TABLE ... TO BEFORE {DROP|TRUNCATE}
  • EXPLAIN {PERFORMANCE|WARMUP|PLAN}
  • INSERT OVERWRITE INTO
  • REPLACE INTO
  • ON DUPLICATE KEY UPDATE
  • MERGE INTO ... USING ... ON ... WHEN MATCHED/NOT MATCHED
  • CREATE RESOURCE POOL / WORKLOAD GROUP / REDACTION POLICY / OUTLINE
  • Oracle (+) 外部結合
  • オプティマイザーヒント(/*+ ... */)
Step 4: 構文チェック

トークン化と解析の結果に基づいて、構文チェックルールを実行します。

構文チェックルール(19 件):

ルール ID名前レベル説明
SYN-ERR字句エラーERRORSQL テキストに認識できない文字があります
SYN001無効なキーワードERRORDWS でサポートされていないキーワードです
SYN002識別子としての予約語ERROR引用符で囲まずに予約語を識別子として使用しています
SYN003構文構造エラーERROR必須の句またはキーワードがありません
SYN004句の順序エラーERRORSQL の句の順序が文法に準拠していません
SYN005DISTRIBUTE BY 構文エラーERROR無効な分散方式です
SYN006PARTITION 構文エラーERRORパーティション定義の構文が無効です
SYN007MERGE 構文エラーERRORMERGE 文の構造が不完全です
SYN008EXPLAIN 構文エラーERROREXPLAIN オプションが無効です
SYN009COMPRESS 構文エラーERRORCOMPRESS オプションが無効です
SYN010TIMECAPSULE 構文エラーERRORTIMECAPSULE 文の構造が無効です
SYN011RESOURCE POOL 構文エラーERRORCREATE RESOURCE POOL の構造が無効です
SYN012WORKLOAD GROUP 構文エラーERRORCREATE WORKLOAD GROUP の構造が無効です
SYN013REDACTION POLICY 構文エラーERRORCREATE REDACTION POLICY の構造が無効です
SYN014OUTLINE 構文エラーERRORCREATE OUTLINE の構造が無効です
SYN015TO NODE/GROUP 構文エラーERRORTO NODE/GROUP 句の構文が無効です
SYN016INSERT OVERWRITE 構文エラーERRORINSERT OVERWRITE の構造が無効です
SYN017ON DUPLICATE KEY 構文エラーERRORON DUPLICATE KEY UPDATE 句が無効です
SYN018Oracle (+) 結合構文エラーWARNING(+) 演算子の使い方が正しくありません
SYN019オプティマイザーヒント構文エラーWARNINGヒントの形式が無効です
Step 5: 仕様チェック

AST とトークンストリームに基づいて、仕様チェックルールを実行します。ルールは gram.y の文法定義と DWS の開発設計仕様に基づいています。

仕様チェックルール(40 件):

ルール ID名前レベルカテゴリ出典説明
SPEC001DISTRIBUTE BY の欠落ERRORオブジェクト設計ルール 2.9分散方式を指定せずに CREATE TABLE を実行しています
SPEC002主キーの欠落INFOオブジェクト設計-主キー制約のないテーブルです
SPEC003SELECT * の禁止ERRORデータ操作推奨 3.14クエリでは明示的な列リストを指定する必要があります
SPEC004WHERE を指定しない DELETE/UPDATEERRORデータ操作-DML には WHERE 条件を含める必要があります
SPEC005NOT IN サブクエリWARNINGデータ操作-代わりに NOT EXISTS を推奨します
SPEC006DISTINCT のパフォーマンスINFOデータ操作-DISTINCT はパフォーマンスに影響する可能性があります
SPEC007暗黙的な型変換WARNINGデータ操作ルール 3.9インデックスが無効になる可能性があります
SPEC008LIKE の先頭ワイルドカードWARNINGデータ操作-インデックスを使用できません
SPEC009OR 条件INFOデータ操作-実行計画に影響する可能性があります
SPEC010IN リストが長すぎますWARNINGデータ操作-値が 100 個を超える場合は一時テーブルを推奨します
SPEC011FROM サブクエリINFOデータ操作-代わりに CTE を推奨します
SPEC012直積ERRORデータ操作ルール 3.8複数テーブルで JOIN 条件がありません
SPEC013Oracle 外部結合INFOデータ操作-標準の JOIN を推奨します
SPEC014INSERT の列リストの欠落WARNINGデータ操作-既定の列順序に依存しています
SPEC015テーブルコメントの欠落INFOオブジェクト設計-コメントのないテーブルです
SPEC016テーブルの命名規則WARNING命名-小文字とアンダースコアを使用してください
SPEC017列の命名規則WARNING命名-小文字とアンダースコアを使用してください
SPEC018識別子に予約語を使用ERROR命名-構文が曖昧になる可能性があります
SPEC019分散キーの列が見つかりませんWARNINGオブジェクト設計-分散キーには実際のテーブル列を指定してください
SPEC020パーティションキーと分散キーが同じINFOオブジェクト設計-データの偏りが発生する可能性があります
SPEC021大規模テーブルでの REPLICATIONWARNINGオブジェクト設計-大規模テーブルでは REPLICATION を使用しないでください
SPEC022ROUNDROBIN のパフォーマンスINFOオブジェクト設計ルール 2.9ローカル結合をサポートしません
SPEC023カスタム TABLESPACEWARNINGオブジェクト設計ルール 2.8カラムストア v3 テーブルを除きます
SPEC024ストレージ形式の欠落WARNINGオブジェクト設計ルール 2.10ストレージ形式を明示することを推奨します
SPEC025行ストアでの COMPRESS の禁止ERRORオブジェクト設計ルール 2.10行ストアの圧縮テーブルは禁止されています
SPEC026大規模テーブルにはパーティションを設定してくださいINFOオブジェクト設計ルール 2.11クエリとガバナンスの効率を向上させます
SPEC027列に NOT NULL を指定してくださいINFOオブジェクト設計推奨 2.12オプティマイザーは NOT NULL を活用できます
SPEC028SERIAL 型を避けるWARNINGオブジェクト設計推奨 2.13SERIAL は GTM に負荷をかけます
SPEC029インデックス数が 5 を超えていますWARNINGオブジェクト設計ルール 2.14クラスターが必要です:pg_indexes を照会してください
SPEC030DROP では IF EXISTS を使用してくださいWARNINGSQL 開発ルール 3.2オブジェクトが見つからない場合のエラーを防ぎます
SPEC031複数の VALUES には COPY を使用してくださいWARNINGSQL 開発ルール 3.3INSERT VALUES は効率がよくありません
SPEC032カラムストアでのリアルタイム INSERTWARNINGSQL 開発推奨 3.4小さな CU の肥大化
SPEC033カラムストアでの UPDATE/DELETEWARNINGSQL 開発推奨 3.6CU の肥大化とデッドロックのリスク
SPEC034プッシュダウンされない SQL の禁止ERRORSQL 開発ルール 3.7クラスターが必要です:EXPLAIN で分析してください
SPEC035フィルター列への関数適用WARNINGSQL 開発推奨 3.10統計情報の精度に影響します
SPEC036行ストアの大規模テーブルでの COUNTWARNINGSQL 開発ルール 3.12全テーブルスキャンの I/O コスト
SPEC037クエリでは LIMIT を使用してくださいINFOSQL 開発推奨 3.13過大な結果セットを避けます
SPEC038WITH RECURSIVE の使用に注意WARNINGSQL 開発推奨 3.15終了条件を必ず設定してください
SPEC039スキーマプレフィックスを使用してくださいINFOSQL 開発推奨 3.16search_path に関する問題を避けます
SPEC040ビューのネスト深度は 3 以下INFOオブジェクト設計推奨 2.16クラスターが必要です:ビューの依存関係を照会してください
ステップ 6:レポートの生成

チェックエンジンを使用して、Markdown 形式のレポートを生成します。

python ~/.cac/skills/huawei-cloud-dws-sql-check/scripts/dws_sql_checker.py "<sql_text>" all

レポート形式:

# DWS SQL Check Report

**Check Time**: 2026-06-18T10:00:00
**Statement Type**: SELECT
**Check Mode**: all

## Summary

| Metric | Value |
|--------|-------|
| Total Rules | 41 |
| Passed | 38 |
| 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

パラメーター

パラメーター必須/任意説明デフォルト
sql_text必須チェックする SQL 文N/A
check_mode任意チェックモード:syntax/spec/allsyntax+spec

出力形式

チェックレポートは Markdown 形式で出力され、次の内容が含まれます:

  • 概要テーブル:ルールの合計数、合格数、レベル別の違反数
  • 構文チェックセクション:構文ルール(SYN-ERR、SYN001-SYN019)による違反
  • 仕様チェックセクション:仕様ルール(SPEC001-SPEC040)による違反
  • 元の SQL:チェック対象の SQL 文

各違反の項目には、ルール ID、ルール名、レベル、位置(行/列)、説明、コードスニペット、修正案が含まれます。

クイックチェックコマンド

簡単な SQL チェックを行うには、次のコマンドを直接実行します:

python ~/.cac/skills/huawei-cloud-dws-sql-check/scripts/dws_sql_checker.py "<sql_text>" [syntax|spec|all]

出力は JSON 形式です。Markdown 形式のレポートを出力するには、Python で次の関数を呼び出します:

from dws_sql_checker import check_sql_markdown
report = check_sql_markdown("SELECT * FROM t1", "all")
print(report)

ベストプラクティス

  1. まず構文チェックを実行して基本的なエラーを検出し、次に仕様チェックで詳細な分析を行います
  2. CREATE TABLE 文では、SPEC001 を回避するために必ず DISTRIBUTE BY を指定します
  3. 包括的なチェックには all モードを使用します
  4. requires_mcp: true または「Requires cluster」と記されたルール(SPEC029、SPEC034、SPEC040)にはクラスター接続が必要であり、静的モードではスキップされます

参考資料

ドキュメント説明
AST スキーマDWS SQL の AST ノード型定義
構文ルール19 個の構文チェックルール定義
仕様ルール40 個の仕様チェックルール定義
パフォーマンスルール11 個のパフォーマンスチェックルール定義(クラスター接続が必要)
キーワード594 個の DWS SQL キーワード定義
文法ルール160 種類以上の文型の文法定義

注記

  1. 構文チェックと仕様チェックにはクラスター接続が不要で、オフラインで実行できます
  2. 「Requires cluster」と記されたルール(SPEC029、SPEC034、SPEC040)は静的モードではスキップされます
  3. パフォーマンスルール(PERF001-PERF011)は rules/perf_rules.yaml で定義されていますが、実行にはクラスター接続が必要です
  4. DWS 固有の構文チェック(DISTRIBUTE BY、PARTITION BY、MERGE など)は、gram.y の文法定義に基づいています
  5. チェックエンジンにはカスタムトークナイザーと再帰下降パーサーが含まれており、外部の SQL 解析ライブラリは必要ありません

コメント