3

我发现这个相当简单的 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

并且在第二次和随后的执行中可靠地发生。剪切/粘贴上面的 SQL 块会重现错误……对我来说。如果您不是这种情况,则非常感兴趣。我有以下线索:

  • 错误消息中检测到的架构有所不同。大多数情况下它被报告为“”,但其他的如“0MA{Start of Text}”或来自事务中先前语句的一些sql语句/注释片段。听起来与内存指针有关。
  • 一旦进入,它将持续出错。
  • 我发现如果我创建或替换该函数,我将执行一次,然后错误状态将再次出现。
  • 我发现如果我打开一个新的 pgadminIII 窗口(不删除或重新创建),我将执行相同的一次,然后错误状态将再次出现......不管它是否在不同的窗口中出错。声音连接相关。
  • 我发现注释掉任何一个的创建idx_temp_data_to_index_thisthatidx_temp_data_to_index_unique解决问题。
  • 出现在“x86_64-pc-linux-gnu 上的 PostgreSQL 9.5.3,由 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16),64 位编译”和 9.6 实现中。
  • 如果上述函数是从另一个函数执行的,那么上面的 CREATE OR REPLACE FUNCTION 1-time resolve 对父函数不起作用,只有在替换子函数时才起作用。如果这发生在单独的 pgadmin 窗口中也没关系。P听起来既不是客户端也不是事务。

真的很欣赏你的想法。

4

2 回答 2

1

这似乎是由 citus 数据扩展引起的。该错误是由超出默认堆栈 2M 时发生的内存损坏引起的。它不会出现在日志中,也不会出现本应抛出的“超出堆栈深度限制”异常。

这都是投机的指责。

卸载 citus 扩展为我解决了这个问题。

于 2017-03-31T20:26:54.100 回答
1

我认为后面缺少逗号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;
于 2016-10-25T19:13:10.907 回答