Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit08c33c4

Browse files
committed
Attached is a patch for contrib/tablefunc. It fixes two issues raised by
Lars Boegild Thomsen (full email below) and also corrects the regressionexpected output for a recent backend message adjustment. Please apply.Joe Conway
1 parent04b4092 commit08c33c4

File tree

2 files changed

+71
-67
lines changed

2 files changed

+71
-67
lines changed

‎contrib/tablefunc/expected/tablefunc.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ SELECT * FROM crosstab('SELECT rowid, attribute, val FROM ct where rowclass = ''
127127
-- hash based crosstab
128128
--
129129
create table cth(id serial, rowid text, rowdt timestamp, attribute text, val text);
130-
NOTICE: CREATE TABLE will create implicit sequence "cth_id_seq" forSERIAL column "cth.id"
130+
NOTICE: CREATE TABLE will create implicit sequence "cth_id_seq" for"serial" column "cth.id"
131131
insert into cth values(DEFAULT,'test1','01 March 2003','temperature','42');
132132
insert into cth values(DEFAULT,'test1','01 March 2003','test_result','PASS');
133133
-- the next line is intentionally left commented and is therefore a "missing" attribute

‎contrib/tablefunc/tablefunc.c

Lines changed: 70 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,70 +1295,113 @@ build_tuplestore_recursively(char *key_fld,
12951295
intret;
12961296
intproc;
12971297
intserial_column;
1298+
StringInfobranchstr=NULL;
1299+
StringInfochk_branchstr=NULL;
1300+
StringInfochk_current_key=NULL;
1301+
char**values;
1302+
char*current_key;
1303+
char*current_key_parent;
1304+
charcurrent_level[INT32_STRLEN];
1305+
charserial_str[INT32_STRLEN];
1306+
char*current_branch;
1307+
HeapTupletuple;
12981308

12991309
if (max_depth>0&&level>max_depth)
13001310
returntupstore;
13011311

1312+
/* start a new branch */
1313+
branchstr=makeStringInfo();
1314+
1315+
/* need these to check for recursion */
1316+
chk_branchstr=makeStringInfo();
1317+
chk_current_key=makeStringInfo();
1318+
13021319
/* Build initial sql statement */
13031320
if (!show_serial)
13041321
{
1305-
appendStringInfo(sql,"SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL",
1322+
appendStringInfo(sql,"SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL AND %s <> %s",
13061323
key_fld,
13071324
parent_key_fld,
13081325
relname,
13091326
parent_key_fld,
13101327
start_with,
1311-
key_fld);
1328+
key_fld,key_fld,parent_key_fld);
13121329
serial_column=0;
13131330
}
13141331
else
13151332
{
1316-
appendStringInfo(sql,"SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL ORDER BY %s",
1333+
appendStringInfo(sql,"SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULLAND %s <> %sORDER BY %s",
13171334
key_fld,
13181335
parent_key_fld,
13191336
relname,
13201337
parent_key_fld,
13211338
start_with,
1322-
key_fld,
1339+
key_fld,key_fld,parent_key_fld,
13231340
orderby_fld);
13241341
serial_column=1;
13251342
}
13261343

1344+
if (show_branch)
1345+
values= (char**)palloc((CONNECTBY_NCOLS+serial_column)*sizeof(char*));
1346+
else
1347+
values= (char**)palloc((CONNECTBY_NCOLS_NOBRANCH+serial_column)*sizeof(char*));
1348+
1349+
/* First time through, do a little setup */
1350+
if (level==0)
1351+
{
1352+
/* root value is the one we initially start with */
1353+
values[0]=start_with;
1354+
1355+
/* root value has no parent */
1356+
values[1]=NULL;
1357+
1358+
/* root level is 0 */
1359+
sprintf(current_level,"%d",level);
1360+
values[2]=current_level;
1361+
1362+
/* root branch is just starting root value */
1363+
if (show_branch)
1364+
values[3]=start_with;
1365+
1366+
/* root starts the serial with 1 */
1367+
if (show_serial)
1368+
{
1369+
sprintf(serial_str,"%d", (*serial)++);
1370+
if (show_branch)
1371+
values[4]=serial_str;
1372+
else
1373+
values[3]=serial_str;
1374+
}
1375+
1376+
/* construct the tuple */
1377+
tuple=BuildTupleFromCStrings(attinmeta,values);
1378+
1379+
/* switch to long lived context while storing the tuple */
1380+
oldcontext=MemoryContextSwitchTo(per_query_ctx);
1381+
1382+
/* now store it */
1383+
tuplestore_puttuple(tupstore,tuple);
1384+
1385+
/* now reset the context */
1386+
MemoryContextSwitchTo(oldcontext);
1387+
1388+
/* increment level */
1389+
level++;
1390+
}
1391+
13271392
/* Retrieve the desired rows */
13281393
ret=SPI_exec(sql->data,0);
13291394
proc=SPI_processed;
13301395

13311396
/* Check for qualifying tuples */
13321397
if ((ret==SPI_OK_SELECT)&& (proc>0))
13331398
{
1334-
HeapTupletuple;
13351399
HeapTuplespi_tuple;
13361400
SPITupleTable*tuptable=SPI_tuptable;
13371401
TupleDescspi_tupdesc=tuptable->tupdesc;
13381402
inti;
1339-
char*current_key;
1340-
char*current_key_parent;
1341-
charcurrent_level[INT32_STRLEN];
1342-
charserial_str[INT32_STRLEN];
1343-
char*current_branch;
1344-
char**values;
1345-
StringInfobranchstr=NULL;
1346-
StringInfochk_branchstr=NULL;
1347-
StringInfochk_current_key=NULL;
1348-
1349-
/* start a new branch */
1350-
branchstr=makeStringInfo();
13511403

1352-
/* need these to check for recursion */
1353-
chk_branchstr=makeStringInfo();
1354-
chk_current_key=makeStringInfo();
1355-
1356-
if (show_branch)
1357-
values= (char**)palloc((CONNECTBY_NCOLS+serial_column)*sizeof(char*));
1358-
else
1359-
values= (char**)palloc((CONNECTBY_NCOLS_NOBRANCH+serial_column)*sizeof(char*));
1360-
1361-
/* First time through, do a little setup */
1404+
/* First time through, do a little more setup */
13621405
if (level==0)
13631406
{
13641407
/*
@@ -1373,45 +1416,6 @@ build_tuplestore_recursively(char *key_fld,
13731416
errmsg("invalid return type"),
13741417
errdetail("Return and SQL tuple descriptions are " \
13751418
"incompatible.")));
1376-
1377-
/* root value is the one we initially start with */
1378-
values[0]=start_with;
1379-
1380-
/* root value has no parent */
1381-
values[1]=NULL;
1382-
1383-
/* root level is 0 */
1384-
sprintf(current_level,"%d",level);
1385-
values[2]=current_level;
1386-
1387-
/* root branch is just starting root value */
1388-
if (show_branch)
1389-
values[3]=start_with;
1390-
1391-
/* root starts the serial with 1 */
1392-
if (show_serial)
1393-
{
1394-
sprintf(serial_str,"%d", (*serial)++);
1395-
if (show_branch)
1396-
values[4]=serial_str;
1397-
else
1398-
values[3]=serial_str;
1399-
}
1400-
1401-
/* construct the tuple */
1402-
tuple=BuildTupleFromCStrings(attinmeta,values);
1403-
1404-
/* switch to long lived context while storing the tuple */
1405-
oldcontext=MemoryContextSwitchTo(per_query_ctx);
1406-
1407-
/* now store it */
1408-
tuplestore_puttuple(tupstore,tuple);
1409-
1410-
/* now reset the context */
1411-
MemoryContextSwitchTo(oldcontext);
1412-
1413-
/* increment level */
1414-
level++;
14151419
}
14161420

14171421
for (i=0;i<proc;i++)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp