From 62813eb3d04557c2d425274dda30008db0fd6c46 Mon Sep 17 00:00:00 2001 From: Dave Page Date: Tue, 25 Aug 2026 10:00:10 +0100 Subject: [PATCH] fix: omit redundant TABLESPACE pg_default from generated index SQL PostgreSQL rejects an explicit TABLESPACE clause naming the database's own default tablespace when the index is on a partitioned table ('cannot specify default tablespace for partitioned relations'), so the SQL pgAdmin generated for a new index could not be executed against a partitioned table whenever no non-default tablespace was chosen. The index_constraint and exclusion_constraint create.sql templates already guard against emitting this redundant clause; extend the same guard to the plain index create.sql templates. Closes #10341 --- .../tests/15_plus/alter_index_no_depends.sql | 2 +- .../15_plus/alter_name_fillfactor_comment.sql | 2 +- .../alter_reset_fillfactor_cluster.sql | 2 +- .../15_plus/create_btree_asc_null_first.sql | 2 +- .../create_btree_asc_null_first_msql.sql | 2 +- .../15_plus/create_btree_asc_null_last.sql | 2 +- .../create_btree_asc_null_last_msql.sql | 2 +- .../15_plus/create_btree_desc_null_first.sql | 2 +- .../create_btree_desc_null_first_msql.sql | 2 +- .../15_plus/create_btree_desc_null_last.sql | 2 +- .../create_btree_desc_null_last_msql.sql | 2 +- .../tests/15_plus/create_index_with_ext.msql | 2 +- .../tests/15_plus/create_index_with_ext.sql | 2 +- .../tests/default/alter_expr_statistics.sql | 2 +- .../tests/default/alter_index_no_depends.sql | 2 +- .../default/alter_name_fillfactor_comment.sql | 2 +- .../alter_reset_fillfactor_cluster.sql | 2 +- .../default/create_btree_asc_null_first.sql | 2 +- .../create_btree_asc_null_first_msql.sql | 2 +- .../default/create_btree_asc_null_last.sql | 2 +- .../create_btree_asc_null_last_msql.sql | 2 +- .../default/create_btree_desc_null_first.sql | 2 +- .../create_btree_desc_null_first_msql.sql | 2 +- .../default/create_btree_desc_null_last.sql | 2 +- .../create_btree_desc_null_last_msql.sql | 2 +- .../create_btree_expr_asc_null_last.sql | 2 +- .../create_btree_expr_asc_null_last_msql.sql | 2 +- .../tests/default/create_hash_index.sql | 2 +- .../tests/default/create_hash_index_msql.sql | 2 +- .../tests/default/create_index_with_ext.msql | 2 +- .../tests/default/create_index_with_ext.sql | 2 +- .../create_unnamed_hash_index_msql.sql | 2 +- .../test_create_sql_partitioned_tablespace.py | 121 ++++++++++++++++++ .../templates/indexes/sql/15_plus/create.sql | 2 +- .../templates/indexes/sql/default/create.sql | 2 +- 35 files changed, 155 insertions(+), 34 deletions(-) create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_create_sql_partitioned_tablespace.py diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_index_no_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_index_no_depends.sql index e6b249aea8a..eb0be343a58 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_index_no_depends.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_index_no_depends.sql @@ -8,7 +8,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; ALTER INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_name_fillfactor_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_name_fillfactor_comment.sql index fc068ba3def..e459932bab7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_name_fillfactor_comment.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_name_fillfactor_comment.sql @@ -8,7 +8,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx1_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10) - TABLESPACE pg_default; +; ALTER TABLE IF EXISTS public.test_table_for_indexes CLUSTER ON "Idx1_$%{}[]()&*^!@""'`\/#"; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_reset_fillfactor_cluster.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_reset_fillfactor_cluster.sql index f429e8358d2..b341eaa44f0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_reset_fillfactor_cluster.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/alter_reset_fillfactor_cluster.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx1_$%{}[]()&*^!@""'`\/#" (id DESC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS FIRST) INCLUDE(name, id) NULLS NOT DISTINCT - TABLESPACE pg_default; +; COMMENT ON INDEX public."Idx1_$%{}[]()&*^!@""'`\/#" IS 'Test Comment'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_first.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_first.sql index 802e195002b..e59c991f712 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_first.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_first.sql @@ -8,7 +8,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_first_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_first_msql.sql index 05b9ec8d72f..b6d83165b8b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_first_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_first_msql.sql @@ -4,7 +4,7 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_last.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_last.sql index 2cf9c9e3a37..6227f0aac79 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_last.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_last.sql @@ -8,7 +8,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_last_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_last_msql.sql index 53f42abb091..623f8cd1ba0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_last_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_asc_null_last_msql.sql @@ -4,7 +4,7 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_first.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_first.sql index 6f6c8cd77fc..596833049af 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_first.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_first.sql @@ -7,4 +7,4 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" (id DESC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS FIRST) INCLUDE(name, id) NULLS NOT DISTINCT - TABLESPACE pg_default; +; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_first_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_first_msql.sql index 9660ac05a5f..9ac3b44c74a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_first_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_first_msql.sql @@ -3,4 +3,4 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" (id DESC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS FIRST) INCLUDE(name, id) NULLS NOT DISTINCT - TABLESPACE pg_default; +; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_last.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_last.sql index 56ed7687856..3eb88785436 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_last.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_last.sql @@ -8,7 +8,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_last_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_last_msql.sql index 9eec0a7ff26..6b22c576000 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_last_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_btree_desc_null_last_msql.sql @@ -4,7 +4,7 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_index_with_ext.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_index_with_ext.msql index 43c2ddece93..fb99e0ae2a1 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_index_with_ext.msql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_index_with_ext.msql @@ -4,7 +4,7 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; ALTER INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_index_with_ext.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_index_with_ext.sql index 08b50454569..d46299198e6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_index_with_ext.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/15_plus/create_index_with_ext.sql @@ -8,7 +8,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" INCLUDE(name, id) NULLS NOT DISTINCT WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; ALTER INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_expr_statistics.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_expr_statistics.sql index f7c25eae1f2..f9511010f6d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_expr_statistics.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_expr_statistics.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx3_$%{}[]()&*^!@""'`\/#" (id ASC NULLS LAST, lower(name) COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx3_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_index_no_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_index_no_depends.sql index c10fecc30fe..8284142636a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_index_no_depends.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_index_no_depends.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" (id ASC NULLS LAST, name COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; ALTER INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_name_fillfactor_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_name_fillfactor_comment.sql index b25e51fe7e9..2ec1a4b50cf 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_name_fillfactor_comment.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_name_fillfactor_comment.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx1_$%{}[]()&*^!@""'`\/#" (id DESC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS FIRST) INCLUDE(name, id) WITH (fillfactor=10) - TABLESPACE pg_default; +; ALTER TABLE IF EXISTS public.test_table_for_indexes CLUSTER ON "Idx1_$%{}[]()&*^!@""'`\/#"; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_reset_fillfactor_cluster.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_reset_fillfactor_cluster.sql index d8c7cd5c5a3..ab8a6b9bb81 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_reset_fillfactor_cluster.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/alter_reset_fillfactor_cluster.sql @@ -6,7 +6,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx1_$%{}[]()&*^!@""'`\/#" ON public.test_table_for_indexes USING btree (id DESC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS FIRST) INCLUDE(name, id) - TABLESPACE pg_default; +; COMMENT ON INDEX public."Idx1_$%{}[]()&*^!@""'`\/#" IS 'Test Comment'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_first.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_first.sql index 7a707969d2e..706e32ff508 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_first.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_first.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" (id ASC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS FIRST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_first_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_first_msql.sql index a1547386a2b..47404f87434 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_first_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_first_msql.sql @@ -3,7 +3,7 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" (id ASC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS FIRST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_last.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_last.sql index b4b7b6ec757..c69bf1ae964 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_last.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_last.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" (id ASC NULLS LAST, name COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_last_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_last_msql.sql index 210314f3388..a27e282fb83 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_last_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_asc_null_last_msql.sql @@ -3,7 +3,7 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" (id ASC NULLS LAST, name COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_first.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_first.sql index d7f87ff1081..b3e8a75d9f9 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_first.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_first.sql @@ -6,4 +6,4 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" ON public.test_table_for_indexes USING btree (id DESC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS FIRST) INCLUDE(name, id) - TABLESPACE pg_default; +; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_first_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_first_msql.sql index 7492543e267..6528a4f5fd3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_first_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_first_msql.sql @@ -2,4 +2,4 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" ON public.test_table_for_indexes USING btree (id DESC NULLS FIRST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS FIRST) INCLUDE(name, id) - TABLESPACE pg_default; +; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_last.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_last.sql index f0faed97b8f..c31cc5d03d4 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_last.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_last.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" (id DESC NULLS LAST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_last_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_last_msql.sql index 61e5e8f1650..6813d59ad4b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_last_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_desc_null_last_msql.sql @@ -3,7 +3,7 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" (id DESC NULLS LAST, name COLLATE pg_catalog."POSIX" text_pattern_ops DESC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_expr_asc_null_last.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_expr_asc_null_last.sql index f7c25eae1f2..f9511010f6d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_expr_asc_null_last.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_expr_asc_null_last.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx3_$%{}[]()&*^!@""'`\/#" (id ASC NULLS LAST, lower(name) COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx3_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_expr_asc_null_last_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_expr_asc_null_last_msql.sql index ada43a67b06..f4364678690 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_expr_asc_null_last_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_btree_expr_asc_null_last_msql.sql @@ -3,7 +3,7 @@ CREATE UNIQUE INDEX "Idx3_$%{}[]()&*^!@""'`\/#" (id ASC NULLS LAST, (lower(name)) COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10) - TABLESPACE pg_default + WHERE id < 100; COMMENT ON INDEX public."Idx3_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_hash_index.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_hash_index.sql index 1f64067e888..a16b4904097 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_hash_index.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_hash_index.sql @@ -5,4 +5,4 @@ CREATE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" ON public.test_table_for_indexes USING hash (id) - TABLESPACE pg_default; +; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_hash_index_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_hash_index_msql.sql index 14f012b4f65..8ebaf7017b8 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_hash_index_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_hash_index_msql.sql @@ -1,4 +1,4 @@ CREATE INDEX "Idx_$%{}[]()&*^!@""'`\/#" ON public.test_table_for_indexes USING hash (id) - TABLESPACE pg_default; +; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_index_with_ext.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_index_with_ext.msql index fd511914ee4..27322f162dd 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_index_with_ext.msql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_index_with_ext.msql @@ -3,7 +3,7 @@ CREATE UNIQUE INDEX "Idx_$%{}[]()&*^!@""'`\/#" (id ASC NULLS LAST, name COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; ALTER INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_index_with_ext.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_index_with_ext.sql index 95155212227..27bddad38df 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_index_with_ext.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_index_with_ext.sql @@ -7,7 +7,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Idx_$%{}[]()&*^!@""'`\/#" (id ASC NULLS LAST, name COLLATE pg_catalog."POSIX" text_pattern_ops ASC NULLS LAST) INCLUDE(name, id) WITH (fillfactor=10, deduplicate_items=False) - TABLESPACE pg_default + WHERE id < 100; ALTER INDEX public."Idx_$%{}[]()&*^!@""'`\/#" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_unnamed_hash_index_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_unnamed_hash_index_msql.sql index 2babaaea7ab..426a5305219 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_unnamed_hash_index_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/default/create_unnamed_hash_index_msql.sql @@ -1,4 +1,4 @@ CREATE INDEX ON public.test_table_for_indexes USING hash (id) - TABLESPACE pg_default; +; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_create_sql_partitioned_tablespace.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_create_sql_partitioned_tablespace.py new file mode 100644 index 00000000000..46606bd8b6c --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_create_sql_partitioned_tablespace.py @@ -0,0 +1,121 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2026, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +"""Regression test for #10341: CREATE INDEX ... TABLESPACE pg_default is +rejected by PostgreSQL when the index's table is partitioned ('cannot +specify default tablespace for partitioned relations'). pgAdmin's index +create.sql templates always emitted the TABLESPACE clause for any +selected tablespace, including the pre-filled 'pg_default' default, +which is invalid for a partitioned table and a no-op for anything else. + +The index_constraint/exclusion_constraint create.sql templates already +guard against this (data.spcname != "pg_default"); this test asserts the +plain index templates apply the same guard, without requiring a running +PostgreSQL server. +""" + +import os + +import pgadmin +from flask import Flask, render_template +from jinja2 import FileSystemLoader + +from pgadmin.utils.driver import get_driver +from pgadmin.utils.route import BaseTestGenerator +from config import PG_DEFAULT_DRIVER + + +class _FakeConn: + """Stand-in for a psycopg connection so qtIdent resolves without a + live server.""" + + conn = None + + def __bool__(self): + return True + + +class _FakeApp(Flask): + """Minimal Flask app mirroring the production Jinja filters.""" + + def __init__(self, template_root): + super().__init__('') + driver = get_driver(PG_DEFAULT_DRIVER, self) + self.jinja_env.filters['qtIdent'] = driver.qtIdent + self.jinja_env.loader = FileSystemLoader([template_root]) + + +_TEMPLATE_ROOT = os.path.join( + os.path.dirname(pgadmin.__file__), 'browser', 'server_groups', 'servers', + 'databases', 'schemas', 'tables', 'templates') + + +def _base_data(spcname): + return dict( + name='my_index', schema='public', table='my_partitioned_table', + indisunique=False, isconcurrent=False, indisonly=False, + amname='btree', columns=[dict(colname='my_column', is_exp=False)], + include=[], storage_parameters=None, spcname=spcname, + indconstraint=None, dependsonextensions=[], + ) + + +class IndexCreateSQLPartitionedTablespaceTestCase(BaseTestGenerator): + """CREATE INDEX SQL must omit a redundant TABLESPACE pg_default + clause, since it is rejected outright for partitioned tables and a + no-op for everything else.""" + + scenarios = [ + ('default templates omit TABLESPACE pg_default', dict( + template='indexes/sql/default/create.sql', + spcname='pg_default', + )), + ('15_plus templates omit TABLESPACE pg_default', dict( + template='indexes/sql/15_plus/create.sql', + spcname='pg_default', + )), + ('default templates keep an explicit non-default tablespace', + dict( + template='indexes/sql/default/create.sql', + spcname='custom_ts', + )), + ('15_plus templates keep an explicit non-default tablespace', + dict( + template='indexes/sql/15_plus/create.sql', + spcname='custom_ts', + )), + ] + + def setUp(self): + self.app_under_test = _FakeApp(_TEMPLATE_ROOT) + + def runTest(self): + conn = _FakeConn() + data = _base_data(self.spcname) + + with self.app_under_test.app_context(): + rendered = render_template( + self.template, data=data, conn=conn, mode='create', + add_not_exists_clause=False) + + if self.spcname == 'pg_default': + self.assertNotIn( + 'TABLESPACE', rendered, + msg=('Generated CREATE INDEX SQL must not name the ' + 'default tablespace explicitly, since PostgreSQL ' + 'rejects it for a partitioned table.\nRendered:\n{}' + .format(rendered))) + else: + self.assertIn( + 'TABLESPACE {}'.format(self.spcname), rendered, + msg=('An explicitly chosen, non-default tablespace must ' + 'still be emitted.\nRendered:\n{}'.format(rendered))) + + def tearDown(self): + pass diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/15_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/15_plus/create.sql index d433cf71e89..68c2c72ef06 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/15_plus/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/15_plus/create.sql @@ -26,7 +26,7 @@ FIRST{% else %}LAST{% endif %}{% endif %}{% endfor %}) {% endif %} {% if data.storage_parameters %} WITH ({% for key, value in data.storage_parameters.items() %}{% if loop.index != 1 %}, {% endif %}{{key}}={{value}}{% endfor %}) -{% endif %}{% if data.spcname %} +{% endif %}{% if data.spcname and data.spcname != "pg_default" %} TABLESPACE {{conn|qtIdent(data.spcname)}}{% endif %}{% if data.indconstraint %} WHERE {{data.indconstraint}}{% endif %}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/default/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/default/create.sql index 4ce3030af56..3b04ba21378 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/default/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/default/create.sql @@ -20,7 +20,7 @@ FIRST{% else %}LAST{% endif %}{% endif %}{% endfor %}) {% endif %} {% if data.storage_parameters %} WITH ({% for key, value in data.storage_parameters.items() %}{% if loop.index != 1 %}, {% endif %}{{key}}={{value}}{% endfor %}) -{% endif %}{% if data.spcname %} +{% endif %}{% if data.spcname and data.spcname != "pg_default" %} TABLESPACE {{conn|qtIdent(data.spcname)}}{% endif %}{% if data.indconstraint %} WHERE {{data.indconstraint}}{% endif %};