--
-- TEMP
-- Test temp relations and indexes
--

-- test temp table/index masking

CREATE TABLE temptest(col int);

-- CREATE INDEX i_temptest ON temptest(col);

CREATE TEMP TABLE temptest(tcol int);

-- CREATE INDEX i_temptest ON temptest(tcol);

SELECT * FROM temptest;

-- DROP INDEX i_temptest;

DROP TABLE temptest;

SELECT * FROM temptest;

-- DROP INDEX i_temptest;

DROP TABLE temptest;

-- test temp table selects

CREATE TABLE temptest(col int);

INSERT INTO temptest VALUES (1);

CREATE TEMP TABLE temptest(tcol float);

INSERT INTO temptest VALUES (2.1);

SELECT * FROM temptest;

DROP TABLE temptest;

SELECT * FROM temptest;

DROP TABLE temptest;

-- test temp table deletion

CREATE TEMP TABLE temptest(col int);

\c db_testtemp_basictest 

SELECT * FROM temptest;

-- Test ON COMMIT DELETE ROWS

CREATE TEMP TABLE temptest(col int) ON COMMIT DELETE ROWS;

BEGIN;
INSERT INTO temptest VALUES (1);
INSERT INTO temptest VALUES (2);

SELECT * FROM temptest;
COMMIT;

SELECT * FROM temptest;

DROP TABLE temptest;

BEGIN;
CREATE TEMP TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1;

SELECT * FROM temptest;
COMMIT;

SELECT * FROM temptest;

DROP TABLE temptest;

-- Test ON COMMIT DROP

BEGIN;

CREATE TEMP TABLE temptest(col int) ON COMMIT DROP;

INSERT INTO temptest VALUES (1);
INSERT INTO temptest VALUES (2);

SELECT * FROM temptest;
COMMIT;

SELECT * FROM temptest;

BEGIN;
CREATE TEMP TABLE temptest(col) ON COMMIT DROP AS SELECT 1;

SELECT * FROM temptest;
COMMIT;

SELECT * FROM temptest;

-- ON COMMIT is only allowed for TEMP

CREATE TABLE temptest(col int) ON COMMIT DELETE ROWS;
CREATE TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1;

-- Test foreign keys
-- BEGIN;
-- CREATE TEMP TABLE temptest1(col int PRIMARY KEY) DISTRIBUTED BY (col);
-- CREATE TEMP TABLE temptest2(col int REFERENCES temptest1)
--   ON COMMIT DELETE ROWS;
-- INSERT INTO temptest1 VALUES (1);
-- INSERT INTO temptest2 VALUES (1);
-- COMMIT;
-- SELECT * FROM temptest1;
-- SELECT * FROM temptest2;

-- BEGIN;
-- CREATE TEMP TABLE temptest3(col int PRIMARY KEY) ON COMMIT DELETE ROWS DISTRIBUTED BY (col);
-- CREATE TEMP TABLE temptest4(col int REFERENCES temptest3);
-- COMMIT;

-- Test manipulation of temp schema's placement in search path

create table public.whereami (f1 text);
insert into public.whereami values ('public');

create temp table whereami (f1 text);
insert into whereami values ('temp');

-- create function public.whoami() returns text
--   as $$select 'public'::text$$ language sql;

-- create function pg_temp.whoami() returns text
--   as $$select 'temp'::text$$ language sql;

-- default should have pg_temp implicitly first, but only for tables
select * from whereami;
-- select whoami();

-- can list temp first explicitly, but it still doesn't affect functions
set search_path = pg_temp, public;
select * from whereami;
-- select whoami();

-- or put it last for security
set search_path = public, pg_temp;
select * from whereami;
-- select whoami();

-- you can invoke a temp function explicitly, though
-- select pg_temp.whoami();

drop table public.whereami;

-- Test querying column using pg_temp schema
create table pg_temp.test (row integer, count integer);
insert into pg_temp.test values (1, 10), (2, 20), (3, 30);
select avg(pg_temp.test.count) from pg_temp.test;
select avg(test.count) from pg_temp.test;
select avg(count) from pg_temp.test;

select case when pg_temp.test.count = 30 then 30 when pg_temp.test.count = 20 then 20 else 10 end from pg_temp.test;

