From f77667857c184a3cc8453b3a72636eeab53dcf05 Mon Sep 17 00:00:00 2001 From: Mehmet Yilmaz Date: Fri, 24 Oct 2025 11:42:10 +0000 Subject: [PATCH] Enhance columnar_relation_storageid to handle temp tables in PG18+ --- src/backend/columnar/columnar_metadata.c | 20 +++++++++++++++++++ src/test/regress/expected/columnar_create.out | 4 ++-- .../regress/expected/columnar_recursive.out | 17 ++++------------ .../expected/columnar_test_helpers.out | 12 ----------- src/test/regress/sql/columnar_create.sql | 4 ++-- src/test/regress/sql/columnar_recursive.sql | 18 ++++------------- .../regress/sql/columnar_test_helpers.sql | 13 ------------ 7 files changed, 32 insertions(+), 56 deletions(-) diff --git a/src/backend/columnar/columnar_metadata.c b/src/backend/columnar/columnar_metadata.c index 0b4f2400c..d67f43a6c 100644 --- a/src/backend/columnar/columnar_metadata.c +++ b/src/backend/columnar/columnar_metadata.c @@ -2024,6 +2024,26 @@ Datum columnar_relation_storageid(PG_FUNCTION_ARGS) { Oid relationId = PG_GETARG_OID(0); + +#if PG_VERSION_NUM >= PG_VERSION_18 + /* + * PG18+: avoid relation_open() on other sessions' temp tables. + * Return NULL so callers/views just skip them (function is STRICT). + */ + HeapTuple classtup = SearchSysCache1(RELOID, ObjectIdGetDatum(relationId)); + if (!HeapTupleIsValid(classtup)) + PG_RETURN_NULL(); + + Form_pg_class cls = (Form_pg_class) GETSTRUCT(classtup); + if (cls->relpersistence == RELPERSISTENCE_TEMP && + isOtherTempNamespace(cls->relnamespace)) + { + ReleaseSysCache(classtup); + PG_RETURN_NULL(); + } + ReleaseSysCache(classtup); +#endif + Relation relation = relation_open(relationId, AccessShareLock); if (!object_ownercheck(RelationRelationId, relationId, GetUserId())) diff --git a/src/test/regress/expected/columnar_create.out b/src/test/regress/expected/columnar_create.out index 4b02aa4f6..a134fd063 100644 --- a/src/test/regress/expected/columnar_create.out +++ b/src/test/regress/expected/columnar_create.out @@ -214,8 +214,8 @@ SELECT COUNT(*) FROM columnar_temp WHERE i < 5; 4 (1 row) -SELECT COALESCE(columnar_test_helpers.get_storage_id_if_visible('columnar_temp'::regclass), 0) - AS columnar_temp_storage_id \gset +SELECT columnar.get_storage_id(oid) AS columnar_temp_storage_id +FROM pg_class WHERE relname='columnar_temp' \gset BEGIN; DROP TABLE columnar_temp; -- show that we drop stripes properly diff --git a/src/test/regress/expected/columnar_recursive.out b/src/test/regress/expected/columnar_recursive.out index 1a54f4f59..7b4b828be 100644 --- a/src/test/regress/expected/columnar_recursive.out +++ b/src/test/regress/expected/columnar_recursive.out @@ -11,19 +11,10 @@ $$ LANGUAGE SQL; INSERT INTO t2 SELECT i, f(i) FROM generate_series(1, 5) i; -- there are no subtransactions, so above statement should batch -- INSERTs inside the UDF and create on stripe per table. -WITH rels(rel) AS ( - VALUES ('t1'::regclass), ('t2'::regclass) -), -sids AS ( - SELECT rel, columnar.get_storage_id(rel) AS sid - FROM rels -) -SELECT c.relname, COUNT(*) AS count -FROM columnar_internal.stripe st -JOIN sids s ON st.storage_id = s.sid -JOIN pg_catalog.pg_class c ON c.oid = s.rel -GROUP BY c.relname -ORDER BY c.relname; +SELECT relname, count(*) FROM columnar.stripe a, pg_class b +WHERE columnar.get_storage_id(b.oid)=a.storage_id AND relname IN ('t1', 't2') +GROUP BY relname +ORDER BY relname; relname | count --------------------------------------------------------------------- t1 | 1 diff --git a/src/test/regress/expected/columnar_test_helpers.out b/src/test/regress/expected/columnar_test_helpers.out index b2b17cc94..f4f179e55 100644 --- a/src/test/regress/expected/columnar_test_helpers.out +++ b/src/test/regress/expected/columnar_test_helpers.out @@ -146,15 +146,3 @@ BEGIN RETURN NEXT; END LOOP; END; $$ language plpgsql; -CREATE OR REPLACE FUNCTION get_storage_id_if_visible(rel regclass) -RETURNS bigint -LANGUAGE sql STABLE AS $$ - SELECT CASE - WHEN c.relpersistence = 't' - AND c.relnamespace <> pg_catalog.pg_my_temp_schema() - THEN NULL -- other session’s temp → don’t touch - ELSE columnar.get_storage_id(c.oid) - END - FROM pg_catalog.pg_class c - WHERE c.oid = $1::oid -$$; diff --git a/src/test/regress/sql/columnar_create.sql b/src/test/regress/sql/columnar_create.sql index 93db8a25f..a0708aeac 100644 --- a/src/test/regress/sql/columnar_create.sql +++ b/src/test/regress/sql/columnar_create.sql @@ -174,8 +174,8 @@ INSERT INTO columnar_temp SELECT i FROM generate_series(1,5) i; -- test basic select SELECT COUNT(*) FROM columnar_temp WHERE i < 5; -SELECT COALESCE(columnar_test_helpers.get_storage_id_if_visible('columnar_temp'::regclass), 0) - AS columnar_temp_storage_id \gset +SELECT columnar.get_storage_id(oid) AS columnar_temp_storage_id +FROM pg_class WHERE relname='columnar_temp' \gset BEGIN; DROP TABLE columnar_temp; diff --git a/src/test/regress/sql/columnar_recursive.sql b/src/test/regress/sql/columnar_recursive.sql index c916ce066..08d77afdb 100644 --- a/src/test/regress/sql/columnar_recursive.sql +++ b/src/test/regress/sql/columnar_recursive.sql @@ -15,20 +15,10 @@ INSERT INTO t2 SELECT i, f(i) FROM generate_series(1, 5) i; -- there are no subtransactions, so above statement should batch -- INSERTs inside the UDF and create on stripe per table. -WITH rels(rel) AS ( - VALUES ('t1'::regclass), ('t2'::regclass) -), -sids AS ( - SELECT rel, columnar.get_storage_id(rel) AS sid - FROM rels -) -SELECT c.relname, COUNT(*) AS count -FROM columnar_internal.stripe st -JOIN sids s ON st.storage_id = s.sid -JOIN pg_catalog.pg_class c ON c.oid = s.rel -GROUP BY c.relname -ORDER BY c.relname; - +SELECT relname, count(*) FROM columnar.stripe a, pg_class b +WHERE columnar.get_storage_id(b.oid)=a.storage_id AND relname IN ('t1', 't2') +GROUP BY relname +ORDER BY relname; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; diff --git a/src/test/regress/sql/columnar_test_helpers.sql b/src/test/regress/sql/columnar_test_helpers.sql index 51f5123c7..9cff79bbe 100644 --- a/src/test/regress/sql/columnar_test_helpers.sql +++ b/src/test/regress/sql/columnar_test_helpers.sql @@ -158,16 +158,3 @@ BEGIN RETURN NEXT; END LOOP; END; $$ language plpgsql; - -CREATE OR REPLACE FUNCTION get_storage_id_if_visible(rel regclass) -RETURNS bigint -LANGUAGE sql STABLE AS $$ - SELECT CASE - WHEN c.relpersistence = 't' - AND c.relnamespace <> pg_catalog.pg_my_temp_schema() - THEN NULL -- other session’s temp → don’t touch - ELSE columnar.get_storage_id(c.oid) - END - FROM pg_catalog.pg_class c - WHERE c.oid = $1::oid -$$;