2016-10-25 30 views
3

私はこのかなり簡単なのPostgreSQL 9.6の機能PostgreSQLのエラー:一時テーブルの上に「スキーマ 『』存在しない」

CREATE OR REPLACE FUNCTION public.trying_to_index_me() 
RETURNS VOID AS 
$BODY$ 
    BEGIN 
    CREATE TABLE public.table_to_index ( 
     id INTEGER NOT NULL,  
     this_id UUID NOT NULL, 
     that_id smallint NOT NULL, 
     CONSTRAINT idx_table_to_index_unique 
      UNIQUE (id,this_id,that_id)  
    ); 
    CREATE INDEX idx_table_to_index_thisthat ON public.table_to_index(this_id,that_id); 
    DROP TABLE public.table_to_index; 
END; 
$BODY$ LANGUAGE plpgsql; 

--SELECT public.trying_to_index_me(); 

schema "" does not exist errorが得られていることを発見しています。正確なエラーは、

ERROR: schema "" does not exist 
SQL state: 3F000 
Context: SQL statement "CREATE INDEX idx_table_to_index_thisthat 
ON public.table_to_index(this_id,that_id)" 
PL/pgSQL function trying_to_index_me() line 10 at SQL statement 

であり、2回目以降の実行で確実に発生します。上記のSQLチャンクをカット/ペーストすると、エラーが再現されます。それはあなたの場合ではない場合はかなり興味があります。私は以下の手がかりを持っています:

  • エラーメッセージで検出されたスキーマが異なります。ほとんどの場合、 ""として報告されますが、 "0MA {Start of Text}"やSQLステートメント/コメントのスニペットのようなものがトランザクションの前のステートメントから報告されます。メモリポインタ関連の音を出す。
  • エラーが一貫して発生します。
  • 私が関数を作成または置換すると、1回実行され、エラー状態が再び発生します。
  • 新しいpgadminIIIウィンドウを開くと(ドロップまたは再作成せずに)、同じウィンドウが表示されても同じエラーが発生します。接続関連の音がする。
  • idx_temp_data_to_index_thisthatまたはidx_temp_data_to_index_uniqueの作成をコメントアウトすると、問題が解決されます。
  • gcc(GCC)4.4.7 20120313(Red Hat 4.4.7-16)、64ビット版、および9.6実装でコンパイルされたx86_64-pc-linux-gnuのPostgreSQL 9.5.3で発生します。
  • 上記の関数が別の関数から実行された場合、上記のCREATE OR REPLACE FUNCTION 1回の解決は、子関数を置き換えるときにのみ、親関数では機能しません。それが別のpgadminウィンドウで発生するかどうかは関係ありません。 PSはクライアントやトランザクションのようなものではありません。

本当にありがとうございます。

+0

正確なpgのバージョン( 'select version();')は何ですか? –

+0

gcc(GCC)によってコンパイルされたx86_64-pc-linux-gnuのPostgreSQL 9.5.3 4.4.7 20120313(Red Hat 4.4.7-16)、64ビット-gnu – Vic

+0

これはすべて非常に奇妙です。両方のpgバージョン。エラーを再現できません。 'idx_temp_data_to_index_thisthatまたはidx_temp_data_to_index_uniqueのどちらかを削除すると問題が解決されます.'ということを明確にすることができますか?インデックスを削除するか、関数から作成を削除しますか? –

答えて

1

後に不足していると思います。このエラーは、2Mのデフォルトスタックを超えた場合に発生する破損したメモリによって引き起こされます。ログには表示されず、スローされた「スタックの深さの限界を超えた」例外にはなりません。

それはすべて投機的な指を指しています。

citus extensionをアンインストールすると、私の問題が解決しました。

+1

こんにちは、そこにいます。シタスはDDLコマンドの構文解析ツリーを書いていますが、これはPL/pgSQL関数の複数のステートメント/トランザクションで使用すると問題になります。私たちはこの問題([https://github.com/citusdata/citus/issues/1358])を追跡しており、この[pull request(https://github.com/citusdata/ citus/issues/1358)。 – ozgune

+0

Ah。どうもありがとう。私は一緒にフォローします。 – Vic

+0

報告をいただきありがとうございます!根本的な問題を見つけ、この[プルリクエスト](https://github.com/citusdata/citus/pull/1360)に修正しました。修正はマスターブランチ上にあり、今後のCitus 6.2パッケージに含まれます。 – ozgune

1

私はコンマこれはcitusデータの拡張によって引き起こされているように見えますthat_id smallint NOT NULL

CREATE OR REPLACE FUNCTION trying_to_index_me() 
RETURNS VOID AS 
$BODY$ 
    BEGIN 
    CREATE Temporary TABLE temp_data_to_index ( 
     id INTEGER NOT NULL,  
     this_id UUID NOT NULL, 
     that_id smallint NOT NULL, 
     CONSTRAINT idx_temp_data_to_index_unique 
      UNIQUE (id,this_id,that_id)  
    ); 
    CREATE INDEX idx_temp_data_to_index_thisthat ON temp_data_to_index(this_id,that_id); 
    DROP TABLE temp_data_to_index; 
END; 
$BODY$ LANGUAGE plpgsql VOLATILE COST 100; 
+0

エラーなしでこの機能を実行できます。 – Nikhil

+0

はい、また機能を削除して作成しました。 – Nikhil

+0

関数を削除してもう一度作成して試すことができますか? – Nikhil

関連する問題