問題タブ [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.

0 投票する
1 に答える
267 参照

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_onlycountの解釈は同じ SPI_executeです。

と比較した場合のこのルーチンの主な利点は、SPI_execute面倒な引用符/エスケープなしでデータ値をコマンドに挿入できるため、SQL インジェクション攻撃のリスクがはるかに少ないことです。

SQL スクリプトは次のようになります ($1手動で実際のスキーマ名に置き換えて通常のスクリプトとして実行すると、すべて正常に機能します)。

しかし、今は C コードから実行したいと思っています。ドキュメンテーションには SPI で動作する例が欠けているため、さらに詳しく説明できるものを見つけるためにグーグルで検索する必要がありました。そして、関数が次のようになる SO でこの例を見つけました。

これは正常に機能します (パラメーターとして入力された数値に置き換え$1られます)。

しかし、自分のクエリで動作するように変更を開始するとすぐに、すべてが壊れます。クエリの最初の行だけで機能させることさえできません。

記録のために、単純なSELECT '$1'クエリを実行して、それをさまざまな変数に置き換えようとしました。しかし、例が機能する以外は何もありません。サーバーがクラッシュするか、無効な構文を返す$1か、単に$1答えとして返されます。


私が正しければ、どこ$1 置き換えたいかが重要なようです。$1そして、その SPI は?で「検索と置換」を行うだけではありません。

ANYOIDCSTRINGOIDCHAROID、などのさまざまな変数タイプをテストするときに、いくつかの異なる OID:s を試しました。そして、変数を純粋な char 配列として、または で割り当てられたテキスト ブロックへのポインターとして送信しようとしREGNAMESPACEOIDました。しかし成功せず…TEXTOIDSPI_palloc()palloc()

私が見つけた例とドキュメントからまとめたコード例:

このコードを実行すると、次の結果が得られます。


これが最善の方法であるかどうかはわかりませんが、そうでない場合でも、プロジェクトでさらに必要になるため、この SPI 関数がどのように機能するかをもっと知っておくとよいでしょう。

誰かがこれに対する実際の例や、私を正しい方向に押しやる何かを持っていますか?