blob: 3a348a598e1b0ea51f58c179c90cd048eae53c85 [file] [log] [blame]
-- gp_dump_query_oids() doesn't list built-in functions, so we need a UDF to test with.
CREATE FUNCTION dumptestfunc(t text) RETURNS integer AS $$ SELECT 123 $$ LANGUAGE SQL;
CREATE FUNCTION dumptestfunc2(t text) RETURNS integer AS $$ SELECT 123 $$ LANGUAGE SQL;
create table base(a int);
create materialized view base_mv as select a from base;
create view base_v as select a from base;
CREATE SEQUENCE minirepro_test_b;
CREATE TABLE minirepro_test(a serial, b int default nextval('minirepro_test_b'));
-- The function returns OIDs. We need to replace them with something reproducable.
CREATE FUNCTION sanitize_output(t text) RETURNS text AS $$
declare
dumptestfunc_oid oid;
dumptestfunc2_oid oid;
base_oid oid;
base_mv_oid oid;
base_v_oid oid;
minirepro_test_oid oid;
minirepro_test_b_oid oid;
minirepro_test_a_seq_oid oid;
begin
dumptestfunc_oid = 'dumptestfunc'::regproc::oid;
dumptestfunc2_oid = 'dumptestfunc2'::regproc::oid;
base_oid = 'base'::regclass::oid;
base_mv_oid = 'base_mv'::regclass::oid;
base_v_oid = 'base_v'::regclass::oid;
minirepro_test_oid = 'minirepro_test'::regclass::oid;
minirepro_test_b_oid = 'minirepro_test_b'::regclass::oid;
minirepro_test_a_seq_oid = 'minirepro_test_a_seq'::regclass::oid;
t := replace(t, dumptestfunc_oid::text, '<dumptestfunc>');
t := replace(t, dumptestfunc2_oid::text, '<dumptestfunc2>');
t := replace(t, base_oid::text, '<base_table>');
t := replace(t, base_mv_oid::text, '<base_mv>');
t := replace(t, base_v_oid::text, '<base_v>');
t := replace(t, minirepro_test_oid::text, '<minirepro_test>');
t := replace(t, minirepro_test_b_oid::text, '<minirepro_test_b>');
t := replace(t, minirepro_test_a_seq_oid::text, '<minirepro_test_a_seq>');
RETURN t;
end;
$$ LANGUAGE plpgsql;
-- Test the built-in gp_dump_query function.
SELECT sanitize_output(gp_dump_query_oids('SELECT 123'));
SELECT sanitize_output(gp_dump_query_oids('SELECT * FROM pg_proc'));
SELECT sanitize_output(gp_dump_query_oids('SELECT length(proname) FROM pg_proc'));
SELECT sanitize_output(gp_dump_query_oids('SELECT dumptestfunc(proname) FROM pg_proc'));
-- with EXPLAIN
SELECT sanitize_output(gp_dump_query_oids('explain SELECT dumptestfunc(proname) FROM pg_proc'));
-- with a multi-query statement
SELECT sanitize_output(gp_dump_query_oids('SELECT dumptestfunc(proname) FROM pg_proc; SELECT dumptestfunc2(relname) FROM pg_class'));
-- Test error reporting on an invalid query.
SELECT gp_dump_query_oids('SELECT * FROM nonexistent_table');
SELECT gp_dump_query_oids('SELECT with syntax error');
-- Test partition and inherited tables
CREATE TABLE minirepro_partition_test (id int, info json);
CREATE TABLE foo (id int, year int, a int, b int, c int, d int, region text)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
SUBPARTITION BY RANGE (a)
SUBPARTITION TEMPLATE (
START (1) END (2) EVERY (1),
DEFAULT SUBPARTITION other_a )
SUBPARTITION BY RANGE (b)
SUBPARTITION TEMPLATE (
START (1) END (2) EVERY (1),
DEFAULT SUBPARTITION other_b )
( START (2002) END (2003) EVERY (1),
DEFAULT PARTITION outlying_years );
CREATE TABLE ptable (c1 text, c2 float);
CREATE TABLE ctable (c3 char(2)) INHERITS (ptable);
CREATE TABLE cctable (c4 char(2)) INHERITS (ctable);
INSERT INTO minirepro_partition_test VALUES (1, (select gp_dump_query_oids('SELECT * FROM foo') ) :: json);
INSERT INTO minirepro_partition_test VALUES (2, (select gp_dump_query_oids('SELECT * FROM ptable') ) :: json);
INSERT INTO minirepro_partition_test VALUES (3, (select gp_dump_query_oids('SELECT * FROM pg_class') ) :: json);
SELECT array['foo'::regclass::oid::text,
'foo_1_prt_outlying_years'::regclass::oid::text,
'foo_1_prt_outlying_years_2_prt_other_a'::regclass::oid::text,
'foo_1_prt_outlying_years_2_prt_other_a_3_prt_other_b'::regclass::oid::text,
'foo_1_prt_outlying_years_2_prt_other_a_3_prt_2'::regclass::oid::text,
'foo_1_prt_outlying_years_2_prt_2'::regclass::oid::text,
'foo_1_prt_outlying_years_2_prt_2_3_prt_other_b'::regclass::oid::text,
'foo_1_prt_outlying_years_2_prt_2_3_prt_2'::regclass::oid::text,
'foo_1_prt_2'::regclass::oid::text,
'foo_1_prt_2_2_prt_other_a'::regclass::oid::text,
'foo_1_prt_2_2_prt_other_a_3_prt_other_b'::regclass::oid::text,
'foo_1_prt_2_2_prt_other_a_3_prt_2'::regclass::oid::text,
'foo_1_prt_2_2_prt_2'::regclass::oid::text,
'foo_1_prt_2_2_prt_2_3_prt_other_b'::regclass::oid::text,
'foo_1_prt_2_2_prt_2_3_prt_2'::regclass::oid::text] <@ (string_to_array((SELECT info->>'relids' FROM minirepro_partition_test WHERE id = 1),','));
SELECT array['ptable'::regclass::oid::text,
'ctable'::regclass::oid::text,
'cctable'::regclass::oid::text] <@ (string_to_array((SELECT info->>'relids' FROM minirepro_partition_test WHERE id = 2),','));
SELECT array['pg_class'::regclass::oid::text] <@ (string_to_array((SELECT info->>'relids' FROM minirepro_partition_test WHERE id = 3),','));
SELECT sanitize_output(gp_dump_query_oids('SELECT * FROM base_mv'));
SELECT sanitize_output(gp_dump_query_oids('SELECT * FROM base_v'));
-- gp_dump_query_oids should output relids of view/materialized view and used/accessed objects when query contains explain command
SELECT sanitize_output(gp_dump_query_oids('EXPLAIN SELECT * FROM base_mv'));
SELECT sanitize_output(gp_dump_query_oids('EXPLAIN SELECT * FROM base_v'));
-- gp_dump_query_oids should output relids of view/materialized view and used/accessed objects when query contains explain analyze command
SELECT sanitize_output(gp_dump_query_oids('EXPLAIN ANALYZE SELECT * FROM base_mv'));
SELECT sanitize_output(gp_dump_query_oids('EXPLAIN ANALYZE SELECT * FROM base_v'));
-- gp_dump_query_oids should output relids of referenced sequences
SELECT sanitize_output(gp_dump_query_oids('SELECT * FROM minirepro_test'));
DROP TABLE minirepro_test;
DROP SEQUENCE minirepro_test_b;
DROP TABLE foo;
DROP TABLE cctable;
DROP TABLE ctable;
DROP TABLE ptable;
DROP TABLE minirepro_partition_test;
DROP FUNCTION dumptestfunc(text);
DROP FUNCTION dumptestfunc2(text);