drop extension if exists pg_query_rewrite; -- create extension pg_query_rewrite; select pgqr_truncate_rule(); pgqr_truncate_rule -------------------- t (1 row) -- -- drop table if exists t; create table t(i int); -- drop function if exists fs(in int, out int); NOTICE: function fs(pg_catalog.int4) does not exist, skipping create function fs(IN p int, OUT i int) returns int as $$ begin insert into t(i) values (fs.p) returning t.i into fs.i; end$$ language plpgsql; -- select fs(1); fs ---- 1 (1 row) select * from t; i --- 1 (1 row) select pgqr_rules(); pgqr_rules -------------------------------------------------------- (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (10 rows) -- select pgqr_add_rule('insert into t(i) values (fs.p) returning t.i', 'insert into t(i) values(2) returning t.i'); pgqr_add_rule --------------- t (1 row) -- drop function fs(in int, out int); create function fs(IN p int, OUT i int) returns int as $$ begin insert into t(i) values (fs.p) returning t.i into fs.i; end$$ language plpgsql; -- select fs(1); fs ---- 2 (1 row) select * from t; i --- 1 2 (2 rows) select pgqr_rules(); pgqr_rules ------------------------------------------------------------------------------------------------------------------------------------------------------ (datname=contrib_regression,"source=insert into t(i) values (fs.p) returning t.i","target=insert into t(i) values(2) returning t.i",rewrite_count=1) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (10 rows) -- -- -- truncate table t; select fs(1); fs ---- 2 (1 row) select * from t; i --- 2 (1 row) -- drop function if exists fd(in int, out int); NOTICE: function fd(pg_catalog.int4) does not exist, skipping create function fd(IN p int, OUT i int) returns int as $$ begin execute 'select count(*) from t where i = ' || p into fd.i using fd.p; end$$ language plpgsql; -- select fd(2); fd ---- 1 (1 row) select * from t; i --- 2 (1 row) select pgqr_rules(); pgqr_rules ------------------------------------------------------------------------------------------------------------------------------------------------------ (datname=contrib_regression,"source=insert into t(i) values (fs.p) returning t.i","target=insert into t(i) values(2) returning t.i",rewrite_count=2) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (10 rows) -- select pgqr_add_rule('select count(*) from t where i = 2', 'select count(*) from t where i = 3'); pgqr_add_rule --------------- t (1 row) -- select fd(2); fd ---- 0 (1 row) select * from t; i --- 2 (1 row) select pgqr_rules(); pgqr_rules ------------------------------------------------------------------------------------------------------------------------------------------------------ (datname=contrib_regression,"source=insert into t(i) values (fs.p) returning t.i","target=insert into t(i) values(2) returning t.i",rewrite_count=2) (datname=contrib_regression,"source=select count(*) from t where i = 2","target=select count(*) from t where i = 3",rewrite_count=1) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (datname=NULL,source=NULL,target=NULL,rewrite_count=0) (10 rows)