SQL生成ツールを解説した記事

SQL 生成ツールを使用すると、  YACC 文法ファイル内の生成物を解析することによって、パーサー と他のデータベース製品 の互換性をテストでき、対応する SQL ステートメントが生成され、その結果に基づいてデータベースが使用されます 。 、ステートメントが他のデータベース構文と互換性があるかどうかが判断されます。

0 1 ツールの使用法

文法ファイルの前処理

前処理の目的は、文法ファイル内の無関係なコンテンツを削除し、各ステートメントの生成物のみを保持することです。コマンド bison -v sql.y を使用して文法ファイル内の文法規則を (アクションなしで) 取得でき、その後、生成ファイル内の無駄な部分(終端記号リスト、非終端記号リスト、状態遷移表など)は以下のとおりです。

生成された sql.output ファイルの内容は次のとおりです。「Syntax」セクションのみが保持されます。

注: 予約されている「Syntax 」セクションのシリアル番号も削除する必要があります。

 

上記のプロセスについては、処理されたファイルがツールの要件を満たすように、前処理スクリプト preprocess.sh を通じてカプセル化します。生成されるファイル形式は次のとおりで、出力される .output ファイルは前処理された文法ファイルです。

 

SQL文の生成

条件を満たす構文ファイルを生成したら、ツールを使用して SQL を生成できます。このツールは次のパラメーターをサポートしています。

•-b: 構文ファイルを指定します (必須)。構文ファイルは、preprocess.sh スクリプトによる処理後に生成されるファイルです。

•-n: 生成するプロダクションの名前を指定します (必須)

•-R: ランダムに生成されたモード、オプション、デフォルトは列挙モードです。

•-o: SQL ステートメントを生成するための保存ファイルを指定します。オプション。デフォルトは report.csv です。

•-N: 生成される SQL ステートメントの数を制限します。オプション。デフォルトでは制限なし。

 

0 2 ツールの実装

このツールには、yacc_parser と sql_generator の 2 つのパッケージが含まれており、それぞれトークンの解析と SQL の生成を完了します。

製造上の表現方法

type SeqInfo struct {
    Items []string
}
type Production struct {
    Head  string    // 产生式头部
    Alter []SeqInfo     // 产生式 body
}

​​​​​​​

トークン分析

Tokenize 関数は、読み取られた文法ファイル内の文字をトークン化するために使用され、各呼び出しはトークンを返します。この関数は単純な区切り文字と引用符のみを処理し、標準の字句解析の通常のマッチングは実装しません。

Parse 関数は Tokenize 関数を呼び出し、毎回 1 つのトークンを返します。返された後、Parse 関数は現在のステータスとトークン タイプに基づいて一連のトークンを組み立てます。

 

SQLの生成

SQL 生成には 2 つのモードがあります。

1. Production で指定されたプロダクションの本体リストを走査し、列挙して SQL ステートメントを生成します。

2. Production で指定されたプロダクションの本体リストをランダムに選択し、SQL ステートメントをランダムに生成します。

 

1. 列挙

列挙の実装では、リンク リストを使用して、解決されるトークンを保存するたびに、リンク リストの先頭からトークンが取得され、その数に基づいてトークンの出現数が増加します。各部分式のレコード内のトークンの出現回数が指定された回数を超えている場合、推定を継続できるフィルター部分式。

一方、2 つの配列を使用して、現在取得されている部分式の添字 (choice) と、記録する現在の最大部分式の添字 (max) を記録するため、次の式を選択によって増分できます。

フィルタリング後、選択位置にあるプロダクションの適切な部分式を選択し、そのすべてのトークンをリンクされたリストの先頭に挿入し、先頭がリテラルであるかキーワードであるかを判断します。そうである場合は、先頭を取り出して、それをSQL 配列でない場合は、リンクされたリストのループを続行します。

処理が現在のプロダクションの終わりに達すると (判定方法はchoice>max)、この時点で「キャリー」が試行されます。つまり、現在記録されている位置配列の最後の桁がインクリメントされます。

例: 最大配列は 1 2 1 3、選択配列は 0 0 0 3、キャリー後の選択配列は 0 0 1 0 です。これは、最後の位置がトラバースされ、最後から 2 番目の位置になったことを意味します。インクリメントする必要があり、最後の位置が 0 の場合は、次の順列と組み合わせの読み取りを続けます。

たとえば、次のプロダクションの場合、生成プロセスは再帰によって実装され、処理ロジックは次の図のようになります。

show_tables_stmt: 名前「.」からテーブルを表示します。コメント付きの名前
                |コメント付きの名前からテーブルを表示
                |コメント付きのテーブルを表示します。 コメント付き

: コメント付き
            | %空の

名前: ID ENT

 

記録された選択値に従って、SQL が生成されるまでプロダクションの選択部分式を選択します。次に、選択配列を運び、次のラウンドの選択を続行します。

2.ランダム

ランダム生成モードは列挙生成モードと似ていますが、実稼働本体リスト内の各トークンを順番に走査するのではなく、SQL の一部としてトークンをランダムに選択する点が異なります。

 

私はオープンソースの産業用ソフトウェアを諦めることにしました - OGG 1.0 がリリースされ、Huawei がすべてのソース コードを提供しました。Google Python Foundation チームは「コード クソ マウンテン」によって解雇されました Fedora Linux 40が正式リリース。有名ゲーム会社がリリース 新規定:従業員の結婚祝儀は10万元を超えてはならない。チャイナユニコム世界初のオープンソースモデルLlama3 8B中国語版をリリース。Pinduoduoに賠償判決国内のクラウド入力方式に500万元の罰金- クラウドデータアップロードのセキュリティ問題がないのはファーウェイだけ
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/5148943/blog/11054997