@ -1,29 +1,29 @@
CREATE TABLE foo2 ( foo id int , f2 int ) ;
INSERT INTO foo 2 VALUES ( 1 , 11 ) ;
INSERT INTO foo 2 VALUES ( 2 , 22 ) ;
INSERT INTO foo 2 VALUES ( 1 , 111 ) ;
CREATE TABLE rngfunc2 ( rngfunc id int , f2 int ) ;
INSERT INTO rngfunc 2 VALUES ( 1 , 11 ) ;
INSERT INTO rngfunc 2 VALUES ( 2 , 22 ) ;
INSERT INTO rngfunc 2 VALUES ( 1 , 111 ) ;
CREATE FUNCTION foo t( int ) returns setof foo 2 as ' SELECT * FROM foo2 WHERE foo id = $1 ORDER BY f2; ' LANGUAGE SQL ;
CREATE FUNCTION rngfunc t( int ) returns setof rngfunc 2 as ' SELECT * FROM rngfunc2 WHERE rngfunc id = $1 ORDER BY f2; ' LANGUAGE SQL ;
-- function with ORDINALITY
select * from foo t( 1 ) with ordinality as z ( a , b , ord ) ;
select * from foo t( 1 ) with ordinality as z ( a , b , ord ) where b > 100 ; -- ordinal 2, not 1
select * from rngfunc t( 1 ) with ordinality as z ( a , b , ord ) ;
select * from rngfunc t( 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 foo t( 1 ) with ordinality as z ( a , b , ord ) ;
select a , b , ord from rngfunc t( 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 ) ;
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 foo t( 1 ) with ordinality as z ( a , b , ord ) on ( n = ord ) ;
create temporary view vw_ord as select * from ( values ( 1 ) ) v ( n ) join rngfunc t( 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 ;
-- multiple functions
select * from rows from ( foo t( 1 ) , foo t( 2 ) ) with ordinality as z ( a , b , c , d , ord ) ;
create temporary view vw_ord as select * from ( values ( 1 ) ) v ( n ) join rows from ( foo t( 1 ) , foo t( 2 ) ) with ordinality as z ( a , b , c , d , ord ) on ( n = ord ) ;
select * from rows from ( rngfunc t( 1 ) , rngfunc t( 2 ) ) with ordinality as z ( a , b , c , d , ord ) ;
create temporary view vw_ord as select * from ( values ( 1 ) ) v ( n ) join rows from ( rngfunc t( 1 ) , rngfunc t( 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 ;
@ -48,209 +48,209 @@ drop view vw_ord;
-- ordinality and multiple functions vs. rewind and reverse scan
begin ;
declare foo scroll cursor for select * from rows from ( 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 ;
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 ;
declare rf_cur scroll cursor for select * from rows from ( generate_series ( 1 , 5 ) , generate_series ( 1 , 2 ) ) with ordinality as g ( i , j , o ) ;
fetch all from rf_cur ;
fetch backward all from rf_cur ;
fetch all from rf_cur ;
fetch next from rf_cur ;
fetch next from rf_cur ;
fetch prior from rf_cur ;
fetch absolute 1 from rf_cur ;
fetch next from rf_cur ;
fetch next from rf_cur ;
fetch next from rf_cur ;
fetch prior from rf_cur ;
fetch prior from rf_cur ;
fetch prior from rf_cur ;
commit ;
-- function with implicit LATERAL
select * from foo2 , foot ( foo2 . foo id) z where foo 2. f2 = z . f2 ;
select * from rngfunc2 , rngfunct ( rngfunc2 . rngfunc id) z where rngfunc 2. f2 = z . f2 ;
-- function with implicit LATERAL and explicit ORDINALITY
select * from foo2 , foot ( foo2 . foo id) with ordinality as z ( foo id, f2 , ord ) where foo 2. f2 = z . f2 ;
select * from rngfunc2 , rngfunct ( rngfunc2 . rngfunc id) with ordinality as z ( rngfunc id, f2 , ord ) where rngfunc 2. f2 = z . f2 ;
-- function in subselect
select * from foo 2 where f2 in ( select f2 from foot ( foo2 . foo id) z where z . fooid = foo2 . foo id) ORDER BY 1 , 2 ;
select * from rngfunc 2 where f2 in ( select f2 from rngfunct ( rngfunc2 . rngfunc id) z where z . rngfuncid = rngfunc2 . rngfunc id) ORDER BY 1 , 2 ;
-- function in subselect
select * from foo 2 where f2 in ( select f2 from foo t( 1 ) z where z . fooid = foo2 . foo id) ORDER BY 1 , 2 ;
select * from rngfunc 2 where f2 in ( select f2 from rngfunc t( 1 ) z where z . rngfuncid = rngfunc2 . rngfunc id) ORDER BY 1 , 2 ;
-- function in subselect
select * from foo 2 where f2 in ( select f2 from foot ( foo2 . foo id) z where z . foo id = 1 ) ORDER BY 1 , 2 ;
select * from rngfunc 2 where f2 in ( select f2 from rngfunct ( rngfunc2 . rngfunc id) z where z . rngfunc id = 1 ) ORDER BY 1 , 2 ;
-- nested functions
select foot . fooid , foo t. f2 from foo t( sin ( pi ( ) / 2 ) : : int ) ORDER BY 1 , 2 ;
select rngfunct . rngfuncid , rngfunc t. f2 from rngfunc t( sin ( pi ( ) / 2 ) : : int ) ORDER BY 1 , 2 ;
CREATE TABLE foo ( foo id int , foo subid int , foo name text , primary key ( fooid , foo subid) ) ;
INSERT INTO foo VALUES ( 1 , 1 , ' Joe ' ) ;
INSERT INTO foo VALUES ( 1 , 2 , ' Ed ' ) ;
INSERT INTO foo VALUES ( 2 , 1 , ' Mary ' ) ;
CREATE TABLE rngfunc ( rngfunc id int , rngfunc subid int , rngfunc name text , primary key ( rngfuncid , rngfunc subid) ) ;
INSERT INTO rngfunc VALUES ( 1 , 1 , ' Joe ' ) ;
INSERT INTO rngfunc VALUES ( 1 , 2 , ' Ed ' ) ;
INSERT INTO rngfunc VALUES ( 2 , 1 , ' Mary ' ) ;
-- sql, proretset = f, prorettype = b
CREATE FUNCTION getfoo 1 ( int ) RETURNS int AS ' SELECT $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo 1 ( 1 ) AS t1 ;
SELECT * FROM getfoo 1 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 1 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 1 ( 1 ) WITH ORDINALITY as t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE FUNCTION getrngfunc 1 ( int ) RETURNS int AS ' SELECT $1; ' LANGUAGE SQL ;
SELECT * FROM getrngfunc 1 ( 1 ) AS t1 ;
SELECT * FROM getrngfunc 1 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 1 ( 1 ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 1 ( 1 ) WITH ORDINALITY as t1 ( v , o ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- sql, proretset = t, prorettype = b
CREATE FUNCTION getfoo 2 ( int ) RETURNS setof int AS ' SELECT fooid FROM foo WHERE foo id = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo 2 ( 1 ) AS t1 ;
SELECT * FROM getfoo 2 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 2 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 2 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE FUNCTION getrngfunc 2 ( int ) RETURNS setof int AS ' SELECT rngfuncid FROM rngfunc WHERE rngfunc id = $1; ' LANGUAGE SQL ;
SELECT * FROM getrngfunc 2 ( 1 ) AS t1 ;
SELECT * FROM getrngfunc 2 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 2 ( 1 ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 2 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- sql, proretset = t, prorettype = b
CREATE FUNCTION getfoo 3 ( int ) RETURNS setof text AS ' SELECT fooname FROM foo WHERE foo id = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo 3 ( 1 ) AS t1 ;
SELECT * FROM getfoo 3 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 3 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 3 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE FUNCTION getrngfunc 3 ( int ) RETURNS setof text AS ' SELECT rngfuncname FROM rngfunc WHERE rngfunc id = $1; ' LANGUAGE SQL ;
SELECT * FROM getrngfunc 3 ( 1 ) AS t1 ;
SELECT * FROM getrngfunc 3 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 3 ( 1 ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 3 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- sql, proretset = f, prorettype = c
CREATE FUNCTION getfoo 4 ( int ) RETURNS foo AS ' SELECT * FROM foo WHERE foo id = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo 4 ( 1 ) AS t1 ;
SELECT * FROM getfoo 4 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 4 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 4 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE FUNCTION getrngfunc 4 ( int ) RETURNS rngfunc AS ' SELECT * FROM rngfunc WHERE rngfunc id = $1; ' LANGUAGE SQL ;
SELECT * FROM getrngfunc 4 ( 1 ) AS t1 ;
SELECT * FROM getrngfunc 4 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 4 ( 1 ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 4 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- sql, proretset = t, prorettype = c
CREATE FUNCTION getfoo 5 ( int ) RETURNS setof foo AS ' SELECT * FROM foo WHERE foo id = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo 5 ( 1 ) AS t1 ;
SELECT * FROM getfoo 5 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 5 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 5 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE FUNCTION getrngfunc 5 ( int ) RETURNS setof rngfunc AS ' SELECT * FROM rngfunc WHERE rngfunc id = $1; ' LANGUAGE SQL ;
SELECT * FROM getrngfunc 5 ( 1 ) AS t1 ;
SELECT * FROM getrngfunc 5 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 5 ( 1 ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 5 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- sql, proretset = f, prorettype = record
CREATE FUNCTION getfoo 6 ( int ) RETURNS RECORD AS ' SELECT * FROM foo WHERE foo id = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo 6 ( 1 ) AS t1 ( foo id int , foo subid int , foo name text ) ;
SELECT * FROM ROWS FROM ( getfoo 6 ( 1 ) AS ( foo id int , foo subid int , foo name text ) ) WITH ORDINALITY ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 6 ( 1 ) AS
( foo id int , foo subid int , foo name text ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS
SELECT * FROM ROWS FROM ( getfoo 6 ( 1 ) AS ( foo id int , foo subid int , foo name text ) )
CREATE FUNCTION getrngfunc 6 ( int ) RETURNS RECORD AS ' SELECT * FROM rngfunc WHERE rngfunc id = $1; ' LANGUAGE SQL ;
SELECT * FROM getrngfunc 6 ( 1 ) AS t1 ( rngfunc id int , rngfunc subid int , rngfunc name text ) ;
SELECT * FROM ROWS FROM ( getrngfunc 6 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) ) WITH ORDINALITY ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 6 ( 1 ) AS
( rngfunc id int , rngfunc subid int , rngfunc name text ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS
SELECT * FROM ROWS FROM ( getrngfunc 6 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) )
WITH ORDINALITY ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- sql, proretset = t, prorettype = record
CREATE FUNCTION getfoo 7 ( int ) RETURNS setof record AS ' SELECT * FROM foo WHERE foo id = $1; ' LANGUAGE SQL ;
SELECT * FROM getfoo 7 ( 1 ) AS t1 ( foo id int , foo subid int , foo name text ) ;
SELECT * FROM ROWS FROM ( getfoo 7 ( 1 ) AS ( foo id int , foo subid int , foo name text ) ) WITH ORDINALITY ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 7 ( 1 ) AS
( foo id int , foo subid int , foo name text ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS
SELECT * FROM ROWS FROM ( getfoo 7 ( 1 ) AS ( foo id int , foo subid int , foo name text ) )
CREATE FUNCTION getrngfunc 7 ( int ) RETURNS setof record AS ' SELECT * FROM rngfunc WHERE rngfunc id = $1; ' LANGUAGE SQL ;
SELECT * FROM getrngfunc 7 ( 1 ) AS t1 ( rngfunc id int , rngfunc subid int , rngfunc name text ) ;
SELECT * FROM ROWS FROM ( getrngfunc 7 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) ) WITH ORDINALITY ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 7 ( 1 ) AS
( rngfunc id int , rngfunc subid int , rngfunc name text ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS
SELECT * FROM ROWS FROM ( getrngfunc 7 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) )
WITH ORDINALITY ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- plpgsql, proretset = f, prorettype = b
CREATE FUNCTION getfoo 8 ( int ) RETURNS int AS ' DECLARE fooint int; BEGIN SELECT fooid into fooint FROM foo WHERE fooid = $1; RETURN foo int; END; ' LANGUAGE plpgsql ;
SELECT * FROM getfoo 8 ( 1 ) AS t1 ;
SELECT * FROM getfoo 8 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 8 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 8 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE FUNCTION getrngfunc 8 ( int ) RETURNS int AS ' DECLARE rngfuncint int; BEGIN SELECT rngfuncid into rngfuncint FROM rngfunc WHERE rngfuncid = $1; RETURN rngfunc int; END; ' LANGUAGE plpgsql ;
SELECT * FROM getrngfunc 8 ( 1 ) AS t1 ;
SELECT * FROM getrngfunc 8 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 8 ( 1 ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 8 ( 1 ) WITH ORDINALITY AS t1 ( v , o ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- plpgsql, proretset = f, prorettype = c
CREATE FUNCTION getfoo 9 ( int ) RETURNS foo AS ' DECLARE footup foo%ROWTYPE; BEGIN SELECT * into footup FROM foo WHERE fooid = $1; RETURN foo tup; END; ' LANGUAGE plpgsql ;
SELECT * FROM getfoo 9 ( 1 ) AS t1 ;
SELECT * FROM getfoo 9 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 9 ( 1 ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE VIEW vw_getfoo AS SELECT * FROM getfoo 9 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getfoo ;
DROP VIEW vw_getfoo ;
CREATE FUNCTION getrngfunc 9 ( int ) RETURNS rngfunc AS ' DECLARE rngfunctup rngfunc%ROWTYPE; BEGIN SELECT * into rngfunctup FROM rngfunc WHERE rngfuncid = $1; RETURN rngfunc tup; END; ' LANGUAGE plpgsql ;
SELECT * FROM getrngfunc 9 ( 1 ) AS t1 ;
SELECT * FROM getrngfunc 9 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 9 ( 1 ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc 9 ( 1 ) WITH ORDINALITY AS t1 ( a , b , c , o ) ;
SELECT * FROM vw_getrngfunc ;
DROP VIEW vw_getrngfunc ;
-- mix 'n match kinds, to exercise expandRTE and related logic
select * from rows from ( getfoo 1 ( 1 ) , getfoo 2 ( 1 ) , getfoo 3 ( 1 ) , getfoo 4 ( 1 ) , getfoo 5 ( 1 ) ,
getfoo 6 ( 1 ) AS ( foo id int , foo subid int , foo name text ) ,
getfoo 7 ( 1 ) AS ( foo id int , foo subid int , foo name text ) ,
getfoo 8 ( 1 ) , getfoo 9 ( 1 ) )
select * from rows from ( getrngfunc 1 ( 1 ) , getrngfunc 2 ( 1 ) , getrngfunc 3 ( 1 ) , getrngfunc 4 ( 1 ) , getrngfunc 5 ( 1 ) ,
getrngfunc 6 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) ,
getrngfunc 7 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) ,
getrngfunc 8 ( 1 ) , getrngfunc 9 ( 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 rows from ( getfoo 9 ( 1 ) , getfoo 8 ( 1 ) ,
getfoo 7 ( 1 ) AS ( foo id int , foo subid int , foo name text ) ,
getfoo 6 ( 1 ) AS ( foo id int , foo subid int , foo name text ) ,
getfoo 5 ( 1 ) , getfoo 4 ( 1 ) , getfoo 3 ( 1 ) , getfoo 2 ( 1 ) , getfoo 1 ( 1 ) )
select * from rows from ( getrngfunc 9 ( 1 ) , getrngfunc 8 ( 1 ) ,
getrngfunc 7 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) ,
getrngfunc 6 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) ,
getrngfunc 5 ( 1 ) , getrngfunc 4 ( 1 ) , getrngfunc 3 ( 1 ) , getrngfunc 2 ( 1 ) , getrngfunc 1 ( 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 rows from ( getfoo 9 ( 1 ) ,
getfoo 7 ( 1 ) AS ( foo id int , foo subid int , foo name text ) ,
getfoo 1 ( 1 ) )
create temporary view vw_rngfunc as
select * from rows from ( getrngfunc 9 ( 1 ) ,
getrngfunc 7 ( 1 ) AS ( rngfunc id int , rngfunc subid int , rngfunc name text ) ,
getrngfunc 1 ( 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 getfoo 1 ( int ) ;
DROP FUNCTION getfoo 2 ( int ) ;
DROP FUNCTION getfoo 3 ( int ) ;
DROP FUNCTION getfoo 4 ( int ) ;
DROP FUNCTION getfoo 5 ( int ) ;
DROP FUNCTION getfoo 6 ( int ) ;
DROP FUNCTION getfoo 7 ( int ) ;
DROP FUNCTION getfoo 8 ( int ) ;
DROP FUNCTION getfoo 9 ( int ) ;
DROP FUNCTION foo t( int ) ;
DROP TABLE foo 2;
DROP TABLE foo ;
select * from vw_rngfunc ;
select pg_get_viewdef ( ' vw_rngfunc ' ) ;
drop view vw_rngfunc ;
DROP FUNCTION getrngfunc 1 ( int ) ;
DROP FUNCTION getrngfunc 2 ( int ) ;
DROP FUNCTION getrngfunc 3 ( int ) ;
DROP FUNCTION getrngfunc 4 ( int ) ;
DROP FUNCTION getrngfunc 5 ( int ) ;
DROP FUNCTION getrngfunc 6 ( int ) ;
DROP FUNCTION getrngfunc 7 ( int ) ;
DROP FUNCTION getrngfunc 8 ( int ) ;
DROP FUNCTION getrngfunc 9 ( int ) ;
DROP FUNCTION rngfunc t( int ) ;
DROP TABLE rngfunc 2;
DROP TABLE rngfunc ;
-- Rescan tests --
CREATE TEMPORARY SEQUENCE foo _rescan_seq1;
CREATE TEMPORARY SEQUENCE foo _rescan_seq2;
CREATE TYPE foo _rescan_t AS ( i integer , s bigint ) ;
CREATE TEMPORARY SEQUENCE rngfunc _rescan_seq1;
CREATE TEMPORARY SEQUENCE rngfunc _rescan_seq2;
CREATE TYPE rngfunc _rescan_t AS ( i integer , s bigint ) ;
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 ;
CREATE FUNCTION rngfunc _sql( int , int ) RETURNS setof rngfunc _rescan_t AS ' SELECT i, nextval( '' rngfunc _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_seq2'' )); end loop; end; ' LANGUAGE plpgsql ;
CREATE FUNCTION rngfunc _mat( int , int ) RETURNS setof rngfunc _rescan_t AS ' begin for i in $1..$2 loop return next (i, nextval( '' rngfunc _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_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_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 ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN rngfunc _sql( 11 , 13 ) ON ( r + i ) < 100 ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN rngfunc _sql( 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 foo _mat( 11 , 13 ) 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 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 ROWS FROM ( foo _sql( 11 , 13 ) , foo _mat( 11 , 13 ) ) WITH ORDINALITY AS f ( i1 , s1 , i2 , s2 , o ) ON ( r + i1 + i2 ) < 100 ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN rngfunc _mat( 11 , 13 ) ON ( r + i ) < 100 ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN rngfunc _mat( 11 , 13 ) WITH ORDINALITY AS f ( i , s , o ) ON ( r + i ) < 100 ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) LEFT JOIN ROWS FROM ( rngfunc _sql( 11 , 13 ) , rngfunc _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 ;
@ -260,43 +260,43 @@ 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_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_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_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_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_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_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_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_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_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_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_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_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 ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , rngfunc _sql( 10 + r , 13 ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , rngfunc _sql( 10 + r , 13 ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , rngfunc _sql( 11 , 10 + r ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , rngfunc _sql( 11 , 10 + r ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , rngfunc _sql( r1 , r2 ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , rngfunc _sql( r1 , r2 ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , rngfunc _mat( 10 + r , 13 ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , rngfunc _mat( 10 + r , 13 ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , rngfunc _mat( 11 , 10 + r ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , rngfunc _mat( 11 , 10 + r ) WITH ORDINALITY AS f ( i , s , o ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , rngfunc _mat( r1 , r2 ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 11 , 12 ) , ( 13 , 15 ) , ( 16 , 20 ) ) v ( r1 , r2 ) , rngfunc _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 ) , ROWS FROM ( 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 ) , ROWS FROM ( 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 ) , ROWS FROM ( foo _sql( 10 + r , 13 ) , foo _mat( 10 + r , 13 ) ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , ROWS FROM ( rngfunc _sql( 11 , 11 ) , rngfunc _mat( 10 + r , 13 ) ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , ROWS FROM ( rngfunc _sql( 10 + r , 13 ) , rngfunc _mat( 11 , 11 ) ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM ( VALUES ( 1 ) , ( 2 ) , ( 3 ) ) v ( r ) , ROWS FROM ( rngfunc _sql( 10 + r , 13 ) , rngfunc _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 , ROWS FROM ( foo _sql( 10 + r1 , 13 ) , foo _mat( 10 + r2 , 13 ) ) ;
SELECT setval ( ' rngfunc _rescan_seq1' , 1 , false ) , setval ( ' rngfunc _rescan_seq2' , 1 , false ) ;
SELECT * FROM generate_series ( 1 , 2 ) r1 , generate_series ( r1 , 3 ) r2 , ROWS FROM ( rngfunc _sql( 10 + r1 , 13 ) , rngfunc _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 ) ;
@ -319,50 +319,50 @@ SELECT * FROM (VALUES (1),(2),(3)) v1(r1),
LATERAL ( SELECT r1 , * FROM ( VALUES ( 10 ) , ( 20 ) , ( 30 ) ) v2 ( r2 )
LEFT JOIN generate_series ( r1 , 2 + r2 / 5 ) f ( i ) ON ( ( r2 + i ) < 100 ) OFFSET 0 ) s1 ;
DROP FUNCTION foo _sql( int , int ) ;
DROP FUNCTION foo _mat( int , int ) ;
DROP SEQUENCE foo _rescan_seq1;
DROP SEQUENCE foo _rescan_seq2;
DROP FUNCTION rngfunc _sql( int , int ) ;
DROP FUNCTION rngfunc _mat( int , int ) ;
DROP SEQUENCE rngfunc _rescan_seq1;
DROP SEQUENCE rngfunc _rescan_seq2;
- -
-- Test cases involving OUT parameters
- -
CREATE FUNCTION foo ( in f1 int , out f2 int )
CREATE FUNCTION rngfunc ( in f1 int , out f2 int )
AS ' select $1+1 ' LANGUAGE sql ;
SELECT foo ( 42 ) ;
SELECT * FROM foo ( 42 ) ;
SELECT * FROM foo ( 42 ) AS p ( x ) ;
SELECT rngfunc ( 42 ) ;
SELECT * FROM rngfunc ( 42 ) ;
SELECT * FROM rngfunc ( 42 ) AS p ( x ) ;
-- explicit spec of return type is OK
CREATE OR REPLACE FUNCTION foo ( in f1 int , out f2 int ) RETURNS int
CREATE OR REPLACE FUNCTION rngfunc ( in f1 int , out f2 int ) RETURNS int
AS ' select $1+1 ' LANGUAGE sql ;
-- error, wrong result type
CREATE OR REPLACE FUNCTION foo ( in f1 int , out f2 int ) RETURNS float
CREATE OR REPLACE FUNCTION rngfunc ( in f1 int , out f2 int ) RETURNS float
AS ' select $1+1 ' LANGUAGE sql ;
-- with multiple OUT params you must get a RECORD result
CREATE OR REPLACE FUNCTION foo ( in f1 int , out f2 int , out f3 text ) RETURNS int
CREATE OR REPLACE FUNCTION rngfunc ( in f1 int , out f2 int , out f3 text ) RETURNS int
AS ' select $1+1 ' LANGUAGE sql ;
CREATE OR REPLACE FUNCTION foo ( in f1 int , out f2 int , out f3 text )
CREATE OR REPLACE FUNCTION rngfunc ( in f1 int , out f2 int , out f3 text )
RETURNS record
AS ' select $1+1 ' LANGUAGE sql ;
CREATE OR REPLACE FUNCTION foo r( in f1 int , out f2 int , out text )
CREATE OR REPLACE FUNCTION rngfunc r( in f1 int , out f2 int , out text )
AS $ $ select $ 1 - 1 , $ 1 : : text | | ' z ' $ $ LANGUAGE sql ;
SELECT f1 , foo r( f1 ) FROM int4_tbl ;
SELECT * FROM foo r( 42 ) ;
SELECT * FROM foo r( 42 ) AS p ( a , b ) ;
SELECT f1 , rngfunc r( f1 ) FROM int4_tbl ;
SELECT * FROM rngfunc r( 42 ) ;
SELECT * FROM rngfunc r( 42 ) AS p ( a , b ) ;
CREATE OR REPLACE FUNCTION foo b( in f1 int , inout f2 int , out text )
CREATE OR REPLACE FUNCTION rngfunc b( in f1 int , inout f2 int , out text )
AS $ $ select $ 2 - 1 , $ 1 : : text | | ' z ' $ $ LANGUAGE sql ;
SELECT f1 , foo b( f1 , f1 / 2 ) FROM int4_tbl ;
SELECT * FROM foo b( 42 , 99 ) ;
SELECT * FROM foo b( 42 , 99 ) AS p ( a , b ) ;
SELECT f1 , rngfunc b( f1 , f1 / 2 ) FROM int4_tbl ;
SELECT * FROM rngfunc b( 42 , 99 ) ;
SELECT * FROM rngfunc b( 42 , 99 ) AS p ( a , b ) ;
-- Can reference function with or without OUT params for DROP, etc
DROP FUNCTION foo ( int ) ;
DROP FUNCTION foo r( in f2 int , out f1 int , out text ) ;
DROP FUNCTION foo b( in f1 int , inout f2 int ) ;
DROP FUNCTION rngfunc ( int ) ;
DROP FUNCTION rngfunc r( in f2 int , out f1 int , out text ) ;
DROP FUNCTION rngfunc b( in f1 int , inout f2 int ) ;
- -
-- For my next trick, polymorphic OUT parameters
@ -396,26 +396,26 @@ AS 'select $1, array[$1,$1]' LANGUAGE sql;
-- table functions
- -
CREATE OR REPLACE FUNCTION foo ( )
CREATE OR REPLACE FUNCTION rngfunc ( )
RETURNS TABLE ( a int )
AS $ $ SELECT a FROM generate_series ( 1 , 5 ) a ( a ) $ $ LANGUAGE sql ;
SELECT * FROM foo ( ) ;
DROP FUNCTION foo ( ) ;
SELECT * FROM rngfunc ( ) ;
DROP FUNCTION rngfunc ( ) ;
CREATE OR REPLACE FUNCTION foo ( int )
CREATE OR REPLACE FUNCTION rngfunc ( int )
RETURNS TABLE ( a int , b int )
AS $ $ SELECT a , b
FROM generate_series ( 1 , $ 1 ) a ( a ) ,
generate_series ( 1 , $ 1 ) b ( b ) $ $ LANGUAGE sql ;
SELECT * FROM foo ( 3 ) ;
DROP FUNCTION foo ( int ) ;
SELECT * FROM rngfunc ( 3 ) ;
DROP FUNCTION rngfunc ( int ) ;
-- case that causes change of typmod knowledge during inlining
CREATE OR REPLACE FUNCTION foo ( )
CREATE OR REPLACE FUNCTION rngfunc ( )
RETURNS TABLE ( a varchar ( 5 ) )
AS $ $ SELECT ' hello ' : : varchar ( 5 ) $ $ LANGUAGE sql STABLE ;
SELECT * FROM foo ( ) GROUP BY 1 ;
DROP FUNCTION foo ( ) ;
SELECT * FROM rngfunc ( ) GROUP BY 1 ;
DROP FUNCTION rngfunc ( ) ;
- -
-- some tests on SQL functions with RETURNING
@ -477,17 +477,17 @@ select * from tt;
select * from tt_log ;
-- test case for a whole-row-variable bug
create function foo 1( n integer , out a text , out b text )
create function rngfunc 1( n integer , out a text , out b text )
returns setof record
language sql
as $ $ select ' foo ' | | i , ' bar ' | | i from generate_series ( 1 , $ 1 ) i $ $ ;
set work_mem = ' 64kB ' ;
select t . a , t , t . a from foo 1( 10000 ) t limit 1 ;
select t . a , t , t . a from rngfunc 1( 10000 ) t limit 1 ;
reset work_mem ;
select t . a , t , t . a from foo 1( 10000 ) t limit 1 ;
select t . a , t , t . a from rngfunc 1( 10000 ) t limit 1 ;
drop function foo 1( n integer ) ;
drop function rngfunc 1( n integer ) ;
-- test use of SQL functions returning record
-- this is supported in some cases where the query doesn't specify
@ -501,27 +501,27 @@ select array_to_set(array['one', 'two']);
select * from array_to_set ( array [ ' one ' , ' two ' ] ) as t ( f1 int , f2 text ) ;
select * from array_to_set ( array [ ' one ' , ' two ' ] ) ; -- fail
create temp table foo ( f1 int8 , f2 int8 ) ;
create temp table rngfunc ( f1 int8 , f2 int8 ) ;
create function testfoo ( ) returns record as $ $
insert into foo values ( 1 , 2 ) returning * ;
create function testrngfunc ( ) returns record as $ $
insert into rngfunc values ( 1 , 2 ) returning * ;
$ $ language sql ;
select testfoo ( ) ;
select * from testfoo ( ) as t ( f1 int8 , f2 int8 ) ;
select * from testfoo ( ) ; -- fail
select testrngfunc ( ) ;
select * from testrngfunc ( ) as t ( f1 int8 , f2 int8 ) ;
select * from testrngfunc ( ) ; -- fail
drop function testfoo ( ) ;
drop function testrngfunc ( ) ;
create function testfoo ( ) returns setof record as $ $
insert into foo values ( 1 , 2 ) , ( 3 , 4 ) returning * ;
create function testrngfunc ( ) returns setof record as $ $
insert into rngfunc values ( 1 , 2 ) , ( 3 , 4 ) returning * ;
$ $ language sql ;
select testfoo ( ) ;
select * from testfoo ( ) as t ( f1 int8 , f2 int8 ) ;
select * from testfoo ( ) ; -- fail
select testrngfunc ( ) ;
select * from testrngfunc ( ) as t ( f1 int8 , f2 int8 ) ;
select * from testrngfunc ( ) ; -- fail
drop function testfoo ( ) ;
drop function testrngfunc ( ) ;
- -
-- Check some cases involving added/dropped columns in a rowtype result
@ -572,33 +572,33 @@ drop table users;
-- this won't get inlined because of type coercion, but it shouldn't fail
create or replace function foo bar( ) returns setof text as
create or replace function rngfunc bar( ) returns setof text as
$ $ select ' foo ' : : varchar union all select ' bar ' : : varchar ; $ $
language sql stable ;
select foo bar( ) ;
select * from foo bar( ) ;
select rngfunc bar( ) ;
select * from rngfunc bar( ) ;
drop function foo bar( ) ;
drop function rngfunc bar( ) ;
-- check handling of a SQL function with multiple OUT params (bug #5777)
create or replace function foo bar( out integer , out numeric ) as
create or replace function rngfunc bar( out integer , out numeric ) as
$ $ select ( 1 , 2 . 1 ) $ $ language sql ;
select * from foo bar( ) ;
select * from rngfunc bar( ) ;
create or replace function foo bar( out integer , out numeric ) as
create or replace function rngfunc bar( out integer , out numeric ) as
$ $ select ( 1 , 2 ) $ $ language sql ;
select * from foo bar( ) ; -- fail
select * from rngfunc bar( ) ; -- fail
create or replace function foo bar( out integer , out numeric ) as
create or replace function rngfunc bar( out integer , out numeric ) as
$ $ select ( 1 , 2 . 1 , 3 ) $ $ language sql ;
select * from foo bar( ) ; -- fail
select * from rngfunc bar( ) ; -- fail
drop function foo bar( ) ;
drop function rngfunc bar( ) ;
-- check whole-row-Var handling in nested lateral functions (bug #11703)
@ -633,11 +633,11 @@ select x from int8_tbl, extractq2_2_opt(int8_tbl) f(x);
-- check handling of nulls in SRF results (bug #7808)
create type foo 2 as ( a integer , b text ) ;
create type rngfunc 2 as ( a integer , b text ) ;
select * , row_to_json ( u ) from unnest ( array [ ( 1 , ' foo ' ) : : foo 2, null : : foo 2] ) u ;
select * , row_to_json ( u ) from unnest ( array [ null : : foo 2, null : : foo 2] ) u ;
select * , row_to_json ( u ) from unnest ( array [ null : : foo 2, ( 1 , ' foo ' ) : : foo 2, null : : foo 2] ) u ;
select * , row_to_json ( u ) from unnest ( array [ ] : : foo 2[ ] ) u ;
select * , row_to_json ( u ) from unnest ( array [ ( 1 , ' foo ' ) : : rngfunc 2, null : : rngfunc 2] ) u ;
select * , row_to_json ( u ) from unnest ( array [ null : : rngfunc 2, null : : rngfunc 2] ) u ;
select * , row_to_json ( u ) from unnest ( array [ null : : rngfunc 2, ( 1 , ' foo ' ) : : rngfunc 2, null : : rngfunc 2] ) u ;
select * , row_to_json ( u ) from unnest ( array [ ] : : rngfunc 2[ ] ) u ;
drop type foo 2;
drop type rngfunc 2;