From 0c658b73fc3d99e65576c6a306ab7f4d6c42eb95 Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Thu, 4 Sep 2025 15:13:57 +0300 Subject: [PATCH 1/8] Fix an assertion failure in Citus maintenance daemon that can happen in very slow systems (#8158) Fixes #5808. DESCRIPTION: Fixes an assertion failure in Citus maintenance daemon that can happen in very slow systems. Try running `make -C src/test/regress/ check-multi-1-vg` - while the tests will exit with code 2 at least %50 of the times in the very early stages of the test suite by producing a core-dump on main, it won't be the case on this branch, at least based on my trials :) --- src/backend/distributed/utils/maintenanced.c | 28 ++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/backend/distributed/utils/maintenanced.c b/src/backend/distributed/utils/maintenanced.c index 4dcc201d2..5ca7fd6b5 100644 --- a/src/backend/distributed/utils/maintenanced.c +++ b/src/backend/distributed/utils/maintenanced.c @@ -1040,12 +1040,30 @@ MaintenanceDaemonShmemExit(int code, Datum arg) if (myDbData != NULL) { /* - * Confirm that I am still the registered maintenance daemon before exiting. + * Once the maintenance daemon fails (e.g., due to an error in the main loop), + * both Postgres tries to restart the failed daemon and Citus attempt to start + * a new one. In that case, the one started by Citus ends up here. + * + * As the maintenance daemon that Citus tried to start, we might see the entry + * for the daemon restarted by Postgres if the system was so slow that it + * took a long time for us to be re-scheduled to call MaintenanceDaemonShmemExit(), + * e.g., under valgrind testing. + * + * In that case, we should unregister ourself only if we are still the registered + * maintenance daemon. */ - Assert(myDbData->workerPid == MyProcPid); - - myDbData->daemonStarted = false; - myDbData->workerPid = 0; + if (myDbData->workerPid == MyProcPid) + { + myDbData->daemonStarted = false; + myDbData->workerPid = 0; + } + else + { + ereport(LOG, (errmsg( + "maintenance daemon for database %u has already been replaced by " + "Postgres, skipping to unregister this maintenance daemon", + databaseOid))); + } } LWLockRelease(&MaintenanceDaemonControl->lock); From b7bfe42f1a4d22db4b1ecc2636cdf83adf27c106 Mon Sep 17 00:00:00 2001 From: Colm Date: Tue, 9 Sep 2025 11:54:13 +0100 Subject: [PATCH 2/8] Document delayed fast path planning in README (#8176) Added detailed explanation of delayed fast path planning in Citus 13.2, including conditions and processes involved. --------- Co-authored-by: Onur Tirtir --- src/backend/distributed/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/backend/distributed/README.md b/src/backend/distributed/README.md index b4e139a1a..17d5321c3 100644 --- a/src/backend/distributed/README.md +++ b/src/backend/distributed/README.md @@ -355,6 +355,15 @@ DEBUG: Total number of commands sent over the session 8: 1 to node localhost:97 (0 rows) ``` +### Delaying the Fast Path Plan + +As of Citus 13.2, if it can be determined at plan-time that a fast path query is against a local shard then a shortcut can be taken so that deparse and parse/plan of the shard query is avoided. Citus must be in MX mode and the shard must be local to the Citus node processing the query. If so, the OID of the distributed table is replaced by the OID of the shard in the parse tree. The parse tree is then given to the Postgres planner which returns a plan that is stored in the distributed plan's task. That plan can be repeatedly used by the local executor (described in the next section), avoiding the need to deparse and plan the shard query on each execution. + +We call this delayed fast path planning because if a query is eligible for fast path planning then `FastPathPlanner()` is delayed if the following properties hold: +- The query is a SELECT or UPDATE on a distributed table (schema or column sharded) or Citus managed local table +- The query has no volatile functions + +If so, then `FastPathRouterQuery()` sets a flag indicating that making the fast path plan should be delayed until after the worker job has been created. At that point the router planner uses `CheckAndBuildDelayedFastPathPlan()` to see if the task's shard placement is local (and not a dummy placement) and the metadata of the shard table and distributed table are consistent (no DDL in progress on the distributed table). If so the parse tree with OID of the distributed table replaced by the OID of the shard table is fed to `standard_planner()` and the resultant plan is saved in the task. Otherwise, if the worker job has been marked for deferred pruning or the shard is not local or the shard is local but it's not safe to swap OIDs, then `CheckAndBuildDelayedFastPathPlan()` calls `FastPathPlanner()` to ensure a complete plan context. Reference tables are not currently supported, but this may be relaxed for SELECT statements in the future. Delayed fast path planning can be disabled by turning off `citus.enable_local_fast_path_query_optimization` (it is on by default). ## Router Planner in Citus From 8bb8b2ce2db15b9c65575cb0e1c72f478e08b829 Mon Sep 17 00:00:00 2001 From: Mehmet YILMAZ Date: Mon, 15 Sep 2025 13:53:35 +0300 Subject: [PATCH 3/8] Remove Code Climate coverage upload steps from GitHub Actions workflow (#8182) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DESCRIPTION: Remove Code Climate coverage upload steps from GitHub Actions workflow CI: remove Code Climate coverage reporting (cc-test-reporter) and related jobs; keep Codecov as source of truth * **Why** Code Climate’s test-reporter has been archived; their download/API path is no longer served, which breaks our CC upload step (`cc-test-reporter …` ends up downloading HTML/404). * **What changed** * Drop the Code Climate formatting/artifact steps from the composite action `.github/actions/upload_coverage/action.yml`. * Delete the `upload-coverage` job that aggregated and pushed to Code Climate (`cc-test-reporter sum-coverage` / `upload-coverage`). * **Impact** * Codecov uploads remain; coverage stays visible via Codecov. * No test/build behavior change—only removes a failing reporter path. --- .github/actions/upload_coverage/action.yml | 12 ----------- .github/workflows/build_and_test.yml | 24 ---------------------- 2 files changed, 36 deletions(-) diff --git a/.github/actions/upload_coverage/action.yml b/.github/actions/upload_coverage/action.yml index ba80ba63a..784cb2a76 100644 --- a/.github/actions/upload_coverage/action.yml +++ b/.github/actions/upload_coverage/action.yml @@ -13,15 +13,3 @@ runs: token: ${{ inputs.codecov_token }} verbose: true gcov: true - - name: Create codeclimate coverage - run: |- - lcov --directory . --capture --output-file lcov.info - lcov --remove lcov.info -o lcov.info '/usr/*' - sed "s=^SF:$PWD/=SF:=g" -i lcov.info # relative pats are required by codeclimate - mkdir -p /tmp/codeclimate - cc-test-reporter format-coverage -t lcov -o /tmp/codeclimate/${{ inputs.flags }}.json lcov.info - shell: bash - - uses: actions/upload-artifact@v4.6.0 - with: - path: "/tmp/codeclimate/*.json" - name: codeclimate-${{ inputs.flags }} diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 2a4f2df86..2d06e262b 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -404,30 +404,6 @@ jobs: with: flags: ${{ env.PG_MAJOR }}_citus_upgrade codecov_token: ${{ secrets.CODECOV_TOKEN }} - upload-coverage: - # secret below is not available for forks so disabling upload action for them - if: ${{ github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request' }} - env: - CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} - runs-on: ubuntu-latest - container: - image: ${{ needs.params.outputs.test_image_name }}:${{ fromJson(needs.params.outputs.pg17_version).full }}${{ needs.params.outputs.image_suffix }} - needs: - - params - - test-citus - - test-arbitrary-configs - - test-citus-upgrade - - test-pg-upgrade - steps: - - uses: actions/download-artifact@v4.1.8 - with: - pattern: codeclimate* - path: codeclimate - merge-multiple: true - - name: Upload coverage results to Code Climate - run: |- - cc-test-reporter sum-coverage codeclimate/*.json -o total.json - cc-test-reporter upload-coverage -i total.json ch_benchmark: name: CH Benchmark if: startsWith(github.ref, 'refs/heads/ch_benchmark/') From 4012e5938a7ce0f66a5ad254c798e9669e86908a Mon Sep 17 00:00:00 2001 From: Mehmet YILMAZ Date: Wed, 17 Sep 2025 10:46:36 +0300 Subject: [PATCH 4/8] =?UTF-8?q?PG18=20-=20normalize=20PG18=20=E2=80=9CREST?= =?UTF-8?q?RICT=E2=80=9D=20FK=20error=20wording=20to=20legacy=20form=20(#8?= =?UTF-8?q?188)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes #8186 https://github.com/postgres/postgres/commit/086c84b23d99c2ad268f97508cd840efc1fdfd79 PG18 emitting a more specific message for foreign-key violations when the action is `RESTRICT` (SQLSTATE 23001), e.g. `violates RESTRICT setting of foreign key constraint ...` and `Key (...) is referenced from table ...`. Older versions printed the generic FK text (SQLSTATE 23503), e.g. `violates foreign key constraint ...` and `Key (...) is still referenced from table ...`. This change was causing noisy diffs in our regression tests (e.g., `multi_foreign_key.out`). To keep a single set of expected files across PG15–PG18, this PR adds two normalization rules to the test filter: ```sed # PG18 FK wording -> legacy generic form s/violates RESTRICT setting of foreign key constraint/violates foreign key constraint/g # DETAIL line: "is referenced" -> "is still referenced" s/\/is still referenced from table/g ``` **Scope / impact** * Test-only change; runtime behavior is unaffected. * Keeps outputs stable across PG15–PG18 without version-splitting expected files. * Rules are narrowly targeted to the FK wording introduced in PG18. with pr: https://github.com/citusdata/citus/actions/runs/17698469722/job/50300960878#step:5:252 --- src/test/regress/bin/normalize.sed | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/regress/bin/normalize.sed b/src/test/regress/bin/normalize.sed index 91484dc75..6df3087cb 100644 --- a/src/test/regress/bin/normalize.sed +++ b/src/test/regress/bin/normalize.sed @@ -359,3 +359,9 @@ s/(Actual[[:space:]]+Rows:[[:space:]]*)N\.N/\1N/gI s/^([ \t]*)List of tables$/\1List of relations/g s/^([ \t]*)List of indexes$/\1List of relations/g s/^([ \t]*)List of sequences$/\1List of relations/g + +# --- PG18 FK wording -> legacy generic form --- +# e.g., "violates RESTRICT setting of foreign key constraint" -> "violates foreign key constraint" +s/violates RESTRICT setting of foreign key constraint/violates foreign key constraint/g +# DETAIL line changed "is referenced" -> old "is still referenced" +s/\/is still referenced from table/g From b58af1c8d584f4fc74c01bf78c16bbfaa1cc07e0 Mon Sep 17 00:00:00 2001 From: Mehmet YILMAZ Date: Wed, 17 Sep 2025 14:12:15 +0300 Subject: [PATCH 5/8] PG18: stabilize constraint-name tests by filtering pg_constraint on contype (#8185) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/postgres/postgres/commit/14e87ffa5c543b5f30ead7413084c25f7735039f PostgreSQL 18 now records column `NOT NULL` constraints in `pg_constraint` (`contype = 'n'`). That means queries that previously listed “all constraints” for a relation now return extra rows, causing noisy diffs in Citus regression tests. This PR narrows each catalog probe to the specific constraint type under test (PK/UNIQUE/EXCLUDE/CHECK), keeping results stable across PG15–PG18. ## What changed * Update `src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql` to: * Add `AND con.contype IN ('p'|'u'|'x'|'c')` in each query, matching the constraint just created. * Join namespace via `rel.relnamespace` for robustness. * Refresh `src/test/regress/expected/multi_alter_table_add_constraints_without_name.out` to reflect the filtered results. ## Why * PG18 adds named `NOT NULL` entries to `pg_constraint`, which previously lived only in `pg_attribute`. Tests that select from `pg_constraint` without filtering now see extra rows (e.g., `*_not_null`), breaking expectations. Filtering by `contype` validates exactly what the test intends (PK/UNIQUE/EXCLUDE/CHECK naming/propagation) and ignores unrelated `NOT NULL` rows. ```diff diff -dU10 -w /__w/citus/citus/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out /__w/citus/citus/src/test/regress/results/multi_alter_table_add_constraints_without_name.out --- /__w/citus/citus/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out.modified 2025-09-11 14:36:52.521254512 +0000 +++ /__w/citus/citus/src/test/regress/results/multi_alter_table_add_constraints_without_name.out.modified 2025-09-11 14:36:52.549254440 +0000 @@ -20,34 +20,36 @@ ALTER TABLE AT_AddConstNoName.products ADD PRIMARY KEY(product_no); SELECT con.conname FROM pg_catalog.pg_constraint con INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace WHERE rel.relname = 'products'; conname ------------------------------ products_pkey -(1 row) + products_product_no_not_null +(2 rows) -- Check that the primary key name created on the coordinator is sent to workers and -- the constraints created for the shard tables conform to the _shardid naming scheme. \c - - :public_worker_1_host :worker_1_port SELECT con.conname FROM pg_catalog.pg_constraint con INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace WHERE rel.relname = 'products_5410000'; conname -------------------------------------- + products_5410000_product_no_not_null products_pkey_5410000 -(1 row) +(2 rows) ``` after pr: https://github.com/citusdata/citus/actions/runs/17697415668/job/50298622183#step:5:265 --- ...ter_table_add_constraints_without_name.out | 666 ++++++++++-------- ...ter_table_add_constraints_without_name.sql | 666 ++++++++++-------- 2 files changed, 766 insertions(+), 566 deletions(-) diff --git a/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out b/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out index 6a6251f9e..6a4c17104 100644 --- a/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out +++ b/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out @@ -20,10 +20,11 @@ SELECT create_distributed_table('AT_AddConstNoName.products', 'product_no'); ALTER TABLE AT_AddConstNoName.products ADD PRIMARY KEY(product_no); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'p'; conname --------------------------------------------------------------------- products_pkey @@ -33,10 +34,11 @@ SELECT con.conname -- the constraints created for the shard tables conform to the _shardid naming scheme. \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'p'; conname --------------------------------------------------------------------- products_pkey_5410000 @@ -45,7 +47,7 @@ SELECT con.conname \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_pkey; -- Check "ADD PRIMARY KEY USING INDEX ..." -CREATE TABLE AT_AddConstNoName.tbl(col1 int, col2 int); +CREATE TABLE AT_AddConstNoName.tbl(col1 int, col2 int); SELECT create_distributed_table('AT_AddConstNoName.tbl', 'col1'); create_distributed_table --------------------------------------------------------------------- @@ -55,10 +57,11 @@ SELECT create_distributed_table('AT_AddConstNoName.tbl', 'col1'); CREATE UNIQUE INDEX my_index ON AT_AddConstNoName.tbl(col1); ALTER TABLE AT_AddConstNoName.tbl ADD PRIMARY KEY USING INDEX my_index; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'tbl'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'tbl' + AND con.contype = 'p'; conname --------------------------------------------------------------------- my_index @@ -66,10 +69,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'tbl%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'tbl%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- my_index @@ -85,10 +90,11 @@ ALTER TABLE AT_AddConstNoName.tbl DROP CONSTRAINT my_index; CREATE UNIQUE INDEX my_index ON AT_AddConstNoName.tbl(col1); ALTER TABLE AT_AddConstNoName.tbl ADD UNIQUE USING INDEX my_index; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'tbl'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'tbl' + AND con.contype = 'u'; conname --------------------------------------------------------------------- my_index @@ -96,10 +102,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'tbl%'ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'tbl%' + AND con.contype = 'u' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- my_index @@ -139,10 +147,11 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_pkey; -- Check "ADD UNIQUE" ALTER TABLE AT_AddConstNoName.products ADD UNIQUE(product_no); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'u'; conname --------------------------------------------------------------------- products_product_no_key @@ -152,10 +161,11 @@ SELECT con.conname -- the constraints created for the shard tables conform to the _shardid scheme. \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'u'; conname --------------------------------------------------------------------- products_product_no_key_5410000 @@ -166,10 +176,11 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_product_no_key; -- Check "ADD UNIQUE" with column name list ALTER TABLE AT_AddConstNoName.products ADD UNIQUE(product_no,name); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'u'; conname --------------------------------------------------------------------- products_product_no_name_key @@ -177,10 +188,11 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'u'; conname --------------------------------------------------------------------- products_product_no_name_key_5410000 @@ -191,10 +203,11 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_product_no_name_ -- Check "ADD UNIQUE ... INCLUDE" ALTER TABLE AT_AddConstNoName.products ADD UNIQUE(product_no) INCLUDE(price); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'u'; conname --------------------------------------------------------------------- products_product_no_key @@ -202,10 +215,11 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'u'; conname --------------------------------------------------------------------- products_product_no_key_5410000 @@ -245,10 +259,11 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_product_no_key; CREATE EXTENSION btree_gist; ALTER TABLE AT_AddConstNoName.products ADD EXCLUDE USING gist (name WITH <> , product_no WITH =); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'x'; conname --------------------------------------------------------------------- products_name_product_no_excl @@ -256,10 +271,11 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'x'; conname --------------------------------------------------------------------- products_name_product_no_excl_5410000 @@ -295,10 +311,11 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_name_product_no_ -- Check "ADD CHECK" ALTER TABLE AT_AddConstNoName.products ADD CHECK (product_no > 0 AND price > 0); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'c'; conname --------------------------------------------------------------------- products_check @@ -306,10 +323,11 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'c'; conname --------------------------------------------------------------------- products_check_5410000 @@ -320,10 +338,11 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_check; -- Check "ADD CHECK ... NOINHERIT" ALTER TABLE AT_AddConstNoName.products ADD CHECK (product_no > 0 AND price > 0) NO INHERIT; SELECT con.conname, con.connoinherit - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'c'; conname | connoinherit --------------------------------------------------------------------- products_check | t @@ -331,10 +350,11 @@ SELECT con.conname, con.connoinherit \c - - :public_worker_1_host :worker_1_port SELECT con.conname, con.connoinherit - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'c'; conname | connoinherit --------------------------------------------------------------------- products_check_5410000 | t @@ -345,10 +365,11 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_check; -- Check "ADD CHECK ... NOT VALID" ALTER TABLE AT_AddConstNoName.products ADD CHECK (product_no > 0 AND price > 0) NOT VALID; SELECT con.conname, con.convalidated - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'c'; conname | convalidated --------------------------------------------------------------------- products_check | f @@ -356,10 +377,11 @@ SELECT con.conname, con.convalidated \c - - :public_worker_1_host :worker_1_port SELECT con.conname, con.convalidated - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'c'; conname | convalidated --------------------------------------------------------------------- products_check_5410000 | f @@ -401,10 +423,11 @@ ALTER TABLE AT_AddConstNoName.products_ref_3 ADD CONSTRAINT products_ref_pkey PR ALTER TABLE AT_AddConstNoName.products_ref_2 ADD CONSTRAINT products_ref_pkey1 PRIMARY KEY(name); ALTER TABLE AT_AddConstNoName.products_ref ADD PRIMARY KEY(name); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_ref'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_ref' + AND con.contype = 'p'; conname --------------------------------------------------------------------- products_ref_pkey2 @@ -416,10 +439,11 @@ ALTER TABLE AT_AddConstNoName.products_ref_3 ADD CONSTRAINT products_ref_name_ke ALTER TABLE AT_AddConstNoName.products_ref_2 ADD CONSTRAINT products_ref_name_key1 UNIQUE(name); ALTER TABLE AT_AddConstNoName.products_ref ADD UNIQUE(name); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_ref'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_ref' + AND con.contype = 'u'; conname --------------------------------------------------------------------- products_ref_name_key2 @@ -431,10 +455,11 @@ ALTER TABLE AT_AddConstNoName.products_ref_3 ADD CONSTRAINT products_ref_product ALTER TABLE AT_AddConstNoName.products_ref_2 ADD CONSTRAINT products_ref_product_no_excl1 EXCLUDE (product_no WITH =); ALTER TABLE AT_AddConstNoName.products_ref ADD EXCLUDE(product_no WITH =); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_ref'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_ref' + AND con.contype = 'x'; conname --------------------------------------------------------------------- products_ref_product_no_excl2 @@ -446,10 +471,11 @@ ALTER TABLE AT_AddConstNoName.products_ref_3 ADD CONSTRAINT products_ref_check ALTER TABLE AT_AddConstNoName.products_ref_2 ADD CONSTRAINT products_ref_check1 CHECK (product_no > 0); ALTER TABLE AT_AddConstNoName.products_ref ADD CHECK (product_no > 0); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_ref'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_ref' + AND con.contype = 'c'; conname --------------------------------------------------------------------- products_ref_check2 @@ -473,10 +499,11 @@ SELECT create_distributed_table('AT_AddConstNoName.verylonglonglonglonglonglongl ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon ADD PRIMARY KEY(product_no); -- Constraint should be created on the coordinator with a shortened name SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'p'; conname --------------------------------------------------------------------- verylonglonglonglonglonglonglonglonglonglonglonglonglonglo_pkey @@ -485,10 +512,12 @@ SELECT con.conname -- Constraints for the main table and the shards should be created on the worker with a shortened name \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410010 @@ -503,10 +532,11 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon DROP CONSTRAINT verylonglonglonglonglonglonglonglonglonglonglonglonglonglo_pkey; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'p'; conname --------------------------------------------------------------------- (0 rows) @@ -516,10 +546,11 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon ADD UNIQUE(product_no); -- Constraint should be created on the coordinator with a shortened name SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'u'; conname --------------------------------------------------------------------- verylonglonglonglonglonglonglonglonglonglonglong_product_no_key @@ -528,10 +559,12 @@ SELECT con.conname -- Constraints for the main table and the shards should be created on the worker with a shortened name \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'u' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410010 @@ -546,10 +579,11 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon DROP CONSTRAINT verylonglonglonglonglonglonglonglonglonglonglong_product_no_key; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'u'; conname --------------------------------------------------------------------- (0 rows) @@ -559,10 +593,11 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon ADD EXCLUDE (product_no WITH =); -- Constraint should be created on the coordinator with a shortened name SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'x'; conname --------------------------------------------------------------------- verylonglonglonglonglonglonglonglonglonglonglon_product_no_excl @@ -571,10 +606,12 @@ SELECT con.conname -- Constraints for the main table and the shards should be created on the worker with a shortened name \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'x' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410010 @@ -589,10 +626,11 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon DROP CONSTRAINT verylonglonglonglonglonglonglonglonglonglonglon_product_no_excl; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'x'; conname --------------------------------------------------------------------- (0 rows) @@ -602,10 +640,11 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon ADD CHECK (product_no > 0); -- Constraint should be created on the coordinator with a shortened name SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'c'; conname --------------------------------------------------------------------- verylonglonglonglonglonglonglonglonglonglonglonglonglongl_check @@ -614,10 +653,12 @@ SELECT con.conname -- Constraints for the main table and the shards should be created on the worker with a shortened name \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410010 @@ -632,10 +673,11 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon DROP CONSTRAINT verylonglonglonglonglonglonglonglonglonglonglonglonglongl_check; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'c'; conname --------------------------------------------------------------------- (0 rows) @@ -663,10 +705,11 @@ DEBUG: verifying table "p1" DEBUG: verifying table "longlonglonglonglonglonglonglonglonglonglonglonglonglonglongabc" RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'dist_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'dist_partitioned_table' + AND con.contype = 'p'; conname --------------------------------------------------------------------- dist_partitioned_table_pkey @@ -674,10 +717,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410018 @@ -691,10 +736,12 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.dist_partitioned_table DROP CONSTRAINT dist_partitioned_table_pkey; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- (0 rows) @@ -709,10 +756,11 @@ DEBUG: ALTER TABLE / ADD UNIQUE will create implicit index "longlonglonglonglon DEBUG: ALTER TABLE / ADD UNIQUE will create implicit index "p1_partition_col_key" for table "p1" RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'dist_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'dist_partitioned_table' + AND con.contype = 'u'; conname --------------------------------------------------------------------- dist_partitioned_table_partition_col_key @@ -720,10 +768,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'u' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410018 @@ -734,7 +784,7 @@ SELECT con.conname (5 rows) \c - - :master_host :master_port -ALTER TABLE AT_AddConstNoName.dist_partitioned_table DROP CONSTRAINT dist_partitioned_table_partition_col_key; +ALTER TABLE AT_AddConstNoName.dist_partitioned_table DROP CONSTRAINT dist_partitioned_table_partition_col_key; -- Check "ADD CHECK" SET client_min_messages TO DEBUG1; ALTER TABLE AT_AddConstNoName.dist_partitioned_table ADD CHECK(dist_col >= another_col); @@ -743,10 +793,11 @@ DEBUG: verifying table "p1" DEBUG: verifying table "longlonglonglonglonglonglonglonglonglonglonglonglonglonglongabc" RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'dist_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'dist_partitioned_table' + AND con.contype = 'c'; conname --------------------------------------------------------------------- dist_partitioned_table_check @@ -754,10 +805,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- dist_partitioned_table_check @@ -771,10 +824,12 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.dist_partitioned_table DROP CONSTRAINT dist_partitioned_table_check; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- (0 rows) @@ -867,10 +922,12 @@ SELECT citus_add_local_table_to_metadata('AT_AddConstNoName.citus_local_table'); ALTER TABLE AT_AddConstNoName.citus_local_table ADD PRIMARY KEY(id); -- Check the primary key is created for the local table and its shard SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_pkey @@ -884,10 +941,12 @@ SELECT create_distributed_table('AT_AddConstNoName.citus_local_table','id'); (1 row) SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_pkey @@ -895,10 +954,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_pkey @@ -915,10 +976,12 @@ ALTER TABLE AT_AddConstNoName.citus_local_table DROP CONSTRAINT citus_local_tabl ALTER TABLE AT_AddConstNoName.citus_local_table ADD UNIQUE(id); -- Check the UNIQUE constraint is created for the local table and its shard SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'u' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_id_key @@ -926,10 +989,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'u' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_id_key @@ -946,20 +1011,24 @@ ALTER TABLE AT_AddConstNoName.citus_local_table DROP CONSTRAINT citus_local_tabl ALTER TABLE AT_AddConstNoName.citus_local_table ADD EXCLUDE(id WITH =); -- Check the EXCLUDE constraint is created for the local table and its shard SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'x' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_id_excl (1 row) SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'x' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_id_excl @@ -967,10 +1036,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'x' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_id_excl @@ -987,20 +1058,24 @@ ALTER TABLE AT_AddConstNoName.citus_local_table DROP CONSTRAINT citus_local_tabl ALTER TABLE AT_AddConstNoName.citus_local_table ADD CHECK(id > 100); -- Check the CHECK constraint is created for the local table and its shard SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_check (1 row) SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_check @@ -1008,10 +1083,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_table_check @@ -1051,10 +1128,11 @@ DEBUG: ALTER TABLE / ADD PRIMARY KEY will create implicit index "longlonglonglo DEBUG: ALTER TABLE / ADD PRIMARY KEY will create implicit index "p1_pkey" for table "p1" RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'citus_local_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'citus_local_partitioned_table' + AND con.contype = 'p'; conname --------------------------------------------------------------------- citus_local_partitioned_table_pkey @@ -1062,10 +1140,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410038 @@ -1088,10 +1168,11 @@ DEBUG: ALTER TABLE / ADD UNIQUE will create implicit index "longlonglonglonglon DEBUG: ALTER TABLE / ADD UNIQUE will create implicit index "p1_partition_col_key" for table "p1" RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'citus_local_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'citus_local_partitioned_table' + AND con.contype = 'u'; conname --------------------------------------------------------------------- citus_local_partitioned_table_partition_col_key @@ -1099,10 +1180,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'u' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410038 @@ -1122,10 +1205,11 @@ DEBUG: verifying table "longlonglonglonglonglonglonglonglonglonglonglonglonglon DEBUG: verifying table "p1" RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'citus_local_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'citus_local_partitioned_table' + AND con.contype = 'c'; conname --------------------------------------------------------------------- citus_local_partitioned_table_check @@ -1133,10 +1217,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- citus_local_partitioned_table_check @@ -1150,10 +1236,12 @@ SELECT con.conname ALTER TABLE AT_AddConstNoName.citus_local_partitioned_table DROP CONSTRAINT citus_local_partitioned_table_check; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- (0 rows) @@ -1168,12 +1256,13 @@ SELECT create_distributed_table('AT_AddConstNoName."2nd table"','2nd id'); (1 row) -- Check "ADD PRIMARY KEY" -ALTER TABLE AT_AddConstNoName."2nd table" ADD PRIMARY KEY ("2nd id", "3rd id"); +ALTER TABLE AT_AddConstNoName."2nd table" ADD PRIMARY KEY ("2nd id", "3rd id"); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = '2nd table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = '2nd table' + AND con.contype = 'p'; conname --------------------------------------------------------------------- 2nd table_pkey @@ -1182,10 +1271,12 @@ SELECT con.conname -- Check if a primary key constraint is created for the shard tables on the workers \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE '2nd table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE '2nd table%' + AND con.contype = 'p' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- 2nd table_pkey @@ -1201,10 +1292,11 @@ ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_pkey"; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName."2nd table" ADD UNIQUE ("2nd id", "3rd id"); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = '2nd table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = '2nd table' + AND con.contype = 'u'; conname --------------------------------------------------------------------- 2nd table_2nd id_3rd id_key @@ -1212,10 +1304,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE '2nd table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE '2nd table%' + AND con.contype = 'u' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- 2nd table_2nd id_3rd id_key @@ -1231,10 +1325,11 @@ ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_2nd id_3rd \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName."2nd table" ADD EXCLUDE ("2nd id" WITH =); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = '2nd table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = '2nd table' + AND con.contype = 'x'; conname --------------------------------------------------------------------- 2nd table_2nd id_excl @@ -1242,10 +1337,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE '2nd table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE '2nd table%' + AND con.contype = 'x' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- 2nd table_2nd id_excl @@ -1261,10 +1358,11 @@ ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_2nd id_exc \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName."2nd table" ADD CHECK ("2nd id" > 0 ); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = '2nd table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = '2nd table' + AND con.contype = 'c'; conname --------------------------------------------------------------------- 2nd table_check @@ -1272,10 +1370,12 @@ SELECT con.conname \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE '2nd table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE '2nd table%' + AND con.contype = 'c' + ORDER BY con.conname ASC; conname --------------------------------------------------------------------- 2nd table_check diff --git a/src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql b/src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql index 206decaa7..351bbfeb8 100644 --- a/src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql +++ b/src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql @@ -20,41 +20,46 @@ SELECT create_distributed_table('AT_AddConstNoName.products', 'product_no'); ALTER TABLE AT_AddConstNoName.products ADD PRIMARY KEY(product_no); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'p'; -- Check that the primary key name created on the coordinator is sent to workers and -- the constraints created for the shard tables conform to the _shardid naming scheme. \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'p'; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_pkey; -- Check "ADD PRIMARY KEY USING INDEX ..." -CREATE TABLE AT_AddConstNoName.tbl(col1 int, col2 int); +CREATE TABLE AT_AddConstNoName.tbl(col1 int, col2 int); SELECT create_distributed_table('AT_AddConstNoName.tbl', 'col1'); CREATE UNIQUE INDEX my_index ON AT_AddConstNoName.tbl(col1); ALTER TABLE AT_AddConstNoName.tbl ADD PRIMARY KEY USING INDEX my_index; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'tbl'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'tbl' + AND con.contype = 'p'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'tbl%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'tbl%' + AND con.contype = 'p' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.tbl DROP CONSTRAINT my_index; @@ -64,17 +69,20 @@ CREATE UNIQUE INDEX my_index ON AT_AddConstNoName.tbl(col1); ALTER TABLE AT_AddConstNoName.tbl ADD UNIQUE USING INDEX my_index; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'tbl'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'tbl' + AND con.contype = 'u'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'tbl%'ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'tbl%' + AND con.contype = 'u' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.tbl DROP CONSTRAINT my_index; @@ -102,19 +110,21 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_pkey; ALTER TABLE AT_AddConstNoName.products ADD UNIQUE(product_no); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'u'; -- Check that UNIQUE constraint name created on the coordinator is sent to workers and -- the constraints created for the shard tables conform to the _shardid scheme. \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'u'; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_product_no_key; @@ -122,17 +132,19 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_product_no_key; -- Check "ADD UNIQUE" with column name list ALTER TABLE AT_AddConstNoName.products ADD UNIQUE(product_no,name); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'u'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'u'; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_product_no_name_key; @@ -141,17 +153,19 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_product_no_name_ ALTER TABLE AT_AddConstNoName.products ADD UNIQUE(product_no) INCLUDE(price); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'u'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'u'; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_product_no_key; @@ -186,17 +200,19 @@ CREATE EXTENSION btree_gist; ALTER TABLE AT_AddConstNoName.products ADD EXCLUDE USING gist (name WITH <> , product_no WITH =); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'x'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'x'; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_name_product_no_excl; @@ -223,17 +239,19 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_name_product_no_ -- Check "ADD CHECK" ALTER TABLE AT_AddConstNoName.products ADD CHECK (product_no > 0 AND price > 0); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'c'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'c'; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_check; @@ -242,17 +260,19 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_check; ALTER TABLE AT_AddConstNoName.products ADD CHECK (product_no > 0 AND price > 0) NO INHERIT; SELECT con.conname, con.connoinherit - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'c'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname, con.connoinherit - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'c'; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_check; @@ -261,17 +281,19 @@ ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_check; ALTER TABLE AT_AddConstNoName.products ADD CHECK (product_no > 0 AND price > 0) NOT VALID; SELECT con.conname, con.convalidated - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products' + AND con.contype = 'c'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname, con.convalidated - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_5410000'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_5410000' + AND con.contype = 'c'; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_check; @@ -306,10 +328,11 @@ ALTER TABLE AT_AddConstNoName.products_ref_2 ADD CONSTRAINT products_ref_pkey1 P ALTER TABLE AT_AddConstNoName.products_ref ADD PRIMARY KEY(name); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_ref'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_ref' + AND con.contype = 'p'; ALTER TABLE AT_AddConstNoName.products_ref DROP CONSTRAINT products_ref_pkey2; @@ -319,10 +342,11 @@ ALTER TABLE AT_AddConstNoName.products_ref_2 ADD CONSTRAINT products_ref_name_ke ALTER TABLE AT_AddConstNoName.products_ref ADD UNIQUE(name); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_ref'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_ref' + AND con.contype = 'u'; ALTER TABLE AT_AddConstNoName.products_ref DROP CONSTRAINT products_ref_name_key2; @@ -332,10 +356,11 @@ ALTER TABLE AT_AddConstNoName.products_ref_2 ADD CONSTRAINT products_ref_product ALTER TABLE AT_AddConstNoName.products_ref ADD EXCLUDE(product_no WITH =); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_ref'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_ref' + AND con.contype = 'x'; ALTER TABLE AT_AddConstNoName.products_ref DROP CONSTRAINT products_ref_product_no_excl2; @@ -345,10 +370,11 @@ ALTER TABLE AT_AddConstNoName.products_ref_2 ADD CONSTRAINT products_ref_check1 ALTER TABLE AT_AddConstNoName.products_ref ADD CHECK (product_no > 0); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'products_ref'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'products_ref' + AND con.contype = 'c'; ALTER TABLE AT_AddConstNoName.products_ref DROP CONSTRAINT products_ref_check2; @@ -367,18 +393,21 @@ ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglo -- Constraint should be created on the coordinator with a shortened name SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'p'; -- Constraints for the main table and the shards should be created on the worker with a shortened name \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'p' + ORDER BY con.conname ASC; -- Constraint can be deleted via the coordinator \c - - :master_host :master_port @@ -386,10 +415,11 @@ ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglo \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'p'; -- Check "ADD UNIQUE" with max table name (63 chars) \c - - :master_host :master_port @@ -397,18 +427,21 @@ ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglo -- Constraint should be created on the coordinator with a shortened name SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'u'; -- Constraints for the main table and the shards should be created on the worker with a shortened name \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'u' + ORDER BY con.conname ASC; -- UNIQUE constraint can be deleted via the coordinator \c - - :master_host :master_port @@ -416,10 +449,11 @@ ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglo \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'u'; -- Check "ADD EXCLUDE" with max table name (63 chars) \c - - :master_host :master_port @@ -427,18 +461,21 @@ ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglo -- Constraint should be created on the coordinator with a shortened name SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'x'; -- Constraints for the main table and the shards should be created on the worker with a shortened name \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'x' + ORDER BY con.conname ASC; -- EXCLUDE constraint can be deleted via the coordinator \c - - :master_host :master_port @@ -446,28 +483,32 @@ ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglo \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'x'; -- Check "ADD CHECK" with max table name (63 chars) \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon ADD CHECK (product_no > 0); -- Constraint should be created on the coordinator with a shortened name SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'c'; -- Constraints for the main table and the shards should be created on the worker with a shortened name \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'c' + ORDER BY con.conname ASC; -- CHECK constraint can be deleted via the coordinator \c - - :master_host :master_port @@ -475,10 +516,11 @@ ALTER TABLE AT_AddConstNoName.verylonglonglonglonglonglonglonglonglonglonglonglo \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'very%'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'very%' + AND con.contype = 'c'; -- Test the scenario where a partitioned distributed table has a child with max allowed name -- Verify that we switch to sequential execution mode to avoid deadlock in this scenario @@ -494,27 +536,32 @@ ALTER TABLE AT_AddConstNoName.dist_partitioned_table ADD PRIMARY KEY(partition_c RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'dist_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'dist_partitioned_table' + AND con.contype = 'p'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'p' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.dist_partitioned_table DROP CONSTRAINT dist_partitioned_table_pkey; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'p' + ORDER BY con.conname ASC; -- Check "ADD UNIQUE" \c - - :master_host :master_port @@ -523,20 +570,23 @@ ALTER TABLE AT_AddConstNoName.dist_partitioned_table ADD UNIQUE(partition_col); RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'dist_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'dist_partitioned_table' + AND con.contype = 'u'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'u' + ORDER BY con.conname ASC; \c - - :master_host :master_port -ALTER TABLE AT_AddConstNoName.dist_partitioned_table DROP CONSTRAINT dist_partitioned_table_partition_col_key; +ALTER TABLE AT_AddConstNoName.dist_partitioned_table DROP CONSTRAINT dist_partitioned_table_partition_col_key; -- Check "ADD CHECK" SET client_min_messages TO DEBUG1; @@ -544,27 +594,32 @@ ALTER TABLE AT_AddConstNoName.dist_partitioned_table ADD CHECK(dist_col >= anoth RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'dist_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'dist_partitioned_table' + AND con.contype = 'c'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'c' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.dist_partitioned_table DROP CONSTRAINT dist_partitioned_table_check; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'c' + ORDER BY con.conname ASC; -- Test we error out when creating a constraint on a partition table with a long name if we cannot -- switch to sequential execution @@ -621,25 +676,31 @@ ALTER TABLE AT_AddConstNoName.citus_local_table ADD PRIMARY KEY(id); -- Check the primary key is created for the local table and its shard SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'p' + ORDER BY con.conname ASC; SELECT create_distributed_table('AT_AddConstNoName.citus_local_table','id'); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'p' + ORDER BY con.conname ASC; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'p' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.citus_local_table DROP CONSTRAINT citus_local_table_pkey; @@ -650,17 +711,21 @@ ALTER TABLE AT_AddConstNoName.citus_local_table ADD UNIQUE(id); -- Check the UNIQUE constraint is created for the local table and its shard SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'u' + ORDER BY con.conname ASC; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'u' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.citus_local_table DROP CONSTRAINT citus_local_table_id_key; @@ -671,23 +736,29 @@ ALTER TABLE AT_AddConstNoName.citus_local_table ADD EXCLUDE(id WITH =); -- Check the EXCLUDE constraint is created for the local table and its shard SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'x' + ORDER BY con.conname ASC; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'x' + ORDER BY con.conname ASC; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'x' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.citus_local_table DROP CONSTRAINT citus_local_table_id_excl; @@ -698,23 +769,29 @@ ALTER TABLE AT_AddConstNoName.citus_local_table ADD CHECK(id > 100); -- Check the CHECK constraint is created for the local table and its shard SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'c' + ORDER BY con.conname ASC; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'c' + ORDER BY con.conname ASC; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'citus_local_table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'citus_local_table%' + AND con.contype = 'c' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.citus_local_table DROP CONSTRAINT citus_local_table_check; @@ -739,17 +816,20 @@ ALTER TABLE AT_AddConstNoName.citus_local_partitioned_table ADD PRIMARY KEY(part RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'citus_local_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'citus_local_partitioned_table' + AND con.contype = 'p'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'p' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.citus_local_partitioned_table DROP CONSTRAINT citus_local_partitioned_table_pkey; @@ -764,17 +844,20 @@ ALTER TABLE AT_AddConstNoName.citus_local_partitioned_table ADD UNIQUE(partition RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'citus_local_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'citus_local_partitioned_table' + AND con.contype = 'u'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'u' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.citus_local_partitioned_table DROP CONSTRAINT citus_local_partitioned_table_partition_col_key; @@ -785,27 +868,32 @@ ALTER TABLE AT_AddConstNoName.citus_local_partitioned_table ADD CHECK (dist_col RESET client_min_messages; SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = 'citus_local_partitioned_table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = 'citus_local_partitioned_table' + AND con.contype = 'c'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'c' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.citus_local_partitioned_table DROP CONSTRAINT citus_local_partitioned_table_check; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' + AND con.contype = 'c' + ORDER BY con.conname ASC; \c - - :master_host :master_port -- Test with unusual table and column names @@ -813,20 +901,23 @@ CREATE TABLE AT_AddConstNoName."2nd table" ( "2nd id" INTEGER, "3rd id" INTEGER) SELECT create_distributed_table('AT_AddConstNoName."2nd table"','2nd id'); -- Check "ADD PRIMARY KEY" -ALTER TABLE AT_AddConstNoName."2nd table" ADD PRIMARY KEY ("2nd id", "3rd id"); +ALTER TABLE AT_AddConstNoName."2nd table" ADD PRIMARY KEY ("2nd id", "3rd id"); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = '2nd table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = '2nd table' + AND con.contype = 'p'; -- Check if a primary key constraint is created for the shard tables on the workers \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE '2nd table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE '2nd table%' + AND con.contype = 'p' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_pkey"; @@ -836,17 +927,20 @@ ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_pkey"; ALTER TABLE AT_AddConstNoName."2nd table" ADD UNIQUE ("2nd id", "3rd id"); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = '2nd table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = '2nd table' + AND con.contype = 'u'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE '2nd table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE '2nd table%' + AND con.contype = 'u' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_2nd id_3rd id_key"; @@ -856,17 +950,20 @@ ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_2nd id_3rd ALTER TABLE AT_AddConstNoName."2nd table" ADD EXCLUDE ("2nd id" WITH =); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = '2nd table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = '2nd table' + AND con.contype = 'x'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE '2nd table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE '2nd table%' + AND con.contype = 'x' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_2nd id_excl"; @@ -876,17 +973,20 @@ ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_2nd id_exc ALTER TABLE AT_AddConstNoName."2nd table" ADD CHECK ("2nd id" > 0 ); SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname = '2nd table'; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname = '2nd table' + AND con.contype = 'c'; \c - - :public_worker_1_host :worker_1_port SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace - WHERE rel.relname LIKE '2nd table%' ORDER BY con.conname ASC; + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace + WHERE rel.relname LIKE '2nd table%' + AND con.contype = 'c' + ORDER BY con.conname ASC; \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_check"; From 360fbe3b997ccdf1c353596264f1344972700701 Mon Sep 17 00:00:00 2001 From: eaydingol <60466783+eaydingol@users.noreply.github.com> Date: Wed, 17 Sep 2025 17:01:45 +0300 Subject: [PATCH 6/8] Technical document update for outer join pushdown (#8200) Outer join pushdown entry and an example. --- src/backend/distributed/README.md | 46 ++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/backend/distributed/README.md b/src/backend/distributed/README.md index 17d5321c3..a0e9c980d 100644 --- a/src/backend/distributed/README.md +++ b/src/backend/distributed/README.md @@ -797,14 +797,13 @@ WHERE l.user_id = o.user_id AND o.primary_key = 55; -### Ref table LEFT JOIN distributed table JOINs via recursive planning +### Outer joins between reference and distributed tables -Very much like local-distributed table joins, Citus can't push down queries formatted as: +In general, when the outer side of an outer join is a recurring tuple (e.g., reference table, intermediate results, or set returning functions), it is not safe to push down the join. ```sql "... ref_table LEFT JOIN distributed_table ..." +"... distributed_table RIGHT JOIN ref_table ..." ``` -This is the case when the outer side is a recurring tuple (e.g., reference table, intermediate results, or set returning functions). - In these situations, Citus recursively plans the "distributed" part of the join. Even though it may seem excessive to recursively plan a distributed table, remember that Citus pushes down the filters and projections. Functions involved here include `RequiredAttrNumbersForRelation()` and `ReplaceRTERelationWithRteSubquery()`. The core function handling this logic is `RecursivelyPlanRecurringTupleOuterJoinWalker()`. There are likely numerous optimizations possible (e.g., first pushing down an inner JOIN then an outer join), but these have not been implemented due to their complexity. @@ -828,6 +827,45 @@ DEBUG: Wrapping relation "orders_table" "o" to a subquery DEBUG: generating subplan 45_1 for subquery SELECT order_id, status FROM public.orders_table o WHERE true ``` +As of Citus 13.2, under certain conditions, Citus can push down these types of LEFT and RIGHT outer joins by injecting constraints—derived from the shard intervals of distributed tables—into shard queries for the reference table. The eligibility rules for pushdown are defined in `CanPushdownRecurringOuterJoin()`, while the logic for computing and injecting the constraints is implemented in `UpdateWhereClauseToPushdownRecurringOuterJoin()`. + +#### Example Query + +In the example below, Citus pushes down the query by injecting interval constraints on the reference table. The injected constraints are visible in the EXPLAIN output. + +```sql +SELECT pc.category_name, count(pt.product_id) +FROM product_categories pc +LEFT JOIN products_table pt ON pc.category_id = pt.product_id +GROUP BY pc.category_name; +``` + +#### Debug Messages +``` +DEBUG: Router planner cannot handle multi-shard select queries +DEBUG: a push down safe left join with recurring left side +``` + +#### Explain Output +``` +HashAggregate + Group Key: remote_scan.category_name + -> Custom Scan (Citus Adaptive) + Task Count: 32 + Tasks Shown: One of 32 + -> Task + Node: host=localhost port=9701 dbname=ebru + -> HashAggregate + Group Key: pc.category_name + -> Hash Right Join + Hash Cond: (pt.product_id = pc.category_id) + -> Seq Scan on products_table_102072 pt + -> Hash + -> Seq Scan on product_categories_102106 pc + Filter: ((category_id IS NULL) OR ((btint4cmp('-2147483648'::integer, hashint8((category_id)::bigint)) < 0) AND (btint4cmp(hashint8((category_id::bigint), '-2013265921'::integer) <= 0))) +``` + + ### Recursive Planning When FROM Clause has Reference Table (or Recurring Tuples) This section discusses a specific scenario in Citus's recursive query planning: handling queries where the main query's `FROM` clause is recurring, but there are subqueries in the `SELECT` or `WHERE` clauses involving distributed tables. From becc02b398858e3226f1360897c149a0a9ad118c Mon Sep 17 00:00:00 2001 From: Naisila Puka <37271756+naisila@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:01:29 +0300 Subject: [PATCH 7/8] Cleanup from dropping pg14 in merge isolation tests (#8204) These alternative test outputs are redundant since we have dropped PG14 support on main. --- src/test/regress/expected/isolation_merge_0.out | 5 ----- .../expected/isolation_merge_replicated_0.out | 5 ----- src/test/regress/spec/isolation_merge.spec | 12 ------------ .../regress/spec/isolation_merge_replicated.spec | 12 ------------ 4 files changed, 34 deletions(-) delete mode 100644 src/test/regress/expected/isolation_merge_0.out delete mode 100644 src/test/regress/expected/isolation_merge_replicated_0.out diff --git a/src/test/regress/expected/isolation_merge_0.out b/src/test/regress/expected/isolation_merge_0.out deleted file mode 100644 index 3b43a25e6..000000000 --- a/src/test/regress/expected/isolation_merge_0.out +++ /dev/null @@ -1,5 +0,0 @@ -Parsed test spec with 2 sessions - -starting permutation: s1-begin s1-upd-ins s2-result s1-commit s2-result -setup failed: ERROR: MERGE is not supported on PG versions below 15 -CONTEXT: PL/pgSQL function inline_code_block line XX at RAISE diff --git a/src/test/regress/expected/isolation_merge_replicated_0.out b/src/test/regress/expected/isolation_merge_replicated_0.out deleted file mode 100644 index 51161dfb7..000000000 --- a/src/test/regress/expected/isolation_merge_replicated_0.out +++ /dev/null @@ -1,5 +0,0 @@ -Parsed test spec with 2 sessions - -starting permutation: s1-begin s1-upd-ins s2-begin s2-update s1-commit s2-commit s1-result s2-result -setup failed: ERROR: MERGE is not supported on PG versions below 15 -CONTEXT: PL/pgSQL function inline_code_block line XX at RAISE diff --git a/src/test/regress/spec/isolation_merge.spec b/src/test/regress/spec/isolation_merge.spec index 042ce9155..baa90f469 100644 --- a/src/test/regress/spec/isolation_merge.spec +++ b/src/test/regress/spec/isolation_merge.spec @@ -5,18 +5,6 @@ // create distributed tables to test behavior of MERGE in concurrent operations setup { - DO - $do$ - DECLARE ver int; - BEGIN - SELECT substring(version(), '\d+')::int into ver; - IF (ver < 15) - THEN - RAISE EXCEPTION 'MERGE is not supported on PG versions below 15'; - END IF; - END - $do$; - SET citus.shard_replication_factor TO 1; SELECT 1 FROM master_add_node('localhost', 57637); SELECT 1 FROM master_add_node('localhost', 57638); diff --git a/src/test/regress/spec/isolation_merge_replicated.spec b/src/test/regress/spec/isolation_merge_replicated.spec index a586bdfa1..296b64816 100644 --- a/src/test/regress/spec/isolation_merge_replicated.spec +++ b/src/test/regress/spec/isolation_merge_replicated.spec @@ -5,18 +5,6 @@ // create distributed tables to test behavior of MERGE in concurrent operations setup { - DO - $do$ - DECLARE ver int; - BEGIN - SELECT substring(version(), '\d+')::int into ver; - IF (ver < 15) - THEN - RAISE EXCEPTION 'MERGE is not supported on PG versions below 15'; - END IF; - END - $do$; - SET citus.shard_replication_factor TO 2; SELECT 1 FROM master_add_node('localhost', 57637); SELECT 1 FROM master_add_node('localhost', 57638); From b4cb1a94e920a2a1ad5666c5c4b4db4d40cc4098 Mon Sep 17 00:00:00 2001 From: Naisila Puka <37271756+naisila@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:54:55 +0300 Subject: [PATCH 8/8] Bump citus and citus_columnar to 14.0devel (#8170) --- configure | 18 +++++++-------- configure.ac | 2 +- src/backend/columnar/citus_columnar.control | 2 +- .../sql/citus_columnar--13.2-1--14.0-1.sql | 2 ++ .../citus_columnar--14.0-1--13.2-1.sql | 2 ++ src/backend/distributed/citus.control | 2 +- .../distributed/sql/citus--13.2-1--14.0-1.sql | 2 ++ .../sql/downgrades/citus--14.0-1--13.2-1.sql | 2 ++ src/test/regress/citus_tests/config.py | 2 +- src/test/regress/expected/multi_extension.out | 22 ++++++++++++++++--- src/test/regress/sql/multi_extension.sql | 10 +++++++++ 11 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 src/backend/columnar/sql/citus_columnar--13.2-1--14.0-1.sql create mode 100644 src/backend/columnar/sql/downgrades/citus_columnar--14.0-1--13.2-1.sql create mode 100644 src/backend/distributed/sql/citus--13.2-1--14.0-1.sql create mode 100644 src/backend/distributed/sql/downgrades/citus--14.0-1--13.2-1.sql diff --git a/configure b/configure index 8deed181e..cdaf0e78b 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for Citus 13.2devel. +# Generated by GNU Autoconf 2.69 for Citus 14.0devel. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -579,8 +579,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Citus' PACKAGE_TARNAME='citus' -PACKAGE_VERSION='13.2devel' -PACKAGE_STRING='Citus 13.2devel' +PACKAGE_VERSION='14.0devel' +PACKAGE_STRING='Citus 14.0devel' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1262,7 +1262,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Citus 13.2devel to adapt to many kinds of systems. +\`configure' configures Citus 14.0devel to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1324,7 +1324,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Citus 13.2devel:";; + short | recursive ) echo "Configuration of Citus 14.0devel:";; esac cat <<\_ACEOF @@ -1429,7 +1429,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Citus configure 13.2devel +Citus configure 14.0devel generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1912,7 +1912,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Citus $as_me 13.2devel, which was +It was created by Citus $as_me 14.0devel, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -5393,7 +5393,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Citus $as_me 13.2devel, which was +This file was extended by Citus $as_me 14.0devel, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5455,7 +5455,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -Citus config.status 13.2devel +Citus config.status 14.0devel configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 137323c1a..c7b5ba1de 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@ # everyone needing autoconf installed, the resulting files are checked # into the SCM. -AC_INIT([Citus], [13.2devel]) +AC_INIT([Citus], [14.0devel]) AC_COPYRIGHT([Copyright (c) Citus Data, Inc.]) # we'll need sed and awk for some of the version commands diff --git a/src/backend/columnar/citus_columnar.control b/src/backend/columnar/citus_columnar.control index 9047037a0..872831bd3 100644 --- a/src/backend/columnar/citus_columnar.control +++ b/src/backend/columnar/citus_columnar.control @@ -1,6 +1,6 @@ # Columnar extension comment = 'Citus Columnar extension' -default_version = '13.2-1' +default_version = '14.0-1' module_pathname = '$libdir/citus_columnar' relocatable = false schema = pg_catalog diff --git a/src/backend/columnar/sql/citus_columnar--13.2-1--14.0-1.sql b/src/backend/columnar/sql/citus_columnar--13.2-1--14.0-1.sql new file mode 100644 index 000000000..016c78f6b --- /dev/null +++ b/src/backend/columnar/sql/citus_columnar--13.2-1--14.0-1.sql @@ -0,0 +1,2 @@ +-- citus_columnar--13.2-1--14.0-1 +-- bump version to 14.0-1 diff --git a/src/backend/columnar/sql/downgrades/citus_columnar--14.0-1--13.2-1.sql b/src/backend/columnar/sql/downgrades/citus_columnar--14.0-1--13.2-1.sql new file mode 100644 index 000000000..0504d0048 --- /dev/null +++ b/src/backend/columnar/sql/downgrades/citus_columnar--14.0-1--13.2-1.sql @@ -0,0 +1,2 @@ +-- citus_columnar--14.0-1--13.2-1 +-- downgrade version to 13.2-1 diff --git a/src/backend/distributed/citus.control b/src/backend/distributed/citus.control index 3dfaf3c38..11531abbe 100644 --- a/src/backend/distributed/citus.control +++ b/src/backend/distributed/citus.control @@ -1,6 +1,6 @@ # Citus extension comment = 'Citus distributed database' -default_version = '13.2-1' +default_version = '14.0-1' module_pathname = '$libdir/citus' relocatable = false schema = pg_catalog diff --git a/src/backend/distributed/sql/citus--13.2-1--14.0-1.sql b/src/backend/distributed/sql/citus--13.2-1--14.0-1.sql new file mode 100644 index 000000000..ebf34b7fd --- /dev/null +++ b/src/backend/distributed/sql/citus--13.2-1--14.0-1.sql @@ -0,0 +1,2 @@ +-- citus--13.2-1--14.0-1 +-- bump version to 14.0-1 diff --git a/src/backend/distributed/sql/downgrades/citus--14.0-1--13.2-1.sql b/src/backend/distributed/sql/downgrades/citus--14.0-1--13.2-1.sql new file mode 100644 index 000000000..3ef630c4b --- /dev/null +++ b/src/backend/distributed/sql/downgrades/citus--14.0-1--13.2-1.sql @@ -0,0 +1,2 @@ +-- citus--14.0-1--13.2-1 +-- downgrade version to 13.2-1 diff --git a/src/test/regress/citus_tests/config.py b/src/test/regress/citus_tests/config.py index 2e3375856..bb825deb4 100644 --- a/src/test/regress/citus_tests/config.py +++ b/src/test/regress/citus_tests/config.py @@ -49,7 +49,7 @@ CITUS_ARBITRARY_TEST_DIR = "./tmp_citus_test" MASTER = "master" # This should be updated when citus version changes -MASTER_VERSION = "13.2" +MASTER_VERSION = "14.0" HOME = expanduser("~") diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index f11f76bc6..d3ed19f21 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -1652,12 +1652,28 @@ SELECT * FROM multi_extension.print_extension_changes(); | view citus_stats (12 rows) +-- Test downgrade to 13.2-1 from 14.0-1 +ALTER EXTENSION citus UPDATE TO '14.0-1'; +ALTER EXTENSION citus UPDATE TO '13.2-1'; +-- Should be empty result since upgrade+downgrade should be a no-op +SELECT * FROM multi_extension.print_extension_changes(); + previous_object | current_object +--------------------------------------------------------------------- +(0 rows) + +-- Snapshot of state at 14.0-1 +ALTER EXTENSION citus UPDATE TO '14.0-1'; +SELECT * FROM multi_extension.print_extension_changes(); + previous_object | current_object +--------------------------------------------------------------------- +(0 rows) + DROP TABLE multi_extension.prev_objects, multi_extension.extension_diff; -- show running version SHOW citus.version; citus.version --------------------------------------------------------------------- - 13.2devel + 14.0devel (1 row) -- ensure no unexpected objects were created outside pg_catalog @@ -1692,7 +1708,7 @@ DROP EXTENSION citus; DROP EXTENSION citus_columnar; CREATE EXTENSION citus VERSION '8.0-1'; ERROR: specified version incompatible with loaded Citus library -DETAIL: Loaded library requires 13.2, but 8.0-1 was specified. +DETAIL: Loaded library requires 14.0, but 8.0-1 was specified. HINT: If a newer library is present, restart the database and try the command again. -- Test non-distributed queries work even in version mismatch SET citus.enable_version_checks TO 'false'; @@ -1737,7 +1753,7 @@ ORDER BY 1; -- We should not distribute table in version mistmatch SELECT create_distributed_table('version_mismatch_table', 'column1'); ERROR: loaded Citus library version differs from installed extension version -DETAIL: Loaded library requires 13.2, but the installed extension version is 8.1-1. +DETAIL: Loaded library requires 14.0, but the installed extension version is 8.1-1. HINT: Run ALTER EXTENSION citus UPDATE and try again. -- This function will cause fail in next ALTER EXTENSION CREATE OR REPLACE FUNCTION pg_catalog.relation_is_a_known_shard(regclass) diff --git a/src/test/regress/sql/multi_extension.sql b/src/test/regress/sql/multi_extension.sql index 8877133f9..0a82075c3 100644 --- a/src/test/regress/sql/multi_extension.sql +++ b/src/test/regress/sql/multi_extension.sql @@ -750,6 +750,16 @@ SELECT * FROM multi_extension.print_extension_changes(); ALTER EXTENSION citus UPDATE TO '13.2-1'; SELECT * FROM multi_extension.print_extension_changes(); +-- Test downgrade to 13.2-1 from 14.0-1 +ALTER EXTENSION citus UPDATE TO '14.0-1'; +ALTER EXTENSION citus UPDATE TO '13.2-1'; +-- Should be empty result since upgrade+downgrade should be a no-op +SELECT * FROM multi_extension.print_extension_changes(); + +-- Snapshot of state at 14.0-1 +ALTER EXTENSION citus UPDATE TO '14.0-1'; +SELECT * FROM multi_extension.print_extension_changes(); + DROP TABLE multi_extension.prev_objects, multi_extension.extension_diff; -- show running version