Folks,
Someone contacted me in IRC about a bug in PL/PgSQL. I've confirmed that
the example SQL they sent me causes a segfault on my machine (CVS HEAD),
but I've so far not had a lot of success tracking down the exact cause
of the problem.
Backtrace:
#0 0x403ed17a in compatible_tupdesc (td1=0x82c621c, td2=0x0) at
pl_exec.c:3715
#1 0x403eabb6 in exec_stmt_return_next (estate=0xbfffec50,
stmt=0x82d2e68) at pl_exec.c:1630
#2 0x403e9f20 in exec_stmt (estate=0xbfffec50, stmt=0x82d2e68) at
pl_exec.c:949
#3 0x403e9e09 in exec_stmts (estate=0xbfffec50, stmts=0x82d29c8) at
pl_exec.c:873
#4 0x403ea486 in exec_stmt_fori (estate=0xbfffec50, stmt=0x82d2eb0) at
pl_exec.c:1276
#5 0x403e9ed4 in exec_stmt (estate=0xbfffec50, stmt=0x82d2eb0) at
pl_exec.c:929
#6 0x403e9e09 in exec_stmts (estate=0xbfffec50, stmts=0x82d2580) at
pl_exec.c:873
#7 0x403ea486 in exec_stmt_fori (estate=0xbfffec50, stmt=0x82d2f28) at
pl_exec.c:1276
#8 0x403e9ed4 in exec_stmt (estate=0xbfffec50, stmt=0x82d2f28) at
pl_exec.c:929
#9 0x403e9e09 in exec_stmts (estate=0xbfffec50, stmts=0x82d2148) at
pl_exec.c:873
#10 0x403ea60b in exec_stmt_fors (estate=0xbfffec50, stmt=0x82d2fa0) at
pl_exec.c:1386
#11 0x403e9ee2 in exec_stmt (estate=0xbfffec50, stmt=0x82d2fa0) at
pl_exec.c:933
#12 0x403e9e09 in exec_stmts (estate=0xbfffec50, stmts=0x82d1ec0) at
pl_exec.c:873
#13 0x403e9ca7 in exec_stmt_block (estate=0xbfffec50, block=0x82d3078)
at pl_exec.c:829
#14 0x403e910b in plpgsql_exec_function (func=0x82a9b70,
fcinfo=0xbfffed50) at pl_exec.c:323
#15 0x403e6c94 in plpgsql_call_handler (fcinfo=0xbfffed50) at
pl_handler.c:133
#16 0x080e89c2 in ExecMakeTableFunctionResult (funcexpr=0x82c6a2c,
econtext=0x82c5d38, expectedDesc=0x82c621c, returnDesc=0xbfffee38) at
execQual.c:993
#17 0x080f03d2 in FunctionNext (node=0x82c5bc0) at nodeFunctionscan.c:78
#18 0x080ea002 in ExecScan (node=0x82c5bc0, accessMtd=0x80f0368
<FunctionNext>) at execScan.c:94
#19 0x080f041f in ExecFunctionScan (node=0x82c5bc0) at
nodeFunctionscan.c:127
#20 0x080e7606 in ExecProcNode (node=0x82c5bc0) at execProcnode.c:324
#21 0x080e62c1 in ExecutePlan (estate=0x82c5aec, planstate=0x82c5bc0,
operation=CMD_SELECT, numberTuples=0, direction=137126428,
destfunc=0x82c5cc4) at execMain.c:926
#22 0x080e5936 in ExecutorRun (queryDesc=0x82c2f3c,
direction=ForwardScanDirection, count=0) at execMain.c:220
#23 0x0813b05b in ProcessQuery (parsetree=0x82a4d70, plan=0x82c2f3c,
dest=Remote, completionTag=0xbffff000 "") at pquery.c:205
#24 0x0813975d in pg_exec_query_string (query_string=0xbffff000,
dest=Remote, parse_context=0x827026c) at postgres.c:838
#25 0x0813a6f4 in PostgresMain (argc=4, argv=0xbffff270,
username=0x826b841 "nconway") at postgres.c:2013
#26 0x0811f2a2 in DoBackend (port=0x826b710) at postmaster.c:2314
#27 0x0811ee1a in BackendStartup (port=0x826b710) at postmaster.c:1930
#28 0x0811df8d in ServerLoop () at postmaster.c:1017
#29 0x0811d9e9 in PostmasterMain (argc=1, argv=0x825eb08) at
postmaster.c:796
#30 0x080fa390 in main (argc=1, argv=0xbffffbf4) at main.c:209
A SQL script that triggers the problem is attached.
Any help on tracking down the problem would be much appreciated. Once
this has been diagnosed and fixed, I think it's suitable for 7.3.2.
Cheers,
Neil
CREATE TABLE banner_banners(
id SERIAL UNIQUE NOT NULL,
site INT4,
name TEXT,
url TEXT NOT NULL,
image TEXT NOT NULL,
target TEXT DEFAULT '_self',
priority INT4[] DEFAULT '{1}',
type INT2 DEFAULT 1,
start_time TIMESTAMPTZ[] DEFAULT '{\'now\'}',
duration INTERVAL[] DEFAULT '{\'1 millennium\'}',
createdate TIMESTAMPTZ NOT NULL DEFAULT now(),
modifydate TIMESTAMPTZ,
builddate TIMESTAMPTZ
);
DROP TYPE banner_type CASCADE;
CREATE TYPE banner_type AS (
uid INT4,
id INT4,
site INT4,
name TEXT,
url TEXT,
image TEXT,
target TEXT,
priority INT4,
type INT2,
start_time TIMESTAMPTZ,
duration INTERVAL,
createdate TIMESTAMPTZ,
modifydate TIMESTAMPTZ,
builddate TIMESTAMPTZ
);
CREATE OR REPLACE FUNCTION banner_expand() RETURNS SETOF banner_type AS '
DECLARE
myrec RECORD;
finalrec RECORD;
low INTEGER;
high INTEGER;
weight INTEGER;
tsta INT4;
tstb TIMESTAMPTZ;
tstc INTERVAL;
i INTEGER;
j INTEGER;
BEGIN
CREATE TEMP SEQUENCE uid_seq INCREMENT 1 MINVALUE 0 START 1;
FOR myrec IN SELECT * FROM banner_banners LOOP
SELECT INTO low
replace(split_part(array_dims(myrec.priority), '':'', 1), ''['','''')::INT4;
SELECT INTO high
replace(split_part(array_dims(myrec.priority), '':'', 2), '']'','''')::INT4;
FOR i IN low..high LOOP
SELECT INTO tsta myrec.priority[i];
SELECT INTO tstb myrec.start_time[i];
SELECT INTO tstc myrec.duration[i];
FOR j IN 1..tsta LOOP
raise notice ''[%:%] i:% j:%=%'', low, high, i, j, tsta;
raise notice ''(loop number %) priority[%] % start_time[%] % duration[%] %'',j, i, tsta, i, tstb, i, tstc;
SELECT INTO finalrec nextval(''uid_seq'')::INT4 AS uid,
myrec.id, myrec.site, myrec.name, myrec.url,
myrec.image, myrec.target, tsta, myrec.type,
tstb, tstc, myrec.createdate,
myrec.modifydate, myrec.builddate
WHERE now() BETWEEN tstb
AND (tstb + (tstc - ''1 second''));
raise notice ''Returning'';
RETURN NEXT finalrec;
raise notice '' Done'';
END LOOP;
j:=0;
END LOOP;
i:=0;
END LOOP;
DROP SEQUENCE uid_seq;
RETURN;
END;
' LANGUAGE 'plpgsql';
CREATE VIEW banner_expand AS SELECT * FROM banner_expand();
INSERT INTO banner_banners(site, name, url, image, target, priority, type, start_time, duration) VALUES (208,'Put Money Today','http://www.savemoneytoday.com/','_self','/banners/banner3.gif','{3,7}',5, '{"2002-01-01 00:00:00","2003-01-01 00:00:00"}', '{"100 years","1 week"}');
SELECT * FROM banner_banners;
SELECT * FROM banner_expand;
---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?
http://www.postgresql.org/users-lounge/docs/faq.html