postgresql error: 'schema "" does not exist' on temporary table
postgresql error: 'schema "" does not exist' on temporary table
我发现这个相当简单的 postgresql 9.6 函数
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
并且在第二次和后续执行中可靠地发生。 Cut/Pasting 上面的 SQL 块重现了错误……对我来说。如果您不是这种情况,我会很感兴趣。我有以下线索:
- 错误消息中检测到的模式不同。大多数情况下,它被报告为“”,但其他人如“0MA{文本开始}”或来自交易中先前声明的 sql statement/comment 的一些片段。听起来与内存指针有关。
- 一旦进入就会一直出错。
- 我发现如果我创建或替换函数,我将执行一次,然后错误状态将再次出现。
- 我发现如果我打开一个新的 pgadminIII window(没有删除或重新创建),我将得到相同的执行,然后错误状态将再次出现......无论它是否是在另一个 window 中出错。听起来与连接有关。
- 我发现注释掉创建
idx_temp_data_to_index_thisthat
或 idx_temp_data_to_index_unique
可以解决问题。
- 出现在 "PostgreSQL 9.5.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16), 64-bit" 和 9.6 实现中。
- 如果上面的函数是从另一个函数执行的,上面的 CREATE OR REPLACE FUNCTION 1-time resolve 对父函数不起作用,只有在替换子函数时才起作用。如果这发生在单独的 pgadmin window 中也没关系。 P听起来既不像客户端,也不像交易。
非常感谢您的想法。
我觉得 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;
这似乎是由 citus 数据扩展引起的。该错误是由超过 2M 的默认堆栈后发生的内存损坏引起的。它不会出现在日志中,也不会出现本应抛出的 "stack depth limit exceeded" 异常。
这都是投机性的指责。
卸载 citus 扩展解决了我的问题。
我发现这个相当简单的 postgresql 9.6 函数
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
并且在第二次和后续执行中可靠地发生。 Cut/Pasting 上面的 SQL 块重现了错误……对我来说。如果您不是这种情况,我会很感兴趣。我有以下线索:
- 错误消息中检测到的模式不同。大多数情况下,它被报告为“”,但其他人如“0MA{文本开始}”或来自交易中先前声明的 sql statement/comment 的一些片段。听起来与内存指针有关。
- 一旦进入就会一直出错。
- 我发现如果我创建或替换函数,我将执行一次,然后错误状态将再次出现。
- 我发现如果我打开一个新的 pgadminIII window(没有删除或重新创建),我将得到相同的执行,然后错误状态将再次出现......无论它是否是在另一个 window 中出错。听起来与连接有关。
- 我发现注释掉创建
idx_temp_data_to_index_thisthat
或idx_temp_data_to_index_unique
可以解决问题。 - 出现在 "PostgreSQL 9.5.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16), 64-bit" 和 9.6 实现中。
- 如果上面的函数是从另一个函数执行的,上面的 CREATE OR REPLACE FUNCTION 1-time resolve 对父函数不起作用,只有在替换子函数时才起作用。如果这发生在单独的 pgadmin window 中也没关系。 P听起来既不像客户端,也不像交易。
非常感谢您的想法。
我觉得 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;
这似乎是由 citus 数据扩展引起的。该错误是由超过 2M 的默认堆栈后发生的内存损坏引起的。它不会出现在日志中,也不会出现本应抛出的 "stack depth limit exceeded" 异常。
这都是投机性的指责。
卸载 citus 扩展解决了我的问题。