should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,17 @@
# name: test/sql/pg_catalog/pg_attribute.test
# description: Test pg_attribute function
# group: [pg_catalog]
query IIIIII nosort pg_attribute
SELECT * FROM pg_attribute
query IIIIII nosort pg_attribute
SELECT * FROM pg_catalog.pg_attribute
statement ok
CREATE TABLE integers(i integer)
query III
select relname, attname, attnum from pg_attribute join pg_class on (pg_attribute.attrelid=pg_class.oid) where relname='integers' and attnum>=0;
----
integers i 1

View File

@@ -0,0 +1,25 @@
# name: test/sql/pg_catalog/pg_constraint.test
# description: Test pg_constraint function
# group: [pg_catalog]
query IIIIII nosort pg_constraint
SELECT * FROM pg_constraint
statement ok
create table a (id int , primary key (id));
statement ok
create table b (id int , foreign_a int, foreign key (foreign_a) references a);
statement ok
insert into a (id) values (0);
statement ok
insert into b (id, foreign_a) VALUES (0, 0);
query IIIIIIIIIIIIIIIIIIIIII
SELECT * EXCLUDE (OID, CONRELID, connamespace) FROM pg_catalog.pg_constraint
----
PRIMARY KEY(id) p false false true 0 0 0 0 NULL NULL NULL true 0 false [0] NULL NULL NULL NULL NULL NULL
NOT NULL x false false true 0 0 0 0 NULL NULL NULL true 0 false [0] NULL NULL NULL NULL NULL NULL
FOREIGN KEY (foreign_a) REFERENCES a(id) f false false true 0 0 0 0 NULL NULL NULL true 0 false [1] NULL NULL NULL NULL NULL NULL

View File

@@ -0,0 +1,9 @@
# name: test/sql/pg_catalog/pg_database.test
# description: Test pg_database function
# group: [pg_catalog]
query II nosort pg_dbase
SELECT * FROM pg_database
query II nosort pg_dbase
SELECT * FROM pg_catalog.pg_database

View File

@@ -0,0 +1,9 @@
# name: test/sql/pg_catalog/pg_depend.test
# description: Test pg_depend function
# group: [pg_catalog]
query IIIIII nosort pg_depend
SELECT * FROM pg_depend ORDER BY ALL
query IIIIII nosort pg_depend
SELECT * FROM pg_catalog.pg_depend ORDER BY ALL

View File

@@ -0,0 +1,9 @@
# name: test/sql/pg_catalog/pg_enum.test
# description: Test pg_enum function
# group: [pg_catalog]
query IIIIII nosort pg_enum
SELECT * FROM pg_enum
query IIIIII nosort pg_enum
SELECT * FROM pg_catalog.pg_enum

View File

@@ -0,0 +1,21 @@
# name: test/sql/pg_catalog/pg_index.test
# description: Test pg_index function
# group: [pg_catalog]
statement ok
CREATE TABLE integers(i INTEGER, j INTEGER, k INTEGER)
statement ok
CREATE INDEX i_index ON integers((j + 1), k)
query IIIIII nosort pg_index
SELECT * FROM pg_index
query IIIIII nosort pg_index
SELECT * FROM pg_catalog.pg_index
query IIIIII nosort pg_indexes
SELECT * FROM pg_indexes
query IIIIII nosort pg_indexes
SELECT * FROM pg_catalog.pg_indexes

View File

@@ -0,0 +1,41 @@
# name: test/sql/pg_catalog/pg_namespace.test
# description: Test pg_namespace function
# group: [pg_catalog]
require skip_reload
query I
SELECT COUNT(*) FROM pg_namespace WHERE nspname='myschema'
----
0
statement ok
CREATE SCHEMA myschema
query I
SELECT COUNT(*) FROM pg_namespace WHERE nspname='myschema'
----
1
# can query through the "pg_catalog" namespace
query IIII nosort pgnamespace
SELECT * FROM pg_namespace
query IIII nosort pgnamespace
SELECT * FROM pg_catalog.pg_namespace
# oid of an entry does not change even after adding new entries
query I nosort pgmyschema
SELECT * FROM pg_namespace WHERE nspname='myschema'
statement ok
CREATE SCHEMA bla
statement ok
CREATE SCHEMA test
statement ok
CREATE SCHEMA myschema33
query I nosort pgmyschema
SELECT * FROM pg_namespace WHERE nspname='myschema'

View File

@@ -0,0 +1,25 @@
# name: test/sql/pg_catalog/pg_prepared_statements.test
# group: [pg_catalog]
statement ok
prepare p1 as select 42;
statement ok
create table tbl(a varchar);
statement ok
prepare p2 as insert into tbl values ('test');
statement ok
prepare p3 as select 21, $1, $2
statement ok
prepare p4 as select $name, $other_name
query IIIIIIII
select * from pg_prepared_statements order by name;
----
p1 SELECT 42 NULL NULL [INTEGER] NULL NULL NULL
p2 INSERT INTO tbl (VALUES ('test')) NULL NULL [BIGINT] NULL NULL NULL
p3 SELECT 21, $1, $2 NULL [UNKNOWN, UNKNOWN] NULL NULL NULL NULL
p4 SELECT $name, $other_name NULL [UNKNOWN, UNKNOWN] NULL NULL NULL NULL

View File

@@ -0,0 +1,22 @@
# name: test/sql/pg_catalog/pg_privilege.test
# description: Test Postgres compatibility privilege functions
# group: [pg_catalog]
foreach function has_any_column_privilege has_database_privilege has_foreign_data_wrapper_privilege has_function_privilege has_language_privilege has_schema_privilege has_sequence_privilege has_server_privilege has_table_privilege has_tablespace_privilege
query I
SELECT ${function}('main', 'test')
----
true
query I
SELECT ${function}(current_user, 'main', 'test')
----
true
endloop
query II
SELECT has_column_privilege('main', 'test', 'col'), has_column_privilege(current_user, 'main', 'test', 'col')
----
true true

View File

@@ -0,0 +1,43 @@
# name: test/sql/pg_catalog/pg_proc.test_slow
# description: Test pg_proc function
# group: [pg_catalog]
statement ok
PRAGMA enable_verification
statement ok
SELECT * FROM pg_proc;
statement ok
CREATE MACRO add_default1(a := 3, b := 5) AS a + b
statement ok
CREATE MACRO add_default2(a, b := 5) AS a + b
statement ok
SELECT * FROM pg_proc;
query I
select distinct proname from pg_proc where proname='sqrt';
----
sqrt
query IIIIII
select proisagg, prorettype, proargtypes, proargnames, pronargs, provolatile FROM pg_proc WHERE proname='corr';
----
true DOUBLE [DOUBLE, DOUBLE] [y, x] 2 i
query IIII
select provariadic, prorettype, proargtypes, proargnames FROM pg_proc WHERE proname='printf';
----
ANY VARCHAR [VARCHAR] [format]
query II
SELECT prokind, provolatile FROM pg_proc WHERE proname = 'random'
----
f v
query I
SELECT length(prosqlbody) > 0 FROM pg_proc WHERE proname = 'add_default1'
----
true

View File

@@ -0,0 +1,17 @@
# name: test/sql/pg_catalog/pg_sequence.test
# description: Test pg_sequence function
# group: [pg_catalog]
statement ok
CREATE SEQUENCE seq
query IIIIII nosort pg_seq
SELECT * FROM pg_sequence
query IIIIII nosort pg_seq
SELECT * FROM pg_catalog.pg_sequence
query IIIII
SELECT seqstart, seqincrement, seqmax, seqmin, seqcycle FROM pg_sequence
----
1 1 9223372036854775807 1 False

View File

@@ -0,0 +1,17 @@
# name: test/sql/pg_catalog/pg_sequences.test
# description: Test pg_sequences function
# group: [pg_catalog]
statement ok
CREATE SEQUENCE seq
query IIIIII nosort pg_seq
SELECT * FROM pg_sequences
query IIIIII nosort pg_seq
SELECT * FROM pg_catalog.pg_sequences
query IIIII
SELECT sequencename, min_value, max_value, start_value, cycle FROM pg_sequences
----
seq 1 9223372036854775807 1 False

View File

@@ -0,0 +1,22 @@
# name: test/sql/pg_catalog/pg_settings.test
# description: Test pg_settings function
# group: [pg_catalog]
statement ok
SET default_null_order='nulls_first';
statement ok
SELECT * FROM pg_settings;
query II
SELECT name, setting FROM pg_settings WHERE name='default_null_order';
----
default_null_order NULLS_FIRST
statement ok
SET default_null_order='nulls_last'
query II
SELECT name, setting FROM pg_settings WHERE name='default_null_order';
----
default_null_order NULLS_LAST

View File

@@ -0,0 +1,9 @@
# name: test/sql/pg_catalog/pg_tablespace.test
# description: Test pg_tablespace function
# group: [pg_catalog]
query IIIIII nosort pg_tspace
SELECT * FROM pg_tablespace
query IIIIII nosort pg_tspace
SELECT * FROM pg_catalog.pg_tablespace

View File

@@ -0,0 +1,117 @@
# name: test/sql/pg_catalog/pg_type.test
# description: Test pg_type function
# group: [pg_catalog]
statement ok
CREATE TYPE greeting AS ENUM('hi', 'bonjour', 'konnichiwa', 'howdy')
statement ok
SELECT * FROM pg_type
statement ok
SELECT * FROM pg_catalog.pg_type
query I
SELECT oid FROM pg_type WHERE typname = 'int8' AND oid IS NOT NULL
----
20
query I
SELECT oid FROM pg_type WHERE typname = 'bytea' AND oid IS NOT NULL
----
17
query I
SELECT oid FROM pg_type WHERE typname = 'bit' AND oid IS NOT NULL
----
1560
query I
SELECT oid FROM pg_type WHERE typname = 'bool' AND oid IS NOT NULL
----
16
query I
SELECT oid FROM pg_type WHERE typname = 'varchar' AND oid IS NOT NULL
----
1043
query I
SELECT oid FROM pg_type WHERE typname = 'date' AND oid IS NOT NULL
----
1082
query I
SELECT oid FROM pg_type WHERE typname = 'float8' AND oid IS NOT NULL
----
701
query I
SELECT oid FROM pg_type WHERE typname = 'float4' AND oid IS NOT NULL
----
700
query I
SELECT oid FROM pg_type WHERE typname = 'uuid' AND oid IS NOT NULL
----
2950
query I
SELECT oid FROM pg_type WHERE typname = 'int4' AND oid IS NOT NULL
----
23
query I
SELECT oid FROM pg_type WHERE typname = 'int2' AND oid IS NOT NULL
----
21
query I
SELECT oid FROM pg_type WHERE typname = 'interval' AND oid IS NOT NULL
----
1186
query I
SELECT oid FROM pg_type WHERE typname = 'time' AND oid IS NOT NULL
----
1083
query I
SELECT oid FROM pg_type WHERE typname = 'timestamp' AND oid IS NOT NULL
----
1114
query I
SELECT oid FROM pg_type WHERE typname = 'timestamptz' AND oid IS NOT NULL
----
1184
query I
SELECT oid FROM pg_type WHERE typname = 'timetz' AND oid IS NOT NULL
----
1266
query I
SELECT count(*) FROM pg_type where typname = 'greeting'
----
1
query I
SELECT oid FROM pg_type WHERE typname = 'numeric' AND oid IS NOT NULL
----
1700
query I
SELECT count(*) FROM pg_type where typname = 'enum' AND oid is NOT NULL
----
0
query I
SELECT pg_catalog.format_pg_type('DECIMAL', 'test');
----
numeric
query I
SELECT pg_catalog.format_pg_type('decimal', 'test');
----
numeric

View File

@@ -0,0 +1,17 @@
# name: test/sql/pg_catalog/pg_views.test
# description: Test pg_views function
# group: [pg_catalog]
statement ok
CREATE VIEW v1 AS SELECT 42
query IIIIII nosort pg_view
SELECT * FROM pg_views
query IIIIII nosort pg_view
SELECT * FROM pg_catalog.pg_views
query II
SELECT viewname, viewowner FROM pg_views WHERE viewname='v1'
----
v1 duckdb

View File

@@ -0,0 +1,378 @@
# name: test/sql/pg_catalog/sqlalchemy.test
# description: Test postgres catalog queries from SQL Alchemy to test postgres compatibility on this frnot
# group: [pg_catalog]
# https://github.com/sqlalchemy/sqlalchemy/blob/master/lib/sqlalchemy/dialects/postgresql/base.py
statement ok
CREATE TYPE greeting AS ENUM('hi', 'bonjour', 'konnichiwa', 'howdy')
statement ok
CREATE TABLE integral_values (
j smallint,
k integer,
l bigint,
i real,
z double precision,
m DECIMAL(4, 1),
n DECIMAL(9, 2),
o DECIMAL(18, 4),
p DECIMAL(37, 2),
q varchar,
r bytea,
s date,
t time,
u timestamp,
v date[],
w greeting
);
# has_schema
query I
select distinct nspname from pg_namespace " "where lower(nspname)='main'
----
main
# has_table
query I
select relname from pg_class c join pg_namespace n on
n.oid=c.relnamespace where
pg_catalog.pg_table_is_visible(c.oid)
and relname='integral_values'
----
integral_values
query I
select relname from pg_class c join pg_namespace n on
n.oid=c.relnamespace where
pg_catalog.pg_table_is_visible(c.oid)
and relname='f'
----
# has_table with an explicit schema
query I
select relname from pg_class c join pg_namespace n on
n.oid=c.relnamespace where n.nspname='main' and
relname='integral_values'
----
integral_values
query I
select relname from pg_class c join pg_namespace n on
n.oid=c.relnamespace where n.nspname='main' and
relname='f'
----
# has_sequence
statement ok
CREATE SEQUENCE seq
query I
SELECT relname FROM pg_class c join pg_namespace n on
n.oid=c.relnamespace where relkind='S' and
n.nspname='main' and relname='seq'
----
seq
query I
SELECT relname FROM pg_class c join pg_namespace n on
n.oid=c.relnamespace where relkind='S' and
n.nspname='main' and relname='f'
----
# has_type
query I
SELECT EXISTS (
SELECT * FROM pg_catalog.pg_type t, pg_catalog.pg_namespace n
WHERE t.typnamespace = n.oid
AND t.typname = 'integer'
AND n.nspname = 'main'
)
----
false
query I
SELECT EXISTS (
SELECT * FROM pg_catalog.pg_type t, pg_catalog.pg_namespace n
WHERE t.typnamespace = n.oid
AND t.typname = 'int4'
AND n.nspname = 'main'
)
----
true
# get_table_oid
query I
SELECT COUNT(c.oid)
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE (pg_catalog.pg_table_is_visible(c.oid))
AND c.relname = 'integral_values' AND c.relkind in
('r', 'v', 'm', 'f', 'p')
----
1
# get_schema_names
statement ok
SELECT nspname FROM pg_namespace
WHERE nspname NOT LIKE 'pg_%'
ORDER BY nspname
# get_table_names
query I
SELECT c.relname FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'main' AND c.relkind in ('r', 'p')
----
integral_values
# _get_foreign_table_names
statement ok
SELECT c.relname FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'main' AND c.relkind = 'f'
# get_view_names
statement ok
CREATE SCHEMA myschema
statement ok
CREATE VIEW myschema.v1 AS SELECT 42;
query I
SELECT c.relname FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'myschema' AND c.relkind IN ('v', 'm')
----
v1
# get_sequence_names
query I
SELECT relname FROM pg_class c join pg_namespace n on
n.oid=c.relnamespace where relkind='S' and
n.nspname='main'
----
seq
# get_view_definition
query I
SELECT string_split_regex(pg_get_viewdef(c.oid), '\n')[1] view_def FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'myschema' AND c.relname = 'v1'
AND c.relkind IN ('v', 'm')
----
CREATE VIEW myschema.v1 AS SELECT 42;
# get_columns
query IIII
SELECT a.attname,
pg_catalog.format_type(a.atttypid, a.atttypmod),
(
SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid)
FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum
AND a.atthasdef
) AS DEFAULT,
a.attnotnull
FROM pg_catalog.pg_attribute a
LEFT JOIN pg_catalog.pg_description pgd ON (
pgd.objoid = a.attrelid AND pgd.objsubid = a.attnum)
WHERE a.attrelid = (SELECT MIN(oid) FROM pg_class WHERE relname='integral_values')
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum;
----
j int2 NULL false
k int4 NULL false
l int8 NULL false
i float4 NULL false
z float8 NULL false
m numeric(4,1) NULL false
n numeric(9,2) NULL false
o numeric(18,4) NULL false
p numeric(37,2) NULL false
q varchar NULL false
r bytea NULL false
s date NULL false
t time NULL false
u timestamp NULL false
v list NULL false
w enum NULL false
# get_pk_constraint
statement ok
SELECT a.attname
FROM
pg_class t
join pg_index ix on t.oid = ix.indrelid
join pg_attribute a
on t.oid=a.attrelid
WHERE
t.oid = (SELECT MIN(table_oid) FROM duckdb_tables) and ix.indisprimary = 't'
ORDER BY a.attnum
# get_pk_constraint, >= v8.4
statement ok
SELECT a.attname
FROM pg_attribute a JOIN (
SELECT unnest(ix.indkey) attnum,
generate_subscripts(ix.indkey, 1) ord
FROM pg_index ix
WHERE ix.indrelid = (SELECT MIN(table_oid) FROM duckdb_tables) AND ix.indisprimary
) k ON a.attnum=k.attnum
WHERE a.attrelid = (SELECT MIN(table_oid) FROM duckdb_tables)
ORDER BY k.ord
# get_foreign_keys
statement ok
SELECT r.conname,
pg_catalog.pg_get_constraintdef(r.oid, true) as condef,
n.nspname as conschema
FROM pg_catalog.pg_constraint r,
pg_namespace n,
pg_class c
WHERE r.conrelid = (SELECT MIN(table_oid) FROM duckdb_tables) AND
r.contype = 'f' AND
c.oid = confrelid AND
n.oid = c.relnamespace
ORDER BY 1
# get_unique_constraints
statement ok
SELECT
cons.conname as name,
cons.conkey as key,
a.attnum as col_num,
a.attname as col_name
FROM
pg_catalog.pg_constraint cons
join pg_attribute a
on cons.conrelid = a.attrelid AND
a.attnum = ANY(cons.conkey)
WHERE
cons.conrelid = (SELECT MIN(table_oid) FROM duckdb_tables) AND
cons.contype = 'u'
# get_indexes
statement ok
SELECT
i.relname as relname,
ix.indisunique, ix.indexprs, ix.indpred,
a.attname, a.attnum, NULL, ix.indkey,
am.amname,
NULL as indnkeyatts
FROM
pg_class t
join pg_index ix on t.oid = ix.indrelid
join pg_class i on i.oid = ix.indexrelid
left outer join
pg_attribute a
on t.oid = a.attrelid
left outer join
pg_am am
on i.relam = am.oid
WHERE
t.relkind IN ('r', 'v', 'f', 'm')
and t.oid = (SELECT MIN(table_oid) FROM duckdb_tables)
and ix.indisprimary = 'f'
ORDER BY
t.relname,
i.relname
mode skip
# FIXME: ANY(list) in left outer join
# this will be fixed by either allowing subqueries in left-outer joins
# or by modifying ANY(list) to be a function instead of a rewrite to a subquery
statement ok
SELECT
i.relname as relname,
ix.indisunique, ix.indexprs,
a.attname, a.attnum, c.conrelid, ix.indkey::varchar,
ix.indoption::varchar, i.reloptions, am.amname,
pg_get_expr(ix.indpred, ix.indrelid)
FROM
pg_class t
join pg_index ix on t.oid = ix.indrelid
join pg_class i on i.oid = ix.indexrelid
left outer join
pg_attribute a
on t.oid = a.attrelid and a.attnum = ANY(ix.indkey)
left outer join
pg_constraint c
on (ix.indrelid = c.conrelid and
ix.indexrelid = c.conindid and
c.contype in ('p', 'u', 'x'))
left outer join
pg_am am
on i.relam = am.oid
WHERE
t.relkind IN ('r', 'v', 'f', 'm', 'p')
and t.oid = (SELECT MIN(table_oid) FROM duckdb_tables)
and ix.indisprimary = 'f'
ORDER BY
t.relname,
i.relname
mode unskip
# get_table_comment
statement ok
SELECT
pgd.description as table_comment
FROM
pg_catalog.pg_description pgd
WHERE
pgd.objsubid = 0 AND
pgd.objoid = (SELECT MIN(table_oid) FROM duckdb_tables)
statement ok
CREATE TABLE check_constraint_tbl (
i INTEGER CHECK (i < 42)
);
# get_check_constraints
query II
SELECT
cons.conname as name,
pg_get_constraintdef(cons.oid) as src
FROM
pg_catalog.pg_constraint cons
WHERE
cons.contype = 'c'
----
CHECK((i < 42)) CHECK((i < 42))
# load_enums
query IIII
SELECT t.typname as "name",
-- no enum defaults in 8.4 at least
-- t.typdefault as "default",
pg_catalog.pg_type_is_visible(t.oid) as "visible",
n.nspname as "schema",
e.enumlabel as "label"
FROM pg_catalog.pg_type t
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
LEFT JOIN pg_catalog.pg_enum e ON t.oid = e.enumtypid
WHERE t.typtype = 'e' AND e.enumlabel IS NOT NULL
ORDER BY e.enumsortorder
----
greeting true main hi
greeting true main bonjour
greeting true main konnichiwa
greeting true main howdy
# load domains
statement ok
SELECT t.typname as "name",
pg_catalog.format_type(t.typbasetype, t.typtypmod) as "attype",
not t.typnotnull as "nullable",
t.typdefault as "default",
pg_catalog.pg_type_is_visible(t.oid) as "visible",
n.nspname as "schema"
FROM pg_catalog.pg_type t
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
WHERE t.typtype = 'd'

View File

@@ -0,0 +1,98 @@
# name: test/sql/pg_catalog/system_functions.test
# description: Test various postgres' system functions (https://www.postgresql.org/docs/9.1/functions-info.html)
# group: [pg_catalog]
# avoid loading a storage database because it changes the initial database name
query I
SELECT CURRENT_USER
----
duckdb
query I
SELECT CURRENT_CATALOG
----
memory
query I
SELECT CURRENT_DATABASE()
----
memory
query I
SELECT pg_catalog.CURRENT_DATABASE()
----
memory
query I
SELECT USER
----
duckdb
query I
SELECT SESSION_USER
----
duckdb
statement ok
SELECT version();
query I
SELECT current_query();
----
SELECT current_query();
query I
SELECT pg_catalog.current_query();
----
SELECT pg_catalog.current_query();
query IIII
SELECT 1, 2, 3, current_query();
----
1 2 3 SELECT 1, 2, 3, current_query();
query I
SELECT current_schema();
----
main
query I
SELECT current_schemas(true);
----
[main, main, main, pg_catalog]
query I
SELECT current_schemas(false);
----
[]
query IIII
SELECT inet_client_addr(), inet_client_port(), inet_server_addr(), inet_server_port();
----
NULL NULL NULL NULL
statement ok
select pg_postmaster_start_time();
query I
SELECT pg_is_other_temp_schema(33)
----
false
query III
SELECT col_description(0, 0), obj_description(0, 'duckdb'), shobj_description(0, 'duckdb');
----
NULL NULL NULL
statement ok
select txid_current();
query I
select pg_typeof(1);
----
integer
statement error
SELECT temp.current_user()
----
main.current_user