mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
Hashed crosstab was dying with an SPI_finish error when the source SQL
produced no rows. Now it returns 0 rows instead. Adjusted regression test for this case.
This commit is contained in:
parent
7d3b7db8da
commit
bc8a1fc282
@ -127,7 +127,7 @@ SELECT * FROM crosstab('SELECT rowid, attribute, val FROM ct where rowclass = ''
|
||||
-- hash based crosstab
|
||||
--
|
||||
create table cth(id serial, rowid text, rowdt timestamp, attribute text, val text);
|
||||
NOTICE: CREATE TABLE will create implicit sequence "cth_id_seq" for "serial" column "cth.id"
|
||||
NOTICE: CREATE TABLE will create implicit sequence "cth_id_seq" for serial column "cth.id"
|
||||
insert into cth values(DEFAULT,'test1','01 March 2003','temperature','42');
|
||||
insert into cth values(DEFAULT,'test1','01 March 2003','test_result','PASS');
|
||||
-- the next line is intentionally left commented and is therefore a "missing" attribute
|
||||
@ -193,6 +193,24 @@ SELECT * FROM crosstab(
|
||||
'SELECT DISTINCT rowdt, attribute FROM cth ORDER BY 2')
|
||||
AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8);
|
||||
ERROR: provided "categories" SQL must return 1 column of at least one row
|
||||
-- if source query returns zero rows, get zero rows returned
|
||||
SELECT * FROM crosstab(
|
||||
'SELECT rowid, rowdt, attribute, val FROM cth WHERE false ORDER BY 1',
|
||||
'SELECT DISTINCT attribute FROM cth ORDER BY 1')
|
||||
AS c(rowid text, rowdt timestamp, temperature text, test_result text, test_startdate text, volts text);
|
||||
rowid | rowdt | temperature | test_result | test_startdate | volts
|
||||
-------+-------+-------------+-------------+----------------+-------
|
||||
(0 rows)
|
||||
|
||||
-- if source query returns zero rows, get zero rows returned even if category query generates no rows
|
||||
SELECT * FROM crosstab(
|
||||
'SELECT rowid, rowdt, attribute, val FROM cth WHERE false ORDER BY 1',
|
||||
'SELECT DISTINCT attribute FROM cth WHERE false ORDER BY 1')
|
||||
AS c(rowid text, rowdt timestamp, temperature text, test_result text, test_startdate text, volts text);
|
||||
rowid | rowdt | temperature | test_result | test_startdate | volts
|
||||
-------+-------+-------------+-------------+----------------+-------
|
||||
(0 rows)
|
||||
|
||||
--
|
||||
-- connectby
|
||||
--
|
||||
|
@ -88,6 +88,17 @@ SELECT * FROM crosstab(
|
||||
'SELECT DISTINCT rowdt, attribute FROM cth ORDER BY 2')
|
||||
AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8);
|
||||
|
||||
-- if source query returns zero rows, get zero rows returned
|
||||
SELECT * FROM crosstab(
|
||||
'SELECT rowid, rowdt, attribute, val FROM cth WHERE false ORDER BY 1',
|
||||
'SELECT DISTINCT attribute FROM cth ORDER BY 1')
|
||||
AS c(rowid text, rowdt timestamp, temperature text, test_result text, test_startdate text, volts text);
|
||||
|
||||
-- if source query returns zero rows, get zero rows returned even if category query generates no rows
|
||||
SELECT * FROM crosstab(
|
||||
'SELECT rowid, rowdt, attribute, val FROM cth WHERE false ORDER BY 1',
|
||||
'SELECT DISTINCT attribute FROM cth WHERE false ORDER BY 1')
|
||||
AS c(rowid text, rowdt timestamp, temperature text, test_result text, test_startdate text, volts text);
|
||||
|
||||
--
|
||||
-- connectby
|
||||
|
@ -821,15 +821,6 @@ load_categories_hash(char *cats_sql, MemoryContext per_query_ctx)
|
||||
MemoryContextSwitchTo(SPIcontext);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* no qualifying tuples */
|
||||
SPI_finish();
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("provided \"categories\" SQL must " \
|
||||
"return 1 column of at least one row")));
|
||||
}
|
||||
|
||||
if (SPI_finish() != SPI_OK_FINISH)
|
||||
/* internal error */
|
||||
@ -879,6 +870,15 @@ get_crosstab_tuplestore(char *sql,
|
||||
j;
|
||||
int result_ncols;
|
||||
|
||||
if (num_categories == 0)
|
||||
{
|
||||
/* no qualifying category tuples */
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("provided \"categories\" SQL must " \
|
||||
"return 1 column of at least one row")));
|
||||
}
|
||||
|
||||
/*
|
||||
* The provided SQL query must always return at least three
|
||||
* columns:
|
||||
@ -994,11 +994,6 @@ get_crosstab_tuplestore(char *sql,
|
||||
MemoryContextSwitchTo(SPIcontext);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* no qualifying tuples */
|
||||
SPI_finish();
|
||||
}
|
||||
|
||||
if (SPI_finish() != SPI_OK_FINISH)
|
||||
/* internal error */
|
||||
|
Loading…
Reference in New Issue
Block a user