@ -5,11 +5,40 @@ INSERT INTO foo2 VALUES(1, 11);
INSERT INTO foo2 VALUES ( 2 , 22 ) ;
INSERT INTO foo2 VALUES ( 2 , 22 ) ;
INSERT INTO foo2 VALUES ( 1 , 111 ) ;
INSERT INTO foo2 VALUES ( 1 , 111 ) ;
CREATE FUNCTION foot ( int ) returns setof foo2 as ' SELECT * FROM foo2 WHERE fooid = $1; ' LANGUAGE SQL ;
CREATE FUNCTION foot ( int ) returns setof foo2 as ' SELECT * FROM foo2 WHERE fooid = $1 ORDER BY f2; ' LANGUAGE SQL ;
-- function with ORDINALITY
select * from foot ( 1 ) with ordinality as z ( a , b , ord ) ;
select * from foot ( 1 ) with ordinality as z ( a , b , ord ) where b > 100 ; -- ordinal 2, not 1
-- ordinality vs. column names and types
select a , b , ord from foot ( 1 ) with ordinality as z ( a , b , ord ) ;
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 ) ;
-- 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
begin ;
declare foo scroll cursor for select * from generate_series ( 1 , 5 ) with ordinality as g ( i , o ) ;
fetch all from foo ;
fetch backward all from foo ;
fetch all from foo ;
fetch next from foo ;
fetch next from foo ;
fetch prior from foo ;
fetch absolute 1 from foo ;
commit ;
-- function with implicit LATERAL
-- function with implicit LATERAL
select * from foo2 , foot ( foo2 . fooid ) z where foo2 . f2 = z . f2 ;
select * from foo2 , foot ( foo2 . fooid ) z where foo2 . f2 = z . f2 ;
-- function with implicit LATERAL and explicit ORDINALITY
select * from foo2 , foot ( foo2 . fooid ) with ordinality as z ( fooid , f2 , ord ) where foo2 . f2 = z . f2 ;
-- function in subselect
-- function in subselect
select * from foo2 where f2 in ( select f2 from foot ( foo2 . fooid ) z where z . fooid = foo2 . fooid ) ORDER BY 1 , 2 ;
select * from foo2 where f2 in ( select f2 from foot ( foo2 . fooid ) z where z . fooid = foo2 . fooid ) ORDER BY 1 , 2 ;
@ -30,41 +59,62 @@ INSERT INTO foo VALUES(2,1,'Mary');
-- sql, proretset = f, prorettype = b
-- sql, proretset = f, prorettype = b
CREATE FUNCTION getfoo ( int ) RETURNS int AS ' SELECT $1; ' LANGUAGE SQL ;
CREATE FUNCTION getfoo ( int ) RETURNS int AS ' SELECT $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo ( 1 ) AS t1 ;
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 VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
SELECT * FROM vw_getfoo ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY as t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
-- sql, proretset = t, prorettype = b
-- sql, proretset = t, prorettype = b
DROP VIEW vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS setof int AS ' SELECT fooid FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
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 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
SELECT * FROM vw_getfoo ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
-- sql, proretset = t, prorettype = b
-- sql, proretset = t, prorettype = b
DROP VIEW vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS setof text AS ' SELECT fooname FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
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 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
SELECT * FROM vw_getfoo ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
-- sql, proretset = f, prorettype = c
-- sql, proretset = f, prorettype = c
DROP VIEW vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS foo AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
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 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
SELECT * FROM vw_getfoo ;
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 ) ;
SELECT * FROM vw_getfoo ;
-- sql, proretset = t, prorettype = c
-- sql, proretset = t, prorettype = c
DROP VIEW vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
DROP FUNCTION getfoo ( int ) ;
CREATE FUNCTION getfoo ( int ) RETURNS setof foo AS ' SELECT * FROM foo WHERE fooid = $1; ' LANGUAGE SQL ;
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 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
SELECT * FROM vw_getfoo ;
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 ) ;
SELECT * FROM vw_getfoo ;
-- ordinality not supported for returns record yet
-- sql, proretset = f, prorettype = record
-- sql, proretset = f, prorettype = record
DROP VIEW vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
DROP FUNCTION getfoo ( int ) ;
@ -88,16 +138,24 @@ DROP VIEW vw_getfoo;
DROP FUNCTION getfoo ( int ) ;
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 ;
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 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
SELECT * FROM vw_getfoo ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
-- plpgsql, proretset = f, prorettype = c
-- plpgsql, proretset = f, prorettype = c
DROP VIEW vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
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 ;
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 ) AS t1 ;
SELECT * FROM getfoo ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo ( 1 ) ;
SELECT * FROM vw_getfoo ;
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 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP VIEW vw_getfoo ;
DROP FUNCTION getfoo ( int ) ;
DROP FUNCTION getfoo ( int ) ;
@ -106,99 +164,85 @@ DROP TABLE foo2;
DROP TABLE foo ;
DROP TABLE foo ;
-- Rescan tests --
-- Rescan tests --
CREATE TABLE foorescan ( fooid int , foosubid int , fooname text , primary key ( fooid , foosubid ) ) ;
CREATE TEMPORARY SEQUENCE foo_rescan_seq ;
INSERT INTO foorescan values ( 5000 , 1 , ' abc.5000.1 ' ) ;
CREATE TYPE foo_rescan_t AS ( i integer , s bigint ) ;
INSERT INTO foorescan values ( 5001 , 1 , ' abc.5001.1 ' ) ;
INSERT INTO foorescan values ( 5002 , 1 , ' abc.5002.1 ' ) ;
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 ;
INSERT INTO foorescan values ( 5003 , 1 , ' abc.5003.1 ' ) ;
-- plpgsql functions use materialize mode
INSERT INTO foorescan values ( 5004 , 1 , ' abc.5004.1 ' ) ;
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 ;
INSERT INTO foorescan values ( 5005 , 1 , ' abc.5005.1 ' ) ;
INSERT INTO foorescan values ( 5006 , 1 , ' abc.5006.1 ' ) ;
- - invokes ExecReScanFunctionScan - all these cases should materialize the function only once
INSERT INTO foorescan values ( 5007 , 1 , ' abc.5007.1 ' ) ;
-- LEFT JOIN on a condition that the planner can't prove to be true is used to ensure the function
INSERT INTO foorescan values ( 5008 , 1 , ' abc.5008.1 ' ) ;
-- is on the inner path of a nestloop join
INSERT INTO foorescan values ( 5009 , 1 , ' abc.5009.1 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5000 , 2 , ' abc.5000.2 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN foo_sql ( 11 , 13 ) ON ( r + i ) < 100 ;
INSERT INTO foorescan values ( 5001 , 2 , ' abc.5001.2 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5002 , 2 , ' abc.5002.2 ' ) ;
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 ;
INSERT INTO foorescan values ( 5003 , 2 , ' abc.5003.2 ' ) ;
INSERT INTO foorescan values ( 5004 , 2 , ' abc.5004.2 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5005 , 2 , ' abc.5005.2 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN foo_mat ( 11 , 13 ) ON ( r + i ) < 100 ;
INSERT INTO foorescan values ( 5006 , 2 , ' abc.5006.2 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5007 , 2 , ' abc.5007.2 ' ) ;
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 ;
INSERT INTO foorescan values ( 5008 , 2 , ' abc.5008.2 ' ) ;
INSERT INTO foorescan values ( 5009 , 2 , ' abc.5009.2 ' ) ;
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 ;
INSERT INTO foorescan values ( 5000 , 3 , ' abc.5000.3 ' ) ;
INSERT INTO foorescan values ( 5001 , 3 , ' abc.5001.3 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN unnest ( array [ 10 , 20 , 30 ] ) f ( i ) ON ( r + i ) < 100 ;
INSERT INTO foorescan values ( 5002 , 3 , ' abc.5002.3 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN unnest ( array [ 10 , 20 , 30 ] ) WITH ORDINALITY AS f ( i , o ) ON ( r + i ) < 100 ;
INSERT INTO foorescan values ( 5003 , 3 , ' abc.5003.3 ' ) ;
INSERT INTO foorescan values ( 5004 , 3 , ' abc.5004.3 ' ) ;
- - invokes ExecReScanFunctionScan with chgParam ! = NULL ( using implied LATERAL )
INSERT INTO foorescan values ( 5005 , 3 , ' abc.5005.3 ' ) ;
INSERT INTO foorescan values ( 5006 , 3 , ' abc.5006.3 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5007 , 3 , ' abc.5007.3 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_sql ( 10 + r , 13 ) ;
INSERT INTO foorescan values ( 5008 , 3 , ' abc.5008.3 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5009 , 3 , ' abc.5009.3 ' ) ;
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 ) ;
INSERT INTO foorescan values ( 5000 , 4 , ' abc.5000.4 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_sql ( 11 , 10 + r ) ;
INSERT INTO foorescan values ( 5001 , 4 , ' abc.5001.4 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5002 , 4 , ' abc.5002.4 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_sql ( 11 , 10 + r ) WITH ORDINALITY AS f ( i , s , o ) ;
INSERT INTO foorescan values ( 5003 , 4 , ' abc.5003.4 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5004 , 4 , ' abc.5004.4 ' ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , foo_sql ( r1 , r2 ) ;
INSERT INTO foorescan values ( 5005 , 4 , ' abc.5005.4 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5006 , 4 , ' abc.5006.4 ' ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , foo_sql ( r1 , r2 ) WITH ORDINALITY AS f ( i , s , o ) ;
INSERT INTO foorescan values ( 5007 , 4 , ' abc.5007.4 ' ) ;
INSERT INTO foorescan values ( 5008 , 4 , ' abc.5008.4 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5009 , 4 , ' abc.5009.4 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_mat ( 10 + r , 13 ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5000 , 5 , ' abc.5000.5 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_mat ( 10 + r , 13 ) WITH ORDINALITY AS f ( i , s , o ) ;
INSERT INTO foorescan values ( 5001 , 5 , ' abc.5001.5 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5002 , 5 , ' abc.5002.5 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_mat ( 11 , 10 + r ) ;
INSERT INTO foorescan values ( 5003 , 5 , ' abc.5003.5 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5004 , 5 , ' abc.5004.5 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , foo_mat ( 11 , 10 + r ) WITH ORDINALITY AS f ( i , s , o ) ;
INSERT INTO foorescan values ( 5005 , 5 , ' abc.5005.5 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5006 , 5 , ' abc.5006.5 ' ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , foo_mat ( r1 , r2 ) ;
INSERT INTO foorescan values ( 5007 , 5 , ' abc.5007.5 ' ) ;
SELECT setval ( ' foo_rescan_seq ' , 1 , false ) ;
INSERT INTO foorescan values ( 5008 , 5 , ' abc.5008.5 ' ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , foo_mat ( r1 , r2 ) WITH ORDINALITY AS f ( i , s , o ) ;
INSERT INTO foorescan values ( 5009 , 5 , ' abc.5009.5 ' ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , generate_series ( 10 + r , 20 - r ) f ( i ) ;
CREATE FUNCTION foorescan ( int , int ) RETURNS setof foorescan AS ' SELECT * FROM foorescan WHERE fooid >= $1 and fooid < $2 ; ' LANGUAGE SQL ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , generate_series ( 10 + r , 20 - r ) WITH ORDINALITY AS f ( i , o ) ;
- - invokes ExecReScanFunctionScan
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , unnest ( array [ r * 10 , r * 20 , r * 30 ] ) f ( i ) ;
SELECT * FROM foorescan f WHERE f . fooid IN ( SELECT fooid FROM foorescan ( 5002 , 5004 ) ) ORDER BY 1 , 2 ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , unnest ( array [ r * 10 , r * 20 , r * 30 ] ) WITH ORDINALITY AS f ( i , o ) ;
CREATE VIEW vw_foorescan AS SELECT * FROM foorescan ( 5002 , 5004 ) ;
-- deep nesting
- - invokes ExecReScanFunctionScan
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v1 ( r1 ) ,
SELECT * FROM foorescan f WHERE f . fooid IN ( SELECT fooid FROM vw_foorescan ) ORDER BY 1 , 2 ;
LATERAL ( SELECT r1 , * FROM ( VALUES ( 10 ) , ( 20 ) , ( 30 ) ) v2 ( r2 )
LEFT JOIN generate_series ( 21 , 23 ) f ( i ) ON ( ( r2 + i ) < 100 ) OFFSET 0 ) s1 ;
CREATE TABLE barrescan ( fooid int primary key ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v1 ( r1 ) ,
INSERT INTO barrescan values ( 5003 ) ;
LATERAL ( SELECT r1 , * FROM ( VALUES ( 10 ) , ( 20 ) , ( 30 ) ) v2 ( r2 )
INSERT INTO barrescan values ( 5004 ) ;
LEFT JOIN generate_series ( 20 + r1 , 23 ) f ( i ) ON ( ( r2 + i ) < 100 ) OFFSET 0 ) s1 ;
INSERT INTO barrescan values ( 5005 ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v1 ( r1 ) ,
INSERT INTO barrescan values ( 5006 ) ;
LATERAL ( SELECT r1 , * FROM ( VALUES ( 10 ) , ( 20 ) , ( 30 ) ) v2 ( r2 )
INSERT INTO barrescan values ( 5007 ) ;
LEFT JOIN generate_series ( r2 , r2 + 3 ) f ( i ) ON ( ( r2 + i ) < 100 ) OFFSET 0 ) s1 ;
INSERT INTO barrescan values ( 5008 ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v1 ( r1 ) ,
LATERAL ( SELECT r1 , * FROM ( VALUES ( 10 ) , ( 20 ) , ( 30 ) ) v2 ( r2 )
CREATE FUNCTION foorescan ( int ) RETURNS setof foorescan AS ' SELECT * FROM foorescan WHERE fooid = $1; ' LANGUAGE SQL ;
LEFT JOIN generate_series ( r1 , 2 + r2 / 5 ) f ( i ) ON ( ( r2 + i ) < 100 ) OFFSET 0 ) s1 ;
- - invokes ExecReScanFunctionScan with chgParam ! = NULL
DROP FUNCTION foo_sql ( int , int ) ;
SELECT f . * FROM barrescan b , foorescan f WHERE f . fooid = b . fooid AND b . fooid IN ( SELECT fooid FROM foorescan ( b . fooid ) ) ORDER BY 1 , 2 ;
DROP FUNCTION foo_mat ( int , int ) ;
SELECT b . fooid , max ( f . foosubid ) FROM barrescan b , foorescan f WHERE f . fooid = b . fooid AND b . fooid IN ( SELECT fooid FROM foorescan ( b . fooid ) ) GROUP BY b . fooid ORDER BY 1 , 2 ;
DROP SEQUENCE foo_rescan_seq ;
CREATE VIEW fooview1 AS SELECT f . * FROM barrescan b , foorescan f WHERE f . fooid = b . fooid AND b . fooid IN ( SELECT fooid FROM foorescan ( b . fooid ) ) ORDER BY 1 , 2 ;
SELECT * FROM fooview1 AS fv WHERE fv . fooid = 5004 ;
CREATE VIEW fooview2 AS SELECT b . fooid , max ( f . foosubid ) AS maxsubid FROM barrescan b , foorescan f WHERE f . fooid = b . fooid AND b . fooid IN ( SELECT fooid FROM foorescan ( b . fooid ) ) GROUP BY b . fooid ORDER BY 1 , 2 ;
SELECT * FROM fooview2 AS fv WHERE fv . maxsubid = 5 ;
DROP VIEW vw_foorescan ;
DROP VIEW fooview1 ;
DROP VIEW fooview2 ;
DROP FUNCTION foorescan ( int , int ) ;
DROP FUNCTION foorescan ( int ) ;
DROP TABLE foorescan ;
DROP TABLE barrescan ;
- -
- -
-- Test cases involving OUT parameters
-- Test cases involving OUT parameters
@ -414,6 +458,7 @@ language sql stable;
SELECT get_users ( ) ;
SELECT get_users ( ) ;
SELECT * FROM get_users ( ) ;
SELECT * FROM get_users ( ) ;
SELECT * FROM get_users ( ) WITH ORDINALITY ; -- make sure ordinality copes
drop function get_first_user ( ) ;
drop function get_first_user ( ) ;
drop function get_users ( ) ;
drop function get_users ( ) ;