@ -16,14 +16,41 @@ select a,ord from unnest(array['a','b']) with ordinality as z(a,ord);
select * from unnest ( array [ ' a ' , ' b ' ] ) with ordinality as z ( a , ord ) ;
select a , ord from unnest ( array [ 1 . 0 : : float8 ] ) with ordinality as z ( a , ord ) ;
select * from unnest ( array [ 1 . 0 : : float8 ] ) with ordinality as z ( a , ord ) ;
select row_to_json ( s . * ) from generate_series ( 11 , 14 ) with ordinality s ;
-- ordinality vs. views
create temporary view vw_ord as select * from ( values ( 1 ) ) v ( n ) join foot ( 1 ) with ordinality as z ( a , b , ord ) on ( n = ord ) ;
select * from vw_ord ;
select definition from pg_views where viewname = ' vw_ord ' ;
drop view vw_ord ;
-- ordinality vs. rewind and reverse scan
-- multiple functions
select * from table ( foot ( 1 ) , foot ( 2 ) ) with ordinality as z ( a , b , c , d , ord ) ;
create temporary view vw_ord as select * from ( values ( 1 ) ) v ( n ) join table ( foot ( 1 ) , foot ( 2 ) ) with ordinality as z ( a , b , c , d , ord ) on ( n = ord ) ;
select * from vw_ord ;
select definition from pg_views where viewname = ' vw_ord ' ;
drop view vw_ord ;
-- expansions of unnest()
select * from unnest ( array [ 10 , 20 ] , array [ ' foo ' , ' bar ' ] , array [ 1 . 0 ] ) ;
select * from unnest ( array [ 10 , 20 ] , array [ ' foo ' , ' bar ' ] , array [ 1 . 0 ] ) with ordinality as z ( a , b , c , ord ) ;
select * from table ( unnest ( array [ 10 , 20 ] , array [ ' foo ' , ' bar ' ] , array [ 1 . 0 ] ) ) with ordinality as z ( a , b , c , ord ) ;
select * from table ( unnest ( array [ 10 , 20 ] , array [ ' foo ' , ' bar ' ] ) , generate_series ( 101 , 102 ) ) with ordinality as z ( a , b , c , ord ) ;
create temporary view vw_ord as select * from unnest ( array [ 10 , 20 ] , array [ ' foo ' , ' bar ' ] , array [ 1 . 0 ] ) as z ( a , b , c ) ;
select * from vw_ord ;
select definition from pg_views where viewname = ' vw_ord ' ;
drop view vw_ord ;
create temporary view vw_ord as select * from table ( unnest ( array [ 10 , 20 ] , array [ ' foo ' , ' bar ' ] , array [ 1 . 0 ] ) ) as z ( a , b , c ) ;
select * from vw_ord ;
select definition from pg_views where viewname = ' vw_ord ' ;
drop view vw_ord ;
create temporary view vw_ord as select * from table ( unnest ( array [ 10 , 20 ] , array [ ' foo ' , ' bar ' ] ) , generate_series ( 1 , 2 ) ) as z ( a , b , c ) ;
select * from vw_ord ;
select definition from pg_views where viewname = ' vw_ord ' ;
drop view vw_ord ;
-- ordinality and multiple functions vs. rewind and reverse scan
begin ;
declare foo scroll cursor for select * from generate_series ( 1 , 5 ) with ordinality as g ( i , o ) ;
declare foo scroll cursor for select * from table ( generate_series ( 1 , 5 ) , generate_series ( 1 , 2 ) ) with ordinality as g ( i , j , o ) ;
fetch all from foo ;
fetch backward all from foo ;
fetch all from foo ;
@ -31,6 +58,12 @@ fetch next from foo;
fetch next from foo ;
fetch prior from foo ;
fetch absolute 1 from foo ;
fetch next from foo ;
fetch next from foo ;
fetch next from foo ;
fetch prior from foo ;
fetch prior from foo ;
fetch prior from foo ;
commit ;
-- function with implicit LATERAL
@ -57,133 +90,169 @@ INSERT INTO foo VALUES(1,2,'Ed');
INSERT INTO foo VALUES ( 2 , 1 , ' Mary ' ) ;
-- sql, proretset = f, prorettype = b
CREATE FUNCTION getfoo ( int ) RETURNS int AS ' SELECT $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo ( 1 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE FUNCTION getfoo1 ( int ) RETURNS int AS ' SELECT $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo1 ( 1 ) AS t1 ;
SELECT * FROM getfoo1 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo1 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY as t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo1 ( 1 ) WITH ORDINALITY as t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
-- sql, proretset = t, prorettype = b
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS setof int AS ' SELECT fooid FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo ( 1 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE FUNCTION getfoo2 ( int ) RETURNS setof int AS ' SELECT fooid FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo2 ( 1 ) AS t1 ;
SELECT * FROM getfoo2 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo2 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo2 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
-- sql, proretset = t, prorettype = b
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS setof text AS ' SELECT fooname FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo ( 1 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE FUNCTION getfoo3 ( int ) RETURNS setof text AS ' SELECT fooname FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo3 ( 1 ) AS t1 ;
SELECT * FROM getfoo3 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo3 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo3 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
-- sql, proretset = f, prorettype = c
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS foo AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo ( 1 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE FUNCTION getfoo4 ( int ) RETURNS foo AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo4 ( 1 ) AS t1 ;
SELECT * FROM getfoo4 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo4 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo4 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
-- sql, proretset = t, prorettype = c
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS setof foo AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo ( 1 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE FUNCTION getfoo5 ( int ) RETURNS setof foo AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo5 ( 1 ) AS t1 ;
SELECT * FROM getfoo5 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo5 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo5 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
-- ordinality not supported for returns record yet
-- sql, proretset = f, prorettype = record
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS RECORD AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo ( 1 ) AS t1 ( fooid int , foosubid int , fooname text ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) AS
CREATE FUNCTION getfoo6 ( int ) RETURNS RECORD AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo6 ( 1 ) AS t1 ( fooid int , foosubid int , fooname text ) ;
SELECT * FROM TABLE ( getfoo6 ( 1 ) AS ( fooid int , foosubid int , fooname text ) ) WITH ORDINALITY ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo6 ( 1 ) AS
( fooid int , foosubid int , fooname text ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS
SELECT * FROM TABLE ( getfoo6 ( 1 ) AS ( fooid int , foosubid int , fooname text ) )
WITH ORDINALITY ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
-- sql, proretset = t, prorettype = record
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS setof record AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo ( 1 ) AS t1 ( fooid int , foosubid int , fooname text ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) AS
CREATE FUNCTION getfoo7 ( int ) RETURNS setof record AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo7 ( 1 ) AS t1 ( fooid int , foosubid int , fooname text ) ;
SELECT * FROM TABLE ( getfoo7 ( 1 ) AS ( fooid int , foosubid int , fooname text ) ) WITH ORDINALITY ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo7 ( 1 ) AS
( fooid int , foosubid int , fooname text ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS
SELECT * FROM TABLE ( getfoo7 ( 1 ) AS ( fooid int , foosubid int , fooname text ) )
WITH ORDINALITY ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
-- plpgsql, proretset = f, prorettype = b
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS int AS ' DECLARE fooint int; BEGIN SELECT fooid into fooint FROM foo WHERE fooid = $1; RETURN fooint; END; ' LANGUAGE plpgsql ;
SELECT * FROM getfoo ( 1 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE FUNCTION getfoo8 ( int ) RETURNS int AS ' DECLARE fooint int; BEGIN SELECT fooid into fooint FROM foo WHERE fooid = $1; RETURN fooint; END; ' LANGUAGE plpgsql ;
SELECT * FROM getfoo8 ( 1 ) AS t1 ;
SELECT * FROM getfoo8 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo8 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo8 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
-- plpgsql, proretset = f, prorettype = c
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS foo AS ' DECLARE footup foo%ROWTYPE; BEGIN SELECT * into footup FROM foo WHERE fooid = $1; RETURN footup; END; ' LANGUAGE plpgsql ;
SELECT * FROM getfoo ( 1 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE FUNCTION getfoo9 ( int ) RETURNS foo AS ' DECLARE footup foo%ROWTYPE; BEGIN SELECT * into footup FROM foo WHERE fooid = $1; RETURN footup; END; ' LANGUAGE plpgsql ;
SELECT * FROM getfoo9 ( 1 ) AS t1 ;
SELECT * FROM getfoo9 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo9 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo9 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
-- mix 'n match kinds, to exercise expandRTE and related logic
select * from table ( getfoo1 ( 1 ) , getfoo2 ( 1 ) , getfoo3 ( 1 ) , getfoo4 ( 1 ) , getfoo5 ( 1 ) ,
getfoo6 ( 1 ) AS ( fooid int , foosubid int , fooname text ) ,
getfoo7 ( 1 ) AS ( fooid int , foosubid int , fooname text ) ,
getfoo8 ( 1 ) , getfoo9 ( 1 ) )
with ordinality as t1 ( a , b , c , d , e , f , g , h , i , j , k , l , m , o , p , q , r , s , t , u ) ;
select * from table ( getfoo9 ( 1 ) , getfoo8 ( 1 ) ,
getfoo7 ( 1 ) AS ( fooid int , foosubid int , fooname text ) ,
getfoo6 ( 1 ) AS ( fooid int , foosubid int , fooname text ) ,
getfoo5 ( 1 ) , getfoo4 ( 1 ) , getfoo3 ( 1 ) , getfoo2 ( 1 ) , getfoo1 ( 1 ) )
with ordinality as t1 ( a , b , c , d , e , f , g , h , i , j , k , l , m , o , p , q , r , s , t , u ) ;
create temporary view vw_foo as
select * from table ( getfoo9 ( 1 ) ,
getfoo7 ( 1 ) AS ( fooid int , foosubid int , fooname text ) ,
getfoo1 ( 1 ) )
with ordinality as t1 ( a , b , c , d , e , f , g , n ) ;
select * from vw_foo ;
select pg_get_viewdef ( ' vw_foo ' ) ;
drop view vw_foo ;
DROP FUNCTION getfoo1 ( int ) ;
DROP FUNCTION getfoo2 ( int ) ;
DROP FUNCTION getfoo3 ( int ) ;
DROP FUNCTION getfoo4 ( int ) ;
DROP FUNCTION getfoo5 ( int ) ;
DROP FUNCTION getfoo6 ( int ) ;
DROP FUNCTION getfoo7 ( int ) ;
DROP FUNCTION getfoo8 ( int ) ;
DROP FUNCTION getfoo9 ( int ) ;
DROP FUNCTION foot ( int ) ;
DROP TABLE foo2 ;
DROP TABLE foo ;
-- Rescan tests --
CREATE TEMPORARY SEQUENCE foo_rescan_seq ;
CREATE TEMPORARY SEQUENCE foo_rescan_seq1 ;
CREATE TEMPORARY SEQUENCE foo_rescan_seq2 ;
CREATE TYPE foo_rescan_t AS ( i integer , s bigint ) ;
CREATE FUNCTION foo_sql ( int , int ) RETURNS setof foo_rescan_t AS ' SELECT i, nextval( '' foo_rescan_seq '' ) FROM generate_series($1,$2) i; ' LANGUAGE SQL ;
CREATE FUNCTION foo_sql ( int , int ) RETURNS setof foo_rescan_t AS ' SELECT i, nextval( '' foo_rescan_seq1 '' ) FROM generate_series($1,$2) i; ' LANGUAGE SQL ;
-- plpgsql functions use materialize mode
CREATE FUNCTION foo_mat ( int , int ) RETURNS setof foo_rescan_t AS ' begin for i in $1..$2 loop return next (i, nextval( '' foo_rescan_seq '' )); end loop; end; ' LANGUAGE plpgsql ;
CREATE FUNCTION foo_mat ( int , int ) RETURNS setof foo_rescan_t AS ' begin for i in $1..$2 loop return next (i, nextval( '' foo_rescan_seq2 '' )); end loop; end; ' LANGUAGE plpgsql ;
- - invokes ExecReScanFunctionScan - all these cases should materialize the function only once
-- LEFT JOIN on a condition that the planner can't prove to be true is used to ensure the function
-- is on the inner path of a nestloop join
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN foo_sql ( 11 , 13 ) ON ( r + i ) < 100 ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN foo_sql ( 11 , 13 ) WITH ORDINALITY AS f ( i , s , o ) ON ( r + i ) < 100 ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN foo_mat ( 11 , 13 ) ON ( r + i ) < 100 ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN foo_mat ( 11 , 13 ) WITH ORDINALITY AS f ( i , s , o ) ON ( r + i ) < 100 ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN TABLE ( foo_sql ( 11 , 13 ) , foo_mat ( 11 , 13 ) ) WITH ORDINALITY AS f ( i1 , s1 , i2 , s2 , o ) ON ( r + i1 + i2 ) < 100 ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN generate_series ( 11 , 13 ) f ( i ) ON ( r + i ) < 100 ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN generate_series ( 11 , 13 ) WITH ORDINALITY AS f ( i , o ) ON ( r + i ) < 100 ;
@ -193,32 +262,44 @@ SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN unnest(array[10,20,30]) WITH O
- - invokes ExecReScanFunctionScan with chgParam ! = NULL ( using implied LATERAL )
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_sql ( 10 + r , 13 ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_sql ( 10 + r , 13 ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_sql ( 11 , 10 + r ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_sql ( 11 , 10 + r ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , foo_sql ( r1 , r2 ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , foo_sql ( r1 , r2 ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_mat ( 10 + r , 13 ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_mat ( 10 + r , 13 ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_mat ( 11 , 10 + r ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_mat ( 11 , 10 + r ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , foo_mat ( r1 , r2 ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , foo_mat ( r1 , r2 ) WITH ORDINALITY AS f ( i , s , o ) ;
-- selective rescan of multiple functions:
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , TABLE ( foo_sql ( 11 , 11 ) , foo_mat ( 10 + r , 13 ) ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , TABLE ( foo_sql ( 10 + r , 13 ) , foo_mat ( 11 , 11 ) ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , TABLE ( foo_sql ( 10 + r , 13 ) , foo_mat ( 10 + r , 13 ) ) ;
SELECT setval ( ' foo_rescan_seq1 ' , 1 , false ) , setval ( ' foo_rescan_seq2 ' , 1 , false ) ;
SELECT * FROM generate_series ( 1 , 2 ) r1 , generate_series ( r1 , 3 ) r2 , TABLE ( foo_sql ( 10 + r1 , 13 ) , foo_mat ( 10 + r2 , 13 ) ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , generate_series ( 10 + r , 20 - r ) f ( i ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , generate_series ( 10 + r , 20 - r ) WITH ORDINALITY AS f ( i , o ) ;
@ -242,7 +323,8 @@ SELECT * FROM (VALUES (1),(2),(3)) v1(r1),
DROP FUNCTION foo_sql ( int , int ) ;
DROP FUNCTION foo_mat ( int , int ) ;
DROP SEQUENCE foo_rescan_seq ;
DROP SEQUENCE foo_rescan_seq1 ;
DROP SEQUENCE foo_rescan_seq2 ;
- -
-- Test cases involving OUT parameters
@ -444,12 +526,12 @@ select * from testfoo(); -- fail
drop function testfoo ( ) ;
- -
-- Check some cases involving dropped columns in a rowtype result
-- Check some cases involving added/ dropped columns in a rowtype result
- -
create temp table users ( userid text , email text , todrop bool , enabled bool ) ;
insert into users values ( ' id ' , ' email ' , true , true ) ;
insert into users values ( ' id2 ' , ' email2 ' , true , true ) ;
create temp table users ( userid text , seq int , email text , todrop bool , moredrop int , enabled bool ) ;
insert into users values ( ' id ' , 1 , ' email ' , true , 11 , true ) ;
insert into users values ( ' id2 ' , 2 , ' email2 ' , true , 12 , true ) ;
alter table users drop column todrop ;
create or replace function get_first_user ( ) returns users as
@ -467,6 +549,23 @@ SELECT get_users();
SELECT * FROM get_users ( ) ;
SELECT * FROM get_users ( ) WITH ORDINALITY ; -- make sure ordinality copes
-- multiple functions vs. dropped columns
SELECT * FROM TABLE ( generate_series ( 10 , 11 ) , get_users ( ) ) WITH ORDINALITY ;
SELECT * FROM TABLE ( get_users ( ) , generate_series ( 10 , 11 ) ) WITH ORDINALITY ;
-- check that we can cope with post-parsing changes in rowtypes
create temp view usersview as
SELECT * FROM TABLE ( get_users ( ) , generate_series ( 10 , 11 ) ) WITH ORDINALITY ;
select * from usersview ;
alter table users drop column moredrop ;
select * from usersview ;
alter table users add column junk text ;
select * from usersview ;
alter table users alter column seq type numeric ;
select * from usersview ; -- expect clean failure
drop view usersview ;
drop function get_first_user ( ) ;
drop function get_users ( ) ;
drop table users ;