問題タブ [postgresql-extensions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - PostgreSQL の C 拡張機能からの「CREATE SCHEMA foo ...」クエリ (SPI_execute_with_args を使用)
Server Programming Interface (SPI) を使用して、PostgreSQL 用に構築された C 拡張機能から SQL クエリを実行しようとしています。クエリは、非常に多数のテーブルを含む新しいスキーマを作成する必要があります。(基本的には、ユーザーが作業するためのワークスペースをセットアップする必要があります。)しかし、ユーザーは複数のワークスペースを作成できる必要があるため、スクリプトを作成するときにスキーマ名がわかりません。したがって、実行時にこれを提供する方法が必要です。しかし、私はそれを機能させることができません。
ドキュメントに次のように記載されてSPI_execute_with_args
いるため、これを使用してこれを実行しようとしています。
SPI_execute_with_args
外部から提供されたパラメーターへの参照を含む可能性のあるコマンドを実行します。コマンド テキストはパラメータを として参照し$n
、呼び出しはそのようなシンボルごとにデータ型と値を指定します。read_only
とcount
の解釈は同じSPI_execute
です。と比較した場合のこのルーチンの主な利点は、
SPI_execute
面倒な引用符/エスケープなしでデータ値をコマンドに挿入できるため、SQL インジェクション攻撃のリスクがはるかに少ないことです。
SQL スクリプトは次のようになります ($1
手動で実際のスキーマ名に置き換えて通常のスクリプトとして実行すると、すべて正常に機能します)。
しかし、今は C コードから実行したいと思っています。ドキュメンテーションには SPI で動作する例が欠けているため、さらに詳しく説明できるものを見つけるためにグーグルで検索する必要がありました。そして、関数が次のようになる SO でこの例を見つけました。
これは正常に機能します (パラメーターとして入力された数値に置き換え$1
られます)。
しかし、自分のクエリで動作するように変更を開始するとすぐに、すべてが壊れます。クエリの最初の行だけで機能させることさえできません。
記録のために、単純なSELECT '$1'
クエリを実行して、それをさまざまな変数に置き換えようとしました。しかし、例が機能する以外は何もありません。サーバーがクラッシュするか、無効な構文を返す$1
か、単に$1
答えとして返されます。
私が正しければ、どこで何$1
を置き換えたいかが重要なようです。$1
そして、その SPI は?で「検索と置換」を行うだけではありません。
ANYOID
、CSTRINGOID
、CHAROID
、などのさまざまな変数タイプをテストするときに、いくつかの異なる OID:s を試しました。そして、変数を純粋な char 配列として、または で割り当てられたテキスト ブロックへのポインターとして送信しようとしREGNAMESPACEOID
ました。しかし成功せず…TEXTOID
SPI_palloc()
palloc()
私が見つけた例とドキュメントからまとめたコード例:
このコードを実行すると、次の結果が得られます。
これが最善の方法であるかどうかはわかりませんが、そうでない場合でも、プロジェクトでさらに必要になるため、この SPI 関数がどのように機能するかをもっと知っておくとよいでしょう。
誰かがこれに対する実際の例や、私を正しい方向に押しやる何かを持っていますか?