diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index c2cab0272..11fb010b7 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -165,10 +165,8 @@ RUN sudo apt update \ RUN sudo curl -o /root/gdbpg.py https://raw.githubusercontent.com/tvesely/gdbpg/6065eee7872457785f830925eac665aa535caf62/gdbpg.py COPY --chown=root:root .gdbinit /root/ -# add some common tools to the final container -# bin directory for user tools -RUN mkdir .bin -ENV PATH="/home/citus/.bin:${PATH}" +# install developer dependencies in the global environment +RUN --mount=type=bind,source=requirements.txt,target=requirements.txt pip install -r requirements.txt # for persistent bash history across devcontainers we need to have # a) a directory to store the history in @@ -181,14 +179,16 @@ RUN sudo install -d -o citus -g citus /commandhistory \ # install citus-dev RUN git clone --branch develop https://github.com/citusdata/tools.git citus-tools \ && ( cd citus-tools/citus_dev && pipenv install ) \ - && ln -s /home/citus/citus-tools/citus_dev/citus_dev-pipenv .bin/citus_dev \ + && mkdir -p ~/.local/bin \ + && ln -s /home/citus/citus-tools/citus_dev/citus_dev-pipenv .local/bin/citus_dev \ && sudo make -C citus-tools/uncrustify install bindir=/usr/local/bin pkgsysconfdir=/usr/local/etc/ \ && mkdir -p ~/.local/share/bash-completion/completions/ \ && ln -s ~/citus-tools/citus_dev/bash_completion ~/.local/share/bash-completion/completions/citus_dev # TODO some LC_ALL errors, possibly solved by locale-gen RUN git clone https://github.com/so-fancy/diff-so-fancy.git \ - && ln -s /home/citus/diff-so-fancy/diff-so-fancy .bin/ + && mkdir -p ~/.local/bin \ + && ln -s /home/citus/diff-so-fancy/diff-so-fancy .local/bin/ COPY --link --from=uncrustify-builder /uncrustify/usr/ /usr/ diff --git a/.devcontainer/requirements.txt b/.devcontainer/requirements.txt new file mode 100644 index 000000000..7300b3b89 --- /dev/null +++ b/.devcontainer/requirements.txt @@ -0,0 +1,9 @@ +black==23.11.0 +click==8.1.7 +isort==5.12.0 +mypy-extensions==1.0.0 +packaging==23.2 +pathspec==0.11.2 +platformdirs==4.0.0 +tomli==2.0.1 +typing_extensions==4.8.0 diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 6b33c658f..f820fae4c 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -31,7 +31,7 @@ jobs: pgupgrade_image_name: "citus/pgupgradetester" style_checker_image_name: "citus/stylechecker" style_checker_tools_version: "0.8.18" - image_suffix: "-vbd8441d" + image_suffix: "-v19b671f" pg14_version: '{ "major": "14", "full": "14.10" }' pg15_version: '{ "major": "15", "full": "15.5" }' pg16_version: '{ "major": "16", "full": "16.1" }' @@ -76,6 +76,8 @@ jobs: run: ci/editorconfig.sh && git diff --exit-code - name: Remove useless declarations run: ci/remove_useless_declarations.sh && git diff --cached --exit-code + - name: Sort and group includes + run: ci/sort_and_group_includes.sh && git diff --exit-code - name: Normalize test output run: ci/normalize_expected.sh && git diff --exit-code - name: Check for C-style comments in migration files diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index c62fe11df..dd5d506e4 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -20,7 +20,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: | ghcr.io/citusdata/citus-devcontainer @@ -32,14 +32,14 @@ jobs: uses: docker/setup-buildx-action@v2 - name: 'Login to GitHub Container Registry' - uses: docker/login-action@v1 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{github.actor}} password: ${{secrets.GITHUB_TOKEN}} - name: Build and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: "{{defaultContext}}:.devcontainer" push: true diff --git a/ci/README.md b/ci/README.md index 37ef94f4f..b8dad35ac 100644 --- a/ci/README.md +++ b/ci/README.md @@ -385,3 +385,18 @@ definitions are in alphabetical order. ## `print_stack_trace.sh` This script prints stack traces for failed tests, if they left core files. + +## `sort_and_group_includes.sh` + +This script checks and fixes issues with include grouping and sorting in C files. + +Includes are grouped in the following groups: + - System includes (eg. `#include `) + - Postgres.h include (eg. `#include "postgres.h"`) + - Toplevel postgres includes (includes not in a directory eg. `#include "miscadmin.h`) + - Postgres includes in a directory (eg. `#include "catalog/pg_type.h"`) + - Toplevel citus includes (includes not in a directory eg. `#include "pg_version_constants.h"`) + - Columnar includes (eg. `#include "columnar/columnar.h"`) + - Distributed includes (eg. `#include "distributed/maintenanced.h"`) + +Within every group the include lines are sorted alphabetically. diff --git a/ci/fix_style.sh b/ci/fix_style.sh index 3d6e7ae83..bb78d5f50 100755 --- a/ci/fix_style.sh +++ b/ci/fix_style.sh @@ -19,3 +19,4 @@ ci/disallow_long_changelog_entries.sh ci/normalize_expected.sh ci/fix_gitignore.sh ci/print_stack_trace.sh +ci/sort_and_group_includes.sh diff --git a/ci/include_grouping.py b/ci/include_grouping.py new file mode 100755 index 000000000..4b1370d61 --- /dev/null +++ b/ci/include_grouping.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +""" +easy command line to run against all citus-style checked files: + +$ git ls-files \ + | git check-attr --stdin citus-style \ + | grep 'citus-style: set' \ + | awk '{print $1}' \ + | cut -d':' -f1 \ + | xargs -n1 ./ci/include_grouping.py +""" + +import collections +import os +import sys + + +def main(args): + if len(args) < 2: + print("Usage: include_grouping.py ") + return + + file = args[1] + if not os.path.isfile(file): + sys.exit(f"File '{file}' does not exist") + + with open(file, "r") as in_file: + with open(file + ".tmp", "w") as out_file: + includes = [] + skipped_lines = [] + + # This calls print_sorted_includes on a set of consecutive #include lines. + # This implicitly keeps separation of any #include lines that are contained in + # an #ifdef, because it will order the #include lines inside and after the + # #ifdef completely separately. + for line in in_file: + # if a line starts with #include we don't want to print it yet, instead we + # want to collect all consecutive #include lines + if line.startswith("#include"): + includes.append(line) + skipped_lines = [] + continue + + # if we have collected any #include lines, we want to print them sorted + # before printing the current line. However, if the current line is empty + # we want to perform a lookahead to see if the next line is an #include. + # To maintain any separation between #include lines and their subsequent + # lines we keep track of all lines we have skipped inbetween. + if len(includes) > 0: + if len(line.strip()) == 0: + skipped_lines.append(line) + continue + + # we have includes that need to be grouped before printing the current + # line. + print_sorted_includes(includes, file=out_file) + includes = [] + + # print any skipped lines + print("".join(skipped_lines), end="", file=out_file) + skipped_lines = [] + + print(line, end="", file=out_file) + + # move out_file to file + os.rename(file + ".tmp", file) + + +def print_sorted_includes(includes, file=sys.stdout): + default_group_key = 1 + groups = collections.defaultdict(set) + + # define the groups that we separate correctly. The matchers are tested in the order + # of their priority field. The first matcher that matches the include is used to + # assign the include to a group. + # The groups are printed in the order of their group_key. + matchers = [ + { + "name": "system includes", + "matcher": lambda x: x.startswith("<"), + "group_key": -2, + "priority": 0, + }, + { + "name": "toplevel postgres includes", + "matcher": lambda x: "/" not in x, + "group_key": 0, + "priority": 9, + }, + { + "name": "postgres.h", + "matcher": lambda x: x.strip() in ['"postgres.h"'], + "group_key": -1, + "priority": -1, + }, + { + "name": "toplevel citus inlcudes", + "matcher": lambda x: x.strip() + in [ + '"citus_version.h"', + '"pg_version_compat.h"', + '"pg_version_constants.h"', + ], + "group_key": 3, + "priority": 0, + }, + { + "name": "columnar includes", + "matcher": lambda x: x.startswith('"columnar/'), + "group_key": 4, + "priority": 1, + }, + { + "name": "distributed includes", + "matcher": lambda x: x.startswith('"distributed/'), + "group_key": 5, + "priority": 1, + }, + ] + matchers.sort(key=lambda x: x["priority"]) + + # throughout our codebase we have some includes where either postgres or citus + # includes are wrongfully included with the syntax for system includes. Before we + # try to match those we will change the <> to "" to make them match our system. This + # will also rewrite the include to the correct syntax. + common_system_include_error_prefixes = [" 0: + print(file=file) + includes = group[1] + print("".join(sorted(includes)), end="", file=file) + + +if __name__ == "__main__": + main(sys.argv) diff --git a/ci/sort_and_group_includes.sh b/ci/sort_and_group_includes.sh new file mode 100755 index 000000000..1c3a91458 --- /dev/null +++ b/ci/sort_and_group_includes.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +set -euo pipefail +# shellcheck disable=SC1091 +source ci/ci_helpers.sh + +git ls-files \ + | git check-attr --stdin citus-style \ + | grep 'citus-style: set' \ + | awk '{print $1}' \ + | cut -d':' -f1 \ + | xargs -n1 ./ci/include_grouping.py diff --git a/src/backend/columnar/columnar.c b/src/backend/columnar/columnar.c index 85ec06d00..4914bbc3a 100644 --- a/src/backend/columnar/columnar.c +++ b/src/backend/columnar/columnar.c @@ -11,16 +11,18 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - #include #include +#include "postgres.h" + #include "miscadmin.h" + #include "utils/guc.h" #include "utils/rel.h" #include "citus_version.h" + #include "columnar/columnar.h" #include "columnar/columnar_tableam.h" diff --git a/src/backend/columnar/columnar_compression.c b/src/backend/columnar/columnar_compression.c index 50cdfb01b..2ff35da98 100644 --- a/src/backend/columnar/columnar_compression.c +++ b/src/backend/columnar/columnar_compression.c @@ -13,13 +13,14 @@ */ #include "postgres.h" -#include "citus_version.h" #include "common/pg_lzcompress.h" #include "lib/stringinfo.h" -#include "columnar/columnar_compression.h" +#include "citus_version.h" #include "pg_version_constants.h" +#include "columnar/columnar_compression.h" + #if HAVE_CITUS_LIBLZ4 #include #endif diff --git a/src/backend/columnar/columnar_customscan.c b/src/backend/columnar/columnar_customscan.c index 4ea96a121..9ed82a5bf 100644 --- a/src/backend/columnar/columnar_customscan.c +++ b/src/backend/columnar/columnar_customscan.c @@ -10,18 +10,17 @@ *------------------------------------------------------------------------- */ -#include "citus_version.h" +#include #include "postgres.h" -#include +#include "miscadmin.h" #include "access/amapi.h" #include "access/skey.h" #include "catalog/pg_am.h" #include "catalog/pg_statistic.h" #include "commands/defrem.h" -#include "miscadmin.h" #include "nodes/extensible.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" @@ -44,10 +43,13 @@ #include "utils/selfuncs.h" #include "utils/spccache.h" +#include "citus_version.h" + #include "columnar/columnar.h" #include "columnar/columnar_customscan.h" #include "columnar/columnar_metadata.h" #include "columnar/columnar_tableam.h" + #include "distributed/listutils.h" /* diff --git a/src/backend/columnar/columnar_debug.c b/src/backend/columnar/columnar_debug.c index c60919513..bf12108a9 100644 --- a/src/backend/columnar/columnar_debug.c +++ b/src/backend/columnar/columnar_debug.c @@ -11,12 +11,12 @@ #include "postgres.h" #include "funcapi.h" +#include "miscadmin.h" + #include "access/nbtree.h" #include "access/table.h" #include "catalog/pg_am.h" #include "catalog/pg_type.h" -#include "pg_version_constants.h" -#include "miscadmin.h" #include "storage/fd.h" #include "storage/smgr.h" #include "utils/guc.h" @@ -25,6 +25,8 @@ #include "utils/tuplestore.h" #include "pg_version_compat.h" +#include "pg_version_constants.h" + #include "columnar/columnar.h" #include "columnar/columnar_storage.h" #include "columnar/columnar_version_compat.h" diff --git a/src/backend/columnar/columnar_metadata.c b/src/backend/columnar/columnar_metadata.c index e7a6bfa95..215f96091 100644 --- a/src/backend/columnar/columnar_metadata.c +++ b/src/backend/columnar/columnar_metadata.c @@ -19,48 +19,51 @@ */ +#include + #include "postgres.h" +#include "miscadmin.h" +#include "port.h" #include "safe_lib.h" -#include "citus_version.h" -#include "columnar/columnar.h" -#include "columnar/columnar_storage.h" -#include "columnar/columnar_version_compat.h" -#include "distributed/listutils.h" - -#include #include "access/heapam.h" #include "access/htup_details.h" #include "access/nbtree.h" #include "access/xact.h" #include "catalog/indexing.h" -#include "catalog/pg_namespace.h" -#include "catalog/pg_collation.h" -#include "catalog/pg_type.h" #include "catalog/namespace.h" +#include "catalog/pg_collation.h" +#include "catalog/pg_namespace.h" +#include "catalog/pg_type.h" #include "commands/defrem.h" #include "commands/sequence.h" #include "commands/trigger.h" #include "executor/executor.h" #include "executor/spi.h" -#include "miscadmin.h" -#include "nodes/execnodes.h" #include "lib/stringinfo.h" -#if PG_VERSION_NUM >= PG_VERSION_16 -#include "parser/parse_relation.h" -#endif -#include "port.h" +#include "nodes/execnodes.h" #include "storage/fd.h" #include "storage/lmgr.h" #include "storage/procarray.h" #include "storage/smgr.h" #include "utils/builtins.h" #include "utils/fmgroids.h" -#include "utils/memutils.h" #include "utils/lsyscache.h" +#include "utils/memutils.h" #include "utils/rel.h" + +#include "citus_version.h" +#include "pg_version_constants.h" + +#include "columnar/columnar.h" +#include "columnar/columnar_storage.h" +#include "columnar/columnar_version_compat.h" + +#include "distributed/listutils.h" + #if PG_VERSION_NUM >= PG_VERSION_16 +#include "parser/parse_relation.h" #include "storage/relfilelocator.h" #include "utils/relfilenumbermap.h" #else diff --git a/src/backend/columnar/columnar_reader.c b/src/backend/columnar/columnar_reader.c index 526dd03cb..7ef0d15d7 100644 --- a/src/backend/columnar/columnar_reader.c +++ b/src/backend/columnar/columnar_reader.c @@ -22,16 +22,15 @@ #include "access/xact.h" #include "catalog/pg_am.h" #include "commands/defrem.h" -#include "distributed/listutils.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "optimizer/optimizer.h" #include "optimizer/clauses.h" +#include "optimizer/optimizer.h" #include "optimizer/restrictinfo.h" #include "storage/fd.h" #include "utils/guc.h" -#include "utils/memutils.h" #include "utils/lsyscache.h" +#include "utils/memutils.h" #include "utils/rel.h" #include "columnar/columnar.h" @@ -39,6 +38,8 @@ #include "columnar/columnar_tableam.h" #include "columnar/columnar_version_compat.h" +#include "distributed/listutils.h" + #define UNEXPECTED_STRIPE_READ_ERR_MSG \ "attempted to read an unexpected stripe while reading columnar " \ "table %s, stripe with id=" UINT64_FORMAT " is not flushed" diff --git a/src/backend/columnar/columnar_storage.c b/src/backend/columnar/columnar_storage.c index 21aa7ab9c..0ae6ccca3 100644 --- a/src/backend/columnar/columnar_storage.c +++ b/src/backend/columnar/columnar_storage.c @@ -36,11 +36,11 @@ #include "postgres.h" +#include "miscadmin.h" #include "safe_lib.h" #include "access/generic_xlog.h" #include "catalog/storage.h" -#include "miscadmin.h" #include "storage/bufmgr.h" #include "storage/lmgr.h" diff --git a/src/backend/columnar/columnar_tableam.c b/src/backend/columnar/columnar_tableam.c index dade931df..40486d08f 100644 --- a/src/backend/columnar/columnar_tableam.c +++ b/src/backend/columnar/columnar_tableam.c @@ -1,42 +1,38 @@ -#include "citus_version.h" +#include #include "postgres.h" -#include - #include "miscadmin.h" +#include "pgstat.h" +#include "safe_lib.h" +#include "access/detoast.h" #include "access/genam.h" #include "access/heapam.h" #include "access/multixact.h" #include "access/rewriteheap.h" #include "access/tableam.h" #include "access/tsmapi.h" -#include "access/detoast.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/index.h" #include "catalog/namespace.h" #include "catalog/objectaccess.h" #include "catalog/pg_am.h" +#include "catalog/pg_extension.h" #include "catalog/pg_publication.h" #include "catalog/pg_trigger.h" -#include "catalog/pg_extension.h" #include "catalog/storage.h" #include "catalog/storage_xlog.h" #include "commands/defrem.h" +#include "commands/extension.h" #include "commands/progress.h" #include "commands/vacuum.h" -#include "commands/extension.h" #include "executor/executor.h" #include "nodes/makefuncs.h" #include "optimizer/plancat.h" -#include "pg_version_compat.h" -#include "pgstat.h" -#include "safe_lib.h" #include "storage/bufmgr.h" #include "storage/bufpage.h" -#include "storage/bufmgr.h" #include "storage/lmgr.h" #include "storage/predicate.h" #include "storage/procarray.h" @@ -44,17 +40,22 @@ #include "tcop/utility.h" #include "utils/builtins.h" #include "utils/fmgroids.h" +#include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/pg_rusage.h" #include "utils/rel.h" #include "utils/relcache.h" -#include "utils/lsyscache.h" #include "utils/syscache.h" + +#include "citus_version.h" +#include "pg_version_compat.h" + #include "columnar/columnar.h" #include "columnar/columnar_customscan.h" #include "columnar/columnar_storage.h" #include "columnar/columnar_tableam.h" #include "columnar/columnar_version_compat.h" + #include "distributed/listutils.h" /* diff --git a/src/backend/columnar/columnar_writer.c b/src/backend/columnar/columnar_writer.c index 3b510ce74..1bdc612c1 100644 --- a/src/backend/columnar/columnar_writer.c +++ b/src/backend/columnar/columnar_writer.c @@ -16,18 +16,25 @@ #include "postgres.h" +#include "miscadmin.h" #include "safe_lib.h" #include "access/heapam.h" #include "access/nbtree.h" #include "catalog/pg_am.h" -#include "miscadmin.h" -#include "pg_version_compat.h" #include "storage/fd.h" #include "storage/smgr.h" #include "utils/guc.h" #include "utils/memutils.h" #include "utils/rel.h" + +#include "pg_version_compat.h" +#include "pg_version_constants.h" + +#include "columnar/columnar.h" +#include "columnar/columnar_storage.h" +#include "columnar/columnar_version_compat.h" + #if PG_VERSION_NUM >= PG_VERSION_16 #include "storage/relfilelocator.h" #include "utils/relfilenumbermap.h" @@ -35,10 +42,6 @@ #include "utils/relfilenodemap.h" #endif -#include "columnar/columnar.h" -#include "columnar/columnar_storage.h" -#include "columnar/columnar_version_compat.h" - struct ColumnarWriteState { TupleDesc tupleDescriptor; diff --git a/src/backend/columnar/write_state_management.c b/src/backend/columnar/write_state_management.c index 27d902e61..7f35c5dd1 100644 --- a/src/backend/columnar/write_state_management.c +++ b/src/backend/columnar/write_state_management.c @@ -1,21 +1,17 @@ -#include "citus_version.h" - -#include "postgres.h" -#include "columnar/columnar.h" - - #include +#include "postgres.h" + #include "miscadmin.h" +#include "pgstat.h" #include "access/genam.h" #include "access/heapam.h" +#include "access/heaptoast.h" #include "access/multixact.h" #include "access/rewriteheap.h" #include "access/tsmapi.h" -#include "access/heaptoast.h" -#include "common/hashfn.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/index.h" @@ -26,14 +22,12 @@ #include "catalog/storage_xlog.h" #include "commands/progress.h" #include "commands/vacuum.h" +#include "common/hashfn.h" #include "executor/executor.h" #include "nodes/makefuncs.h" #include "optimizer/plancat.h" -#include "pg_version_compat.h" -#include "pgstat.h" #include "storage/bufmgr.h" #include "storage/bufpage.h" -#include "storage/bufmgr.h" #include "storage/lmgr.h" #include "storage/predicate.h" #include "storage/procarray.h" @@ -44,6 +38,10 @@ #include "utils/rel.h" #include "utils/syscache.h" +#include "citus_version.h" +#include "pg_version_compat.h" + +#include "columnar/columnar.h" #include "columnar/columnar_customscan.h" #include "columnar/columnar_tableam.h" #include "columnar/columnar_version_compat.h" diff --git a/src/backend/distributed/cdc/cdc_decoder.c b/src/backend/distributed/cdc/cdc_decoder.c index 2beb27772..cf9f4963b 100644 --- a/src/backend/distributed/cdc/cdc_decoder.c +++ b/src/backend/distributed/cdc/cdc_decoder.c @@ -8,8 +8,9 @@ *------------------------------------------------------------------------- */ -#include "cdc_decoder_utils.h" #include "postgres.h" + +#include "cdc_decoder_utils.h" #include "fmgr.h" #include "access/genam.h" diff --git a/src/backend/distributed/cdc/cdc_decoder_utils.c b/src/backend/distributed/cdc/cdc_decoder_utils.c index f5b23aa12..b571d18b9 100644 --- a/src/backend/distributed/cdc/cdc_decoder_utils.c +++ b/src/backend/distributed/cdc/cdc_decoder_utils.c @@ -8,18 +8,21 @@ *------------------------------------------------------------------------- */ #include "postgres.h" -#include "commands/extension.h" + +#include "cdc_decoder_utils.h" #include "fmgr.h" #include "miscadmin.h" + #include "access/genam.h" #include "access/heapam.h" +#include "catalog/pg_namespace.h" +#include "commands/extension.h" #include "common/hashfn.h" #include "common/string.h" #include "utils/fmgroids.h" -#include "utils/typcache.h" #include "utils/lsyscache.h" -#include "catalog/pg_namespace.h" -#include "cdc_decoder_utils.h" +#include "utils/typcache.h" + #include "distributed/pg_dist_partition.h" #include "distributed/pg_dist_shard.h" #include "distributed/relay_utility.h" diff --git a/src/backend/distributed/cdc/cdc_decoder_utils.h b/src/backend/distributed/cdc/cdc_decoder_utils.h index 46d1e4ae5..8b9cb298b 100644 --- a/src/backend/distributed/cdc/cdc_decoder_utils.h +++ b/src/backend/distributed/cdc/cdc_decoder_utils.h @@ -12,9 +12,11 @@ #define CITUS_CDC_DECODER_H #include "postgres.h" -#include "fmgr.h" -#include "replication/logical.h" + #include "c.h" +#include "fmgr.h" + +#include "replication/logical.h" #define InvalidRepOriginId 0 #define INVALID_SHARD_ID 0 diff --git a/src/backend/distributed/clock/causal_clock.c b/src/backend/distributed/clock/causal_clock.c index 74c87bad4..3d64757e3 100644 --- a/src/backend/distributed/clock/causal_clock.c +++ b/src/backend/distributed/clock/causal_clock.c @@ -11,36 +11,37 @@ #include #include "postgres.h" -#include "miscadmin.h" + #include "fmgr.h" #include "funcapi.h" #include "libpq-fe.h" +#include "miscadmin.h" -#include "utils/builtins.h" -#include "utils/datum.h" -#include "utils/numeric.h" -#include "utils/typcache.h" -#include "nodes/pg_list.h" #include "catalog/namespace.h" #include "commands/extension.h" #include "commands/sequence.h" #include "executor/spi.h" +#include "nodes/pg_list.h" #include "postmaster/postmaster.h" #include "storage/ipc.h" #include "storage/lwlock.h" +#include "storage/s_lock.h" #include "storage/shmem.h" #include "storage/spin.h" -#include "storage/s_lock.h" +#include "utils/builtins.h" +#include "utils/datum.h" +#include "utils/numeric.h" +#include "utils/typcache.h" #include "distributed/causal_clock.h" -#include "distributed/listutils.h" -#include "distributed/lock_graph.h" -#include "distributed/local_executor.h" -#include "distributed/metadata_cache.h" -#include "distributed/remote_commands.h" -#include "distributed/placement_connection.h" -#include "distributed/coordinator_protocol.h" #include "distributed/citus_safe_lib.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" +#include "distributed/local_executor.h" +#include "distributed/lock_graph.h" +#include "distributed/metadata_cache.h" +#include "distributed/placement_connection.h" +#include "distributed/remote_commands.h" #define SAVE_AND_PERSIST(c) \ do { \ diff --git a/src/backend/distributed/commands/alter_table.c b/src/backend/distributed/commands/alter_table.c index 8c2736a28..a81f23ad6 100644 --- a/src/backend/distributed/commands/alter_table.c +++ b/src/backend/distributed/commands/alter_table.c @@ -34,9 +34,16 @@ #include "catalog/pg_am.h" #include "catalog/pg_depend.h" #include "catalog/pg_rewrite_d.h" +#include "commands/defrem.h" +#include "executor/spi.h" +#include "nodes/pg_list.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + #include "columnar/columnar.h" #include "columnar/columnar_tableam.h" -#include "commands/defrem.h" + #include "distributed/colocation_utils.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" @@ -57,16 +64,11 @@ #include "distributed/reference_table_utils.h" #include "distributed/relation_access_tracking.h" #include "distributed/replication_origin_session_utils.h" -#include "distributed/shared_library_init.h" #include "distributed/shard_utils.h" +#include "distributed/shared_library_init.h" #include "distributed/tenant_schema_metadata.h" #include "distributed/worker_protocol.h" #include "distributed/worker_transaction.h" -#include "executor/spi.h" -#include "nodes/pg_list.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "utils/syscache.h" /* Table Conversion Types */ diff --git a/src/backend/distributed/commands/begin.c b/src/backend/distributed/commands/begin.c index 3ff28ac20..b19b04484 100644 --- a/src/backend/distributed/commands/begin.c +++ b/src/backend/distributed/commands/begin.c @@ -9,12 +9,14 @@ */ #include "postgres.h" + #include "c.h" +#include "nodes/parsenodes.h" + #include "distributed/commands.h" #include "distributed/listutils.h" #include "distributed/transaction_management.h" -#include "nodes/parsenodes.h" /* diff --git a/src/backend/distributed/commands/call.c b/src/backend/distributed/commands/call.c index 12a1d93b8..9e54513c6 100644 --- a/src/backend/distributed/commands/call.c +++ b/src/backend/distributed/commands/call.c @@ -11,12 +11,23 @@ */ #include "postgres.h" -#include "funcapi.h" -#include "pg_version_constants.h" +#include "funcapi.h" +#include "miscadmin.h" #include "catalog/pg_proc.h" #include "commands/defrem.h" +#include "nodes/nodeFuncs.h" +#include "nodes/parsenodes.h" +#include "nodes/primnodes.h" +#include "optimizer/clauses.h" +#include "tcop/dest.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + +#include "pg_version_constants.h" + +#include "distributed/adaptive_executor.h" #include "distributed/backend_data.h" #include "distributed/citus_ruleutils.h" #include "distributed/colocation_utils.h" @@ -26,27 +37,17 @@ #include "distributed/connection_management.h" #include "distributed/deparse_shard_query.h" #include "distributed/function_call_delegation.h" -#include "distributed/metadata_utility.h" #include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" #include "distributed/multi_executor.h" #include "distributed/multi_physical_planner.h" -#include "distributed/adaptive_executor.h" #include "distributed/reference_table_utils.h" #include "distributed/remote_commands.h" -#include "distributed/reference_table_utils.h" #include "distributed/shard_pruning.h" #include "distributed/tuple_destination.h" #include "distributed/version_compat.h" -#include "distributed/worker_manager.h" #include "distributed/worker_log_messages.h" -#include "optimizer/clauses.h" -#include "nodes/nodeFuncs.h" -#include "nodes/parsenodes.h" -#include "nodes/primnodes.h" -#include "miscadmin.h" -#include "tcop/dest.h" -#include "utils/lsyscache.h" -#include "utils/syscache.h" +#include "distributed/worker_manager.h" /* global variable tracking whether we are in a delegated procedure call */ diff --git a/src/backend/distributed/commands/cascade_table_operation_for_connected_relations.c b/src/backend/distributed/commands/cascade_table_operation_for_connected_relations.c index 9b22fb161..c88367462 100644 --- a/src/backend/distributed/commands/cascade_table_operation_for_connected_relations.c +++ b/src/backend/distributed/commands/cascade_table_operation_for_connected_relations.c @@ -12,12 +12,19 @@ #include "postgres.h" -#include "pg_version_constants.h" +#include "miscadmin.h" #include "access/xact.h" #include "catalog/pg_constraint.h" -#include "distributed/commands/utility_hook.h" +#include "executor/spi.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + +#include "pg_version_constants.h" + #include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" #include "distributed/foreign_key_relationship.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" @@ -26,11 +33,6 @@ #include "distributed/reference_table_utils.h" #include "distributed/relation_access_tracking.h" #include "distributed/worker_protocol.h" -#include "executor/spi.h" -#include "miscadmin.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "utils/syscache.h" static void EnsureSequentialModeForCitusTableCascadeFunction(List *relationIdList); diff --git a/src/backend/distributed/commands/citus_add_local_table_to_metadata.c b/src/backend/distributed/commands/citus_add_local_table_to_metadata.c index c713ce099..d95cdd353 100644 --- a/src/backend/distributed/commands/citus_add_local_table_to_metadata.c +++ b/src/backend/distributed/commands/citus_add_local_table_to_metadata.c @@ -18,6 +18,7 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "access/genam.h" @@ -25,29 +26,30 @@ #include "catalog/pg_constraint.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_trigger.h" -#include "distributed/coordinator_protocol.h" +#include "foreign/foreign.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/ruleutils.h" +#include "utils/syscache.h" + #include "distributed/citus_ruleutils.h" #include "distributed/colocation_utils.h" #include "distributed/commands.h" #include "distributed/commands/sequence.h" #include "distributed/commands/utility_hook.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata/dependency.h" +#include "distributed/coordinator_protocol.h" #include "distributed/foreign_key_relationship.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" #include "distributed/metadata_sync.h" #include "distributed/multi_partitioning_utils.h" #include "distributed/namespace_utils.h" #include "distributed/reference_table_utils.h" #include "distributed/worker_protocol.h" #include "distributed/worker_shard_visibility.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/ruleutils.h" -#include "utils/syscache.h" -#include "foreign/foreign.h" /* diff --git a/src/backend/distributed/commands/citus_global_signal.c b/src/backend/distributed/commands/citus_global_signal.c index b1f4cf187..23df2d0c1 100644 --- a/src/backend/distributed/commands/citus_global_signal.c +++ b/src/backend/distributed/commands/citus_global_signal.c @@ -11,14 +11,16 @@ #include "postgres.h" +#include "signal.h" + +#include "lib/stringinfo.h" + #include "pg_version_constants.h" #include "distributed/backend_data.h" #include "distributed/metadata_cache.h" #include "distributed/remote_commands.h" #include "distributed/worker_manager.h" -#include "lib/stringinfo.h" -#include "signal.h" static bool CitusSignalBackend(uint64 globalPID, uint64 timeout, int sig); diff --git a/src/backend/distributed/commands/cluster.c b/src/backend/distributed/commands/cluster.c index cdae6fc08..7a1dac302 100644 --- a/src/backend/distributed/commands/cluster.c +++ b/src/backend/distributed/commands/cluster.c @@ -10,11 +10,11 @@ #include "postgres.h" -#include "pg_version_constants.h" - +#include "catalog/namespace.h" #include "commands/defrem.h" -#include "catalog/namespace.h" +#include "pg_version_constants.h" + #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" #include "distributed/listutils.h" diff --git a/src/backend/distributed/commands/collation.c b/src/backend/distributed/commands/collation.c index 521ce4b3d..5ce3d1436 100644 --- a/src/backend/distributed/commands/collation.c +++ b/src/backend/distributed/commands/collation.c @@ -10,30 +10,32 @@ */ #include "postgres.h" -#include "pg_version_compat.h" +#include "miscadmin.h" #include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_collation.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/metadata/dependency.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_executor.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/worker_create_or_replace.h" -#include "pg_version_constants.h" -#include "distributed/worker_manager.h" #include "parser/parse_type.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/syscache.h" -#include "miscadmin.h" + +#include "pg_version_compat.h" +#include "pg_version_constants.h" + +#include "distributed/citus_safe_lib.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/worker_create_or_replace.h" +#include "distributed/worker_manager.h" static char * CreateCollationDDLInternal(Oid collationId, Oid *collowner, diff --git a/src/backend/distributed/commands/common.c b/src/backend/distributed/commands/common.c index 797981d47..347a99e8a 100644 --- a/src/backend/distributed/commands/common.c +++ b/src/backend/distributed/commands/common.c @@ -23,9 +23,9 @@ #include "distributed/commands/utility_hook.h" #include "distributed/deparser.h" #include "distributed/listutils.h" -#include "distributed/metadata_sync.h" #include "distributed/metadata/dependency.h" #include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" #include "distributed/multi_executor.h" #include "distributed/worker_transaction.h" diff --git a/src/backend/distributed/commands/create_distributed_table.c b/src/backend/distributed/commands/create_distributed_table.c index 768e20b73..9f3975a1e 100644 --- a/src/backend/distributed/commands/create_distributed_table.c +++ b/src/backend/distributed/commands/create_distributed_table.c @@ -9,10 +9,8 @@ */ #include "postgres.h" -#include "miscadmin.h" -#include "pg_version_constants.h" -#include "distributed/commands/utility_hook.h" +#include "miscadmin.h" #include "access/genam.h" #include "access/hash.h" @@ -37,42 +35,6 @@ #include "commands/sequence.h" #include "commands/tablecmds.h" #include "commands/trigger.h" -#include "distributed/commands/multi_copy.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/distributed_execution_locks.h" -#include "distributed/distribution_column.h" -#include "distributed/listutils.h" -#include "distributed/local_executor.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata/dependency.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/pg_dist_colocation.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/reference_table_utils.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/remote_commands.h" -#include "distributed/replicate_none_dist_table_shard.h" -#include "distributed/resource_lock.h" -#include "distributed/shard_cleaner.h" -#include "distributed/shard_rebalancer.h" -#include "distributed/shard_split.h" -#include "distributed/shard_transfer.h" -#include "distributed/shared_library_init.h" -#include "distributed/shard_rebalancer.h" -#include "distributed/worker_protocol.h" -#include "distributed/worker_shard_visibility.h" -#include "distributed/worker_transaction.h" -#include "distributed/utils/distribution_column_map.h" -#include "distributed/version_compat.h" #include "executor/executor.h" #include "executor/spi.h" #include "nodes/execnodes.h" @@ -88,12 +50,51 @@ #include "tcop/pquery.h" #include "tcop/tcopprot.h" #include "utils/builtins.h" +#include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/snapmgr.h" #include "utils/syscache.h" -#include "utils/inval.h" + +#include "pg_version_constants.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/commands/multi_copy.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparser.h" +#include "distributed/distributed_execution_locks.h" +#include "distributed/distribution_column.h" +#include "distributed/listutils.h" +#include "distributed/local_executor.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/pg_dist_colocation.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/remote_commands.h" +#include "distributed/replicate_none_dist_table_shard.h" +#include "distributed/resource_lock.h" +#include "distributed/shard_cleaner.h" +#include "distributed/shard_rebalancer.h" +#include "distributed/shard_split.h" +#include "distributed/shard_transfer.h" +#include "distributed/shared_library_init.h" +#include "distributed/utils/distribution_column_map.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" +#include "distributed/worker_shard_visibility.h" +#include "distributed/worker_transaction.h" /* common params that apply to all Citus table types */ diff --git a/src/backend/distributed/commands/database.c b/src/backend/distributed/commands/database.c index 944ff627d..db0fdb8c4 100644 --- a/src/backend/distributed/commands/database.c +++ b/src/backend/distributed/commands/database.c @@ -11,33 +11,76 @@ #include "postgres.h" +#include "miscadmin.h" + +#include "access/heapam.h" #include "access/htup_details.h" #include "access/xact.h" #include "catalog/objectaddress.h" +#include "catalog/pg_collation.h" #include "catalog/pg_database.h" +#include "catalog/pg_database_d.h" +#include "catalog/pg_tablespace.h" #include "commands/dbcommands.h" -#include "miscadmin.h" +#include "commands/defrem.h" #include "nodes/parsenodes.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" +#include "utils/relcache.h" #include "utils/syscache.h" +#include "distributed/adaptive_executor.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" +#include "distributed/deparse_shard_query.h" #include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/metadata/distobject.h" #include "distributed/metadata_sync.h" #include "distributed/metadata_utility.h" #include "distributed/multi_executor.h" #include "distributed/relation_access_tracking.h" +#include "distributed/worker_protocol.h" #include "distributed/worker_transaction.h" + +/* + * DatabaseCollationInfo is used to store collation related information of a database. + */ +typedef struct DatabaseCollationInfo +{ + char *datcollate; + char *datctype; + +#if PG_VERSION_NUM >= PG_VERSION_15 + char *daticulocale; + char *datcollversion; +#endif + +#if PG_VERSION_NUM >= PG_VERSION_16 + char *daticurules; +#endif +} DatabaseCollationInfo; + +static char * GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database + databaseForm); +static DatabaseCollationInfo GetDatabaseCollation(Oid dbOid); static AlterOwnerStmt * RecreateAlterDatabaseOwnerStmt(Oid databaseOid); -static Oid get_database_owner(Oid db_oid); -List * PreprocessGrantOnDatabaseStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); +#if PG_VERSION_NUM >= PG_VERSION_15 +static char * GetLocaleProviderString(char datlocprovider); +#endif +static char * GetTablespaceName(Oid tablespaceOid); +static ObjectAddress * GetDatabaseAddressFromDatabaseName(char *databaseName, + bool missingOk); + +static Oid get_database_owner(Oid dbId); + /* controlled via GUC */ +bool EnableCreateDatabasePropagation = false; bool EnableAlterDatabaseOwner = true; - /* * AlterDatabaseOwnerObjectAddress returns the ObjectAddress of the database that is the * object of the AlterOwnerStmt. Errors if missing_ok is false. @@ -94,13 +137,13 @@ RecreateAlterDatabaseOwnerStmt(Oid databaseOid) * get_database_owner returns the Oid of the role owning the database */ static Oid -get_database_owner(Oid db_oid) +get_database_owner(Oid dbId) { - HeapTuple tuple = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(db_oid)); + HeapTuple tuple = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(dbId)); if (!HeapTupleIsValid(tuple)) { ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), - errmsg("database with OID %u does not exist", db_oid))); + errmsg("database with OID %u does not exist", dbId))); } Oid dba = ((Form_pg_database) GETSTRUCT(tuple))->datdba; @@ -213,7 +256,6 @@ PreprocessAlterDatabaseRefreshCollStmt(Node *node, const char *queryString, #endif - /* * PreprocessAlterDatabaseSetStmt is executed before the statement is applied to the local * postgres instance. @@ -242,3 +284,420 @@ PreprocessAlterDatabaseSetStmt(Node *node, const char *queryString, return NodeDDLTaskList(NON_COORDINATOR_NODES, commands); } + + +/* + * PostprocessAlterDatabaseStmt is executed before the statement is applied to the local + * Postgres instance. + * + * In this stage, we perform validations that we want to ensure before delegating to + * previous utility hooks because it might not be convenient to throw an error in an + * implicit transaction that creates a database. + */ +List * +PreprocessCreateDatabaseStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) +{ + if (!EnableCreateDatabasePropagation || !ShouldPropagate()) + { + return NIL; + } + + EnsureCoordinator(); + + CreatedbStmt *stmt = castNode(CreatedbStmt, node); + EnsureSupportedCreateDatabaseCommand(stmt); + + return NIL; +} + + +/* + * PostprocessCreateDatabaseStmt is executed after the statement is applied to the local + * postgres instance. In this stage we prepare the commands that need to be run on + * all workers to create the database. Since the CREATE DATABASE statement gives error + * in a transaction block, we need to use NontransactionalNodeDDLTaskList to send the + * CREATE DATABASE statement to the workers. + * + */ +List * +PostprocessCreateDatabaseStmt(Node *node, const char *queryString) +{ + if (!EnableCreateDatabasePropagation || !ShouldPropagate()) + { + return NIL; + } + + EnsureCoordinator(); + + /* + * Given that CREATE DATABASE doesn't support "IF NOT EXISTS" and we're + * in the post-process, database must exist, hence missingOk = false. + */ + bool missingOk = false; + bool isPostProcess = true; + List *addresses = GetObjectAddressListFromParseTree(node, missingOk, + isPostProcess); + EnsureAllObjectDependenciesExistOnAllNodes(addresses); + + char *createDatabaseCommand = DeparseTreeNode(node); + + List *commands = list_make3(DISABLE_DDL_PROPAGATION, + (void *) createDatabaseCommand, + ENABLE_DDL_PROPAGATION); + + return NontransactionalNodeDDLTaskList(NON_COORDINATOR_NODES, commands); +} + + +/* + * PreprocessDropDatabaseStmt is executed after the statement is applied to the local + * postgres instance. In this stage we can prepare the commands that need to be run on + * all workers to drop the database. Since the DROP DATABASE statement gives error in + * transaction context, we need to use NontransactionalNodeDDLTaskList to send the + * DROP DATABASE statement to the workers. + */ +List * +PreprocessDropDatabaseStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) +{ + if (!EnableCreateDatabasePropagation || !ShouldPropagate()) + { + return NIL; + } + + EnsureCoordinator(); + + DropdbStmt *stmt = (DropdbStmt *) node; + + bool isPostProcess = false; + List *addresses = GetObjectAddressListFromParseTree(node, stmt->missing_ok, + isPostProcess); + + if (list_length(addresses) != 1) + { + ereport(ERROR, (errmsg("unexpected number of objects found when " + "executing DROP DATABASE command"))); + } + + ObjectAddress *address = (ObjectAddress *) linitial(addresses); + if (address->objectId == InvalidOid || !IsAnyObjectDistributed(list_make1(address))) + { + return NIL; + } + + char *dropDatabaseCommand = DeparseTreeNode(node); + + List *commands = list_make3(DISABLE_DDL_PROPAGATION, + (void *) dropDatabaseCommand, + ENABLE_DDL_PROPAGATION); + + return NontransactionalNodeDDLTaskList(NON_COORDINATOR_NODES, commands); +} + + +/* + * DropDatabaseStmtObjectAddress gets the ObjectAddress of the database that is the + * object of the DropdbStmt. + */ +List * +DropDatabaseStmtObjectAddress(Node *node, bool missingOk, bool isPostprocess) +{ + DropdbStmt *stmt = castNode(DropdbStmt, node); + ObjectAddress *dbAddress = GetDatabaseAddressFromDatabaseName(stmt->dbname, + missingOk); + return list_make1(dbAddress); +} + + +/* + * CreateDatabaseStmtObjectAddress gets the ObjectAddress of the database that is the + * object of the CreatedbStmt. + */ +List * +CreateDatabaseStmtObjectAddress(Node *node, bool missingOk, bool isPostprocess) +{ + CreatedbStmt *stmt = castNode(CreatedbStmt, node); + ObjectAddress *dbAddress = GetDatabaseAddressFromDatabaseName(stmt->dbname, + missingOk); + return list_make1(dbAddress); +} + + +/* + * EnsureSupportedCreateDatabaseCommand validates the options provided for the CREATE + * DATABASE command. + * + * Parameters: + * stmt: A CreatedbStmt struct representing a CREATE DATABASE command. + * The options field is a list of DefElem structs, each representing an option. + * + * Currently, this function checks for the following: + * - The "oid" option is not supported. + * - The "template" option is only supported with the value "template1". + * - The "strategy" option is only supported with the value "wal_log". + */ +void +EnsureSupportedCreateDatabaseCommand(CreatedbStmt *stmt) +{ + DefElem *option = NULL; + foreach_ptr(option, stmt->options) + { + if (strcmp(option->defname, "oid") == 0) + { + ereport(ERROR, + errmsg("CREATE DATABASE option \"%s\" is not supported", + option->defname)); + } + + char *optionValue = defGetString(option); + + if (strcmp(option->defname, "template") == 0 && + strcmp(optionValue, "template1") != 0) + { + ereport(ERROR, errmsg("Only template1 is supported as template " + "parameter for CREATE DATABASE")); + } + + if (strcmp(option->defname, "strategy") == 0 && + strcmp(optionValue, "wal_log") != 0) + { + ereport(ERROR, errmsg("Only wal_log is supported as strategy " + "parameter for CREATE DATABASE")); + } + } +} + + +/* + * GetDatabaseAddressFromDatabaseName gets the database name and returns the ObjectAddress + * of the database. + */ +static ObjectAddress * +GetDatabaseAddressFromDatabaseName(char *databaseName, bool missingOk) +{ + Oid databaseOid = get_database_oid(databaseName, missingOk); + ObjectAddress *dbObjectAddress = palloc0(sizeof(ObjectAddress)); + ObjectAddressSet(*dbObjectAddress, DatabaseRelationId, databaseOid); + return dbObjectAddress; +} + + +/* + * GetTablespaceName gets the tablespace oid and returns the tablespace name. + */ +static char * +GetTablespaceName(Oid tablespaceOid) +{ + HeapTuple tuple = SearchSysCache1(TABLESPACEOID, ObjectIdGetDatum(tablespaceOid)); + if (!HeapTupleIsValid(tuple)) + { + return NULL; + } + + Form_pg_tablespace tablespaceForm = (Form_pg_tablespace) GETSTRUCT(tuple); + char *tablespaceName = pstrdup(NameStr(tablespaceForm->spcname)); + + ReleaseSysCache(tuple); + + return tablespaceName; +} + + +/* + * GetDatabaseCollation gets oid of a database and returns all the collation related information + * We need this method since collation related info in Form_pg_database is not accessible. + */ +static DatabaseCollationInfo +GetDatabaseCollation(Oid dbOid) +{ + DatabaseCollationInfo info; + memset(&info, 0, sizeof(DatabaseCollationInfo)); + + Relation rel = table_open(DatabaseRelationId, AccessShareLock); + HeapTuple tup = get_catalog_object_by_oid(rel, Anum_pg_database_oid, dbOid); + if (!HeapTupleIsValid(tup)) + { + elog(ERROR, "cache lookup failed for database %u", dbOid); + } + + bool isNull = false; + + TupleDesc tupdesc = RelationGetDescr(rel); + + Datum collationDatum = heap_getattr(tup, Anum_pg_database_datcollate, tupdesc, + &isNull); + info.datcollate = TextDatumGetCString(collationDatum); + + Datum ctypeDatum = heap_getattr(tup, Anum_pg_database_datctype, tupdesc, &isNull); + info.datctype = TextDatumGetCString(ctypeDatum); + +#if PG_VERSION_NUM >= PG_VERSION_15 + + Datum icuLocaleDatum = heap_getattr(tup, Anum_pg_database_daticulocale, tupdesc, + &isNull); + if (!isNull) + { + info.daticulocale = TextDatumGetCString(icuLocaleDatum); + } + + Datum collverDatum = heap_getattr(tup, Anum_pg_database_datcollversion, tupdesc, + &isNull); + if (!isNull) + { + info.datcollversion = TextDatumGetCString(collverDatum); + } +#endif + +#if PG_VERSION_NUM >= PG_VERSION_16 + Datum icurulesDatum = heap_getattr(tup, Anum_pg_database_daticurules, tupdesc, + &isNull); + if (!isNull) + { + info.daticurules = TextDatumGetCString(icurulesDatum); + } +#endif + + table_close(rel, AccessShareLock); + heap_freetuple(tup); + + return info; +} + + +#if PG_VERSION_NUM >= PG_VERSION_15 + +/* + * GetLocaleProviderString gets the datlocprovider stored in pg_database + * and returns the string representation of the datlocprovider + */ +static char * +GetLocaleProviderString(char datlocprovider) +{ + switch (datlocprovider) + { + case 'c': + { + return "libc"; + } + + case 'i': + { + return "icu"; + } + + default: + { + ereport(ERROR, (errmsg("unexpected datlocprovider value: %c", + datlocprovider))); + } + } +} + + +#endif + + +/* + * GenerateCreateDatabaseStatementFromPgDatabase gets the pg_database tuple and returns the + * CREATE DATABASE statement that can be used to create given database. + * + * Note that this doesn't deparse OID of the database and this is not a + * problem as we anyway don't allow specifying custom OIDs for databases + * when creating them. + */ +static char * +GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database databaseForm) +{ + DatabaseCollationInfo collInfo = GetDatabaseCollation(databaseForm->oid); + + StringInfoData str; + initStringInfo(&str); + + appendStringInfo(&str, "CREATE DATABASE %s", + quote_identifier(NameStr(databaseForm->datname))); + + appendStringInfo(&str, " CONNECTION LIMIT %d", databaseForm->datconnlimit); + + appendStringInfo(&str, " ALLOW_CONNECTIONS = %s", + quote_literal_cstr(databaseForm->datallowconn ? "true" : "false")); + + appendStringInfo(&str, " IS_TEMPLATE = %s", + quote_literal_cstr(databaseForm->datistemplate ? "true" : "false")); + + appendStringInfo(&str, " LC_COLLATE = %s", + quote_literal_cstr(collInfo.datcollate)); + + appendStringInfo(&str, " LC_CTYPE = %s", quote_literal_cstr(collInfo.datctype)); + + appendStringInfo(&str, " OWNER = %s", + quote_identifier(GetUserNameFromId(databaseForm->datdba, false))); + + appendStringInfo(&str, " TABLESPACE = %s", + quote_identifier(GetTablespaceName(databaseForm->dattablespace))); + + appendStringInfo(&str, " ENCODING = %s", + quote_literal_cstr(pg_encoding_to_char(databaseForm->encoding))); + +#if PG_VERSION_NUM >= PG_VERSION_15 + if (collInfo.datcollversion != NULL) + { + appendStringInfo(&str, " COLLATION_VERSION = %s", + quote_identifier(collInfo.datcollversion)); + } + + if (collInfo.daticulocale != NULL) + { + appendStringInfo(&str, " ICU_LOCALE = %s", quote_identifier( + collInfo.daticulocale)); + } + + appendStringInfo(&str, " LOCALE_PROVIDER = %s", + quote_identifier(GetLocaleProviderString( + databaseForm->datlocprovider))); +#endif + +#if PG_VERSION_NUM >= PG_VERSION_16 + if (collInfo.daticurules != NULL) + { + appendStringInfo(&str, " ICU_RULES = %s", quote_identifier( + collInfo.daticurules)); + } +#endif + + return str.data; +} + + +/* + * CreateDatabaseDDLCommand returns a CREATE DATABASE command to create given + * database + * + * Command is wrapped by citus_internal_database_command() UDF + * to avoid from transaction block restrictions that apply to database commands. + */ +char * +CreateDatabaseDDLCommand(Oid dbId) +{ + HeapTuple tuple = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(dbId)); + if (!HeapTupleIsValid(tuple)) + { + ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), + errmsg("database with OID %u does not exist", dbId))); + } + + Form_pg_database databaseForm = (Form_pg_database) GETSTRUCT(tuple); + + char *createStmt = GenerateCreateDatabaseStatementFromPgDatabase(databaseForm); + + StringInfo outerDbStmt = makeStringInfo(); + + /* Generate the CREATE DATABASE statement */ + appendStringInfo(outerDbStmt, + "SELECT pg_catalog.citus_internal_database_command(%s)", + quote_literal_cstr(createStmt)); + + ReleaseSysCache(tuple); + + return outerDbStmt->data; +} diff --git a/src/backend/distributed/commands/dependencies.c b/src/backend/distributed/commands/dependencies.c index ae828a574..213d64176 100644 --- a/src/backend/distributed/commands/dependencies.c +++ b/src/backend/distributed/commands/dependencies.c @@ -10,9 +10,14 @@ #include "postgres.h" +#include "miscadmin.h" + #include "catalog/dependency.h" #include "catalog/objectaddress.h" #include "commands/extension.h" +#include "storage/lmgr.h" +#include "utils/lsyscache.h" + #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" #include "distributed/connection_management.h" @@ -25,9 +30,6 @@ #include "distributed/remote_commands.h" #include "distributed/worker_manager.h" #include "distributed/worker_transaction.h" -#include "miscadmin.h" -#include "storage/lmgr.h" -#include "utils/lsyscache.h" typedef enum RequiredObjectSet { @@ -537,16 +539,37 @@ GetDependencyCreateDDLCommands(const ObjectAddress *dependency) case OCLASS_DATABASE: { - List *databaseDDLCommands = NIL; - - /* only propagate the ownership of the database when the feature is on */ - if (EnableAlterDatabaseOwner) + /* + * For the database where Citus is installed, only propagate the ownership of the + * database, only when the feature is on. + * + * This is because this database must exist on all nodes already so we shouldn't + * need to "CREATE" it on other nodes. However, we still need to correctly reflect + * its owner on other nodes too. + */ + if (dependency->objectId == MyDatabaseId && EnableAlterDatabaseOwner) { - List *ownerDDLCommands = DatabaseOwnerDDLCommands(dependency); - databaseDDLCommands = list_concat(databaseDDLCommands, ownerDDLCommands); + return DatabaseOwnerDDLCommands(dependency); } - return databaseDDLCommands; + /* + * For the other databases, create the database on all nodes, only when the feature + * is on. + */ + if (dependency->objectId != MyDatabaseId && EnableCreateDatabasePropagation) + { + char *databaseDDLCommand = CreateDatabaseDDLCommand(dependency->objectId); + + List *ddlCommands = list_make1(databaseDDLCommand); + + List *grantDDLCommands = GrantOnDatabaseDDLCommands(dependency->objectId); + + ddlCommands = list_concat(ddlCommands, grantDDLCommands); + + return ddlCommands; + } + + return NIL; } case OCLASS_PROC: diff --git a/src/backend/distributed/commands/distribute_object_ops.c b/src/backend/distributed/commands/distribute_object_ops.c index 4a26f5b4f..966be9ae0 100644 --- a/src/backend/distributed/commands/distribute_object_ops.c +++ b/src/backend/distributed/commands/distribute_object_ops.c @@ -12,11 +12,12 @@ #include "postgres.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" #include "pg_version_constants.h" -#include "distributed/version_compat.h" + +#include "distributed/commands.h" #include "distributed/commands/utility_hook.h" +#include "distributed/deparser.h" +#include "distributed/version_compat.h" static DistributeObjectOps NoDistributeOps = { .deparse = NULL, @@ -486,6 +487,28 @@ static DistributeObjectOps Database_Alter = { .markDistributed = false, }; +static DistributeObjectOps Database_Create = { + .deparse = DeparseCreateDatabaseStmt, + .qualify = NULL, + .preprocess = PreprocessCreateDatabaseStmt, + .postprocess = PostprocessCreateDatabaseStmt, + .objectType = OBJECT_DATABASE, + .operationType = DIST_OPS_CREATE, + .address = CreateDatabaseStmtObjectAddress, + .markDistributed = true, +}; + +static DistributeObjectOps Database_Drop = { + .deparse = DeparseDropDatabaseStmt, + .qualify = NULL, + .preprocess = PreprocessDropDatabaseStmt, + .postprocess = NULL, + .objectType = OBJECT_DATABASE, + .operationType = DIST_OPS_DROP, + .address = DropDatabaseStmtObjectAddress, + .markDistributed = false, +}; + #if PG_VERSION_NUM >= PG_VERSION_15 static DistributeObjectOps Database_RefreshColl = { .deparse = DeparseAlterDatabaseRefreshCollStmt, @@ -1354,6 +1377,16 @@ GetDistributeObjectOps(Node *node) return &Database_Alter; } + case T_CreatedbStmt: + { + return &Database_Create; + } + + case T_DropdbStmt: + { + return &Database_Drop; + } + #if PG_VERSION_NUM >= PG_VERSION_15 case T_AlterDatabaseRefreshCollStmt: { diff --git a/src/backend/distributed/commands/drop_distributed_table.c b/src/backend/distributed/commands/drop_distributed_table.c index 26579cd60..c3d488b09 100644 --- a/src/backend/distributed/commands/drop_distributed_table.c +++ b/src/backend/distributed/commands/drop_distributed_table.c @@ -9,20 +9,21 @@ */ #include "postgres.h" + #include "miscadmin.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" #include "distributed/colocation_utils.h" -#include "distributed/commands/utility_hook.h" #include "distributed/commands.h" -#include "distributed/metadata_utility.h" +#include "distributed/commands/utility_hook.h" #include "distributed/coordinator_protocol.h" #include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" #include "distributed/multi_partitioning_utils.h" #include "distributed/tenant_schema_metadata.h" #include "distributed/worker_transaction.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" /* local function forward declarations */ diff --git a/src/backend/distributed/commands/extension.c b/src/backend/distributed/commands/extension.c index 5bddf1ede..36267ff66 100644 --- a/src/backend/distributed/commands/extension.c +++ b/src/backend/distributed/commands/extension.c @@ -12,32 +12,35 @@ #include "access/genam.h" #include "access/xact.h" -#include "citus_version.h" #include "catalog/dependency.h" #include "catalog/pg_depend.h" #include "catalog/pg_extension_d.h" -#include "columnar/columnar.h" #include "catalog/pg_foreign_data_wrapper.h" #include "commands/defrem.h" #include "commands/extension.h" +#include "foreign/foreign.h" +#include "nodes/makefuncs.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + +#include "citus_version.h" + +#include "columnar/columnar.h" + #include "distributed/citus_ruleutils.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" #include "distributed/deparser.h" #include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_sync.h" #include "distributed/metadata/dependency.h" #include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" #include "distributed/multi_executor.h" #include "distributed/relation_access_tracking.h" #include "distributed/transaction_management.h" -#include "foreign/foreign.h" -#include "nodes/makefuncs.h" -#include "utils/lsyscache.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/syscache.h" /* Local functions forward declarations for helper functions */ diff --git a/src/backend/distributed/commands/foreign_constraint.c b/src/backend/distributed/commands/foreign_constraint.c index 709287c56..c1f2b83b6 100644 --- a/src/backend/distributed/commands/foreign_constraint.c +++ b/src/backend/distributed/commands/foreign_constraint.c @@ -12,27 +12,15 @@ #include "postgres.h" -#include "pg_version_constants.h" +#include "miscadmin.h" +#include "access/genam.h" #include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" #include "catalog/namespace.h" #include "catalog/pg_constraint.h" -#include "access/genam.h" #include "catalog/pg_type.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include "distributed/commands/sequence.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/multi_join_order.h" -#include "distributed/namespace_utils.h" -#include "distributed/reference_table_utils.h" -#include "distributed/utils/array_type.h" -#include "distributed/version_compat.h" -#include "miscadmin.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/inval.h" @@ -42,6 +30,19 @@ #include "utils/ruleutils.h" #include "utils/syscache.h" +#include "pg_version_constants.h" + +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/commands/sequence.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" +#include "distributed/multi_join_order.h" +#include "distributed/namespace_utils.h" +#include "distributed/reference_table_utils.h" +#include "distributed/utils/array_type.h" +#include "distributed/version_compat.h" + #define BehaviorIsRestrictOrNoAction(x) \ ((x) == FKCONSTR_ACTION_NOACTION || (x) == FKCONSTR_ACTION_RESTRICT) diff --git a/src/backend/distributed/commands/foreign_data_wrapper.c b/src/backend/distributed/commands/foreign_data_wrapper.c index c9a08c41a..a181e63a7 100644 --- a/src/backend/distributed/commands/foreign_data_wrapper.c +++ b/src/backend/distributed/commands/foreign_data_wrapper.c @@ -11,17 +11,18 @@ #include "postgres.h" #include "catalog/pg_foreign_data_wrapper.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" -#include "distributed/metadata_sync.h" -#include "distributed/metadata/distobject.h" #include "foreign/foreign.h" #include "nodes/makefuncs.h" #include "nodes/parsenodes.h" #include "utils/syscache.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" + static bool NameListHasFDWOwnedByDistributedExtension(List *FDWNames); static ObjectAddress GetObjectAddressByFDWName(char *FDWName, bool missing_ok); diff --git a/src/backend/distributed/commands/foreign_server.c b/src/backend/distributed/commands/foreign_server.c index 7d19f9336..d2e575564 100644 --- a/src/backend/distributed/commands/foreign_server.c +++ b/src/backend/distributed/commands/foreign_server.c @@ -9,11 +9,18 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "catalog/pg_foreign_server.h" -#include "distributed/commands/utility_hook.h" +#include "foreign/foreign.h" +#include "nodes/makefuncs.h" +#include "nodes/parsenodes.h" +#include "nodes/primnodes.h" +#include "utils/builtins.h" + #include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" #include "distributed/deparser.h" #include "distributed/listutils.h" #include "distributed/log_utils.h" @@ -21,11 +28,6 @@ #include "distributed/metadata_sync.h" #include "distributed/multi_executor.h" #include "distributed/worker_transaction.h" -#include "foreign/foreign.h" -#include "nodes/makefuncs.h" -#include "nodes/parsenodes.h" -#include "nodes/primnodes.h" -#include "utils/builtins.h" static char * GetForeignServerAlterOwnerCommand(Oid serverId); static Node * RecreateForeignServerStmt(Oid serverId); diff --git a/src/backend/distributed/commands/function.c b/src/backend/distributed/commands/function.c index 701041673..b76a6d5bf 100644 --- a/src/backend/distributed/commands/function.c +++ b/src/backend/distributed/commands/function.c @@ -18,43 +18,19 @@ */ #include "postgres.h" -#include "miscadmin.h" -#include "funcapi.h" -#include "pg_version_constants.h" +#include "funcapi.h" +#include "miscadmin.h" #include "access/genam.h" #include "access/htup_details.h" #include "access/xact.h" -#include "catalog/pg_aggregate.h" #include "catalog/dependency.h" #include "catalog/namespace.h" +#include "catalog/pg_aggregate.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/extension.h" -#include "distributed/citus_depended_object.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" -#include "distributed/maintenanced.h" -#include "distributed/metadata_utility.h" -#include "distributed/metadata/dependency.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata/pg_dist_object.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_executor.h" -#include "distributed/namespace_utils.h" -#include "distributed/pg_dist_node.h" -#include "distributed/reference_table_utils.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/version_compat.h" -#include "distributed/worker_create_or_replace.h" -#include "distributed/worker_transaction.h" #include "nodes/makefuncs.h" #include "parser/parse_coerce.h" #include "parser/parse_type.h" @@ -63,8 +39,34 @@ #include "utils/fmgroids.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" -#include "utils/syscache.h" #include "utils/regproc.h" +#include "utils/syscache.h" + +#include "pg_version_constants.h" + +#include "distributed/citus_depended_object.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/maintenanced.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata/pg_dist_object.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/namespace_utils.h" +#include "distributed/pg_dist_node.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/version_compat.h" +#include "distributed/worker_create_or_replace.h" +#include "distributed/worker_transaction.h" #define DISABLE_LOCAL_CHECK_FUNCTION_BODIES "SET LOCAL check_function_bodies TO off;" #define RESET_CHECK_FUNCTION_BODIES "RESET check_function_bodies;" diff --git a/src/backend/distributed/commands/grant.c b/src/backend/distributed/commands/grant.c index c7861060a..c4278cee1 100644 --- a/src/backend/distributed/commands/grant.c +++ b/src/backend/distributed/commands/grant.c @@ -10,15 +10,16 @@ #include "postgres.h" +#include "lib/stringinfo.h" +#include "nodes/parsenodes.h" +#include "utils/lsyscache.h" + #include "distributed/citus_ruleutils.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" #include "distributed/metadata/distobject.h" #include "distributed/metadata_cache.h" #include "distributed/version_compat.h" -#include "lib/stringinfo.h" -#include "nodes/parsenodes.h" -#include "utils/lsyscache.h" /* Local functions forward declarations for helper functions */ diff --git a/src/backend/distributed/commands/index.c b/src/backend/distributed/commands/index.c index 0b5cfb812..c41136176 100644 --- a/src/backend/distributed/commands/index.c +++ b/src/backend/distributed/commands/index.c @@ -10,7 +10,8 @@ #include "postgres.h" -#include "pg_version_constants.h" +#include "miscadmin.h" + #include "access/genam.h" #include "access/htup_details.h" #include "access/xact.h" @@ -18,32 +19,9 @@ #include "catalog/index.h" #include "catalog/namespace.h" #include "catalog/pg_class.h" -#if PG_VERSION_NUM >= PG_VERSION_16 -#include "catalog/pg_namespace.h" -#endif #include "commands/defrem.h" #include "commands/tablecmds.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/deparser.h" -#include "distributed/distributed_planner.h" -#include "distributed/listutils.h" -#include "distributed/local_executor.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/namespace_utils.h" -#include "distributed/resource_lock.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/relation_utils.h" -#include "distributed/version_compat.h" -#include "distributed/worker_manager.h" #include "lib/stringinfo.h" -#include "miscadmin.h" #include "nodes/parsenodes.h" #include "parser/parse_utilcmd.h" #include "storage/lmgr.h" @@ -53,6 +31,32 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" +#include "pg_version_constants.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparse_shard_query.h" +#include "distributed/deparser.h" +#include "distributed/distributed_planner.h" +#include "distributed/listutils.h" +#include "distributed/local_executor.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/namespace_utils.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/relation_utils.h" +#include "distributed/resource_lock.h" +#include "distributed/version_compat.h" +#include "distributed/worker_manager.h" + +#if PG_VERSION_NUM >= PG_VERSION_16 +#include "catalog/pg_namespace.h" +#endif + /* Local functions forward declarations for helper functions */ static void ErrorIfCreateIndexHasTooManyColumns(IndexStmt *createIndexStatement); diff --git a/src/backend/distributed/commands/local_multi_copy.c b/src/backend/distributed/commands/local_multi_copy.c index 7dbf0ae36..13ff88353 100644 --- a/src/backend/distributed/commands/local_multi_copy.c +++ b/src/backend/distributed/commands/local_multi_copy.c @@ -19,24 +19,27 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "commands/copy.h" -#include "catalog/namespace.h" -#include "parser/parse_relation.h" -#include "utils/lsyscache.h" -#include "nodes/makefuncs.h" -#include "safe_lib.h" #include /* for htons */ -#include "distributed/transmit.h" +#include "postgres.h" + +#include "safe_lib.h" + +#include "catalog/namespace.h" +#include "commands/copy.h" +#include "nodes/makefuncs.h" +#include "parser/parse_relation.h" +#include "utils/lsyscache.h" + #include "distributed/commands/multi_copy.h" #include "distributed/intermediate_results.h" -#include "distributed/multi_partitioning_utils.h" #include "distributed/local_executor.h" #include "distributed/local_multi_copy.h" -#include "distributed/shard_utils.h" -#include "distributed/version_compat.h" +#include "distributed/multi_partitioning_utils.h" #include "distributed/replication_origin_session_utils.h" +#include "distributed/shard_utils.h" +#include "distributed/transmit.h" +#include "distributed/version_compat.h" /* managed via GUC, default is 512 kB */ int LocalCopyFlushThresholdByte = 512 * 1024; diff --git a/src/backend/distributed/commands/multi_copy.c b/src/backend/distributed/commands/multi_copy.c index a5c7a47f4..c69e33f94 100644 --- a/src/backend/distributed/commands/multi_copy.c +++ b/src/backend/distributed/commands/multi_copy.c @@ -43,19 +43,18 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "libpq-fe.h" -#include "miscadmin.h" -#include "pgstat.h" - #include /* for htons */ #include /* for htons */ #include -#include "pg_version_constants.h" +#include "postgres.h" + +#include "libpq-fe.h" +#include "miscadmin.h" +#include "pgstat.h" -#include "access/htup_details.h" #include "access/htup.h" +#include "access/htup_details.h" #include "access/sdir.h" #include "access/sysattr.h" #include "access/xact.h" @@ -65,41 +64,8 @@ #include "commands/copy.h" #include "commands/defrem.h" #include "commands/progress.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/commands/multi_copy.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/intermediate_results.h" -#include "distributed/listutils.h" -#include "distributed/local_executor.h" -#include "distributed/log_utils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/multi_router_planner.h" -#include "distributed/multi_executor.h" -#include "distributed/listutils.h" -#include "distributed/locally_reserved_shared_connections.h" -#include "distributed/placement_connection.h" -#include "distributed/relation_access_tracking.h" -#if PG_VERSION_NUM >= PG_VERSION_16 -#include "distributed/relation_utils.h" -#endif -#include "distributed/remote_commands.h" -#include "distributed/remote_transaction.h" -#include "distributed/replication_origin_session_utils.h" -#include "distributed/resource_lock.h" -#include "distributed/shard_pruning.h" -#include "distributed/shared_connection_stats.h" -#include "distributed/version_compat.h" -#include "distributed/worker_protocol.h" -#include "distributed/local_multi_copy.h" -#include "distributed/hash_helpers.h" -#include "distributed/transmit.h" #include "executor/executor.h" #include "foreign/foreign.h" - #include "libpq/libpq.h" #include "libpq/pqformat.h" #include "nodes/makefuncs.h" @@ -110,9 +76,43 @@ #include "tsearch/ts_locale.h" #include "utils/builtins.h" #include "utils/lsyscache.h" +#include "utils/memutils.h" #include "utils/rel.h" #include "utils/syscache.h" -#include "utils/memutils.h" + +#include "pg_version_constants.h" + +#include "distributed/citus_safe_lib.h" +#include "distributed/commands/multi_copy.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/hash_helpers.h" +#include "distributed/intermediate_results.h" +#include "distributed/listutils.h" +#include "distributed/local_executor.h" +#include "distributed/local_multi_copy.h" +#include "distributed/locally_reserved_shared_connections.h" +#include "distributed/log_utils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/placement_connection.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/remote_commands.h" +#include "distributed/remote_transaction.h" +#include "distributed/replication_origin_session_utils.h" +#include "distributed/resource_lock.h" +#include "distributed/shard_pruning.h" +#include "distributed/shared_connection_stats.h" +#include "distributed/transmit.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" + +#if PG_VERSION_NUM >= PG_VERSION_16 +#include "distributed/relation_utils.h" +#endif /* constant used in binary protocol */ diff --git a/src/backend/distributed/commands/owned.c b/src/backend/distributed/commands/owned.c index c76437392..ddba8438e 100644 --- a/src/backend/distributed/commands/owned.c +++ b/src/backend/distributed/commands/owned.c @@ -10,33 +10,20 @@ #include "postgres.h" +#include "miscadmin.h" + +#include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" -#include "access/genam.h" #include "access/table.h" #include "access/xact.h" #include "catalog/catalog.h" +#include "catalog/objectaddress.h" #include "catalog/pg_auth_members.h" #include "catalog/pg_authid.h" #include "catalog/pg_db_role_setting.h" #include "catalog/pg_type.h" -#include "catalog/objectaddress.h" #include "commands/dbcommands.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/commands.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata_sync.h" -#include "distributed/metadata/distobject.h" -#include "distributed/multi_executor.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/version_compat.h" -#include "distributed/worker_transaction.h" -#include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" @@ -44,8 +31,22 @@ #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/rel.h" -#include "utils/varlena.h" #include "utils/syscache.h" +#include "utils/varlena.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" +#include "distributed/multi_executor.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/version_compat.h" +#include "distributed/worker_transaction.h" static ObjectAddress * GetNewRoleAddress(ReassignOwnedStmt *stmt); diff --git a/src/backend/distributed/commands/policy.c b/src/backend/distributed/commands/policy.c index 0d66e150e..a2a926b66 100644 --- a/src/backend/distributed/commands/policy.c +++ b/src/backend/distributed/commands/policy.c @@ -10,15 +10,10 @@ */ #include "postgres.h" +#include "miscadmin.h" + #include "catalog/namespace.h" #include "commands/policy.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "miscadmin.h" #include "nodes/makefuncs.h" #include "parser/parse_clause.h" #include "parser/parse_relation.h" @@ -27,6 +22,13 @@ #include "utils/builtins.h" #include "utils/ruleutils.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" + static const char * unparse_policy_command(const char aclchar); static RowSecurityPolicy * GetPolicyByName(Oid relationId, const char *policyName); diff --git a/src/backend/distributed/commands/publication.c b/src/backend/distributed/commands/publication.c index f225b0fca..c1cfd5e77 100644 --- a/src/backend/distributed/commands/publication.c +++ b/src/backend/distributed/commands/publication.c @@ -9,18 +9,11 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "catalog/pg_publication.h" #include "catalog/pg_publication_rel.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/metadata_sync.h" -#include "distributed/metadata/distobject.h" -#include "distributed/reference_table_utils.h" -#include "distributed/worker_create_or_replace.h" #include "nodes/makefuncs.h" #include "nodes/parsenodes.h" #include "utils/builtins.h" @@ -29,6 +22,15 @@ #include "pg_version_compat.h" +#include "distributed/commands.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/reference_table_utils.h" +#include "distributed/worker_create_or_replace.h" + static CreatePublicationStmt * BuildCreatePublicationStmt(Oid publicationId); #if (PG_VERSION_NUM >= PG_VERSION_15) diff --git a/src/backend/distributed/commands/rename.c b/src/backend/distributed/commands/rename.c index 5e313d68c..362fc57bb 100644 --- a/src/backend/distributed/commands/rename.c +++ b/src/backend/distributed/commands/rename.c @@ -12,11 +12,12 @@ #include "catalog/index.h" #include "catalog/namespace.h" +#include "nodes/parsenodes.h" +#include "utils/lsyscache.h" + #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" #include "distributed/metadata_cache.h" -#include "nodes/parsenodes.h" -#include "utils/lsyscache.h" /* diff --git a/src/backend/distributed/commands/role.c b/src/backend/distributed/commands/role.c index 3177c73a0..15b5aa511 100644 --- a/src/backend/distributed/commands/role.c +++ b/src/backend/distributed/commands/role.c @@ -10,38 +10,21 @@ #include "postgres.h" -#include "pg_version_compat.h" - -#include "pg_version_constants.h" +#include "miscadmin.h" +#include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" -#include "access/genam.h" #include "access/table.h" #include "access/xact.h" #include "catalog/catalog.h" +#include "catalog/objectaddress.h" #include "catalog/pg_auth_members.h" #include "catalog/pg_authid.h" #include "catalog/pg_db_role_setting.h" #include "catalog/pg_shseclabel.h" #include "catalog/pg_type.h" -#include "catalog/objectaddress.h" #include "commands/dbcommands.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/commands.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata_sync.h" -#include "distributed/metadata/distobject.h" -#include "distributed/multi_executor.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/version_compat.h" -#include "distributed/worker_transaction.h" -#include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" @@ -49,11 +32,28 @@ #include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" -#include "utils/guc_tables.h" #include "utils/guc.h" +#include "utils/guc_tables.h" #include "utils/rel.h" -#include "utils/varlena.h" #include "utils/syscache.h" +#include "utils/varlena.h" + +#include "pg_version_compat.h" +#include "pg_version_constants.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" +#include "distributed/multi_executor.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/version_compat.h" +#include "distributed/worker_transaction.h" static const char * ExtractEncryptedPassword(Oid roleOid); static const char * CreateAlterRoleIfExistsCommand(AlterRoleStmt *stmt); diff --git a/src/backend/distributed/commands/schema.c b/src/backend/distributed/commands/schema.c index d48a73647..7f79897fa 100644 --- a/src/backend/distributed/commands/schema.c +++ b/src/backend/distributed/commands/schema.c @@ -19,28 +19,28 @@ #include "catalog/namespace.h" #include "catalog/pg_class.h" #include "catalog/pg_namespace.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include -#include "distributed/commands/utility_hook.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata_cache.h" -#include -#include "distributed/multi_executor.h" -#include "distributed/reference_table_utils.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/resource_lock.h" -#include -#include -#include "distributed/tenant_schema_metadata.h" -#include "distributed/version_compat.h" #include "nodes/parsenodes.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/relcache.h" +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/connection_management.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/multi_executor.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/remote_commands.h" +#include "distributed/resource_lock.h" +#include "distributed/tenant_schema_metadata.h" +#include "distributed/version_compat.h" + static List * GetObjectAddressBySchemaName(char *schemaName, bool missing_ok); static List * FilterDistributedSchemas(List *schemas); diff --git a/src/backend/distributed/commands/schema_based_sharding.c b/src/backend/distributed/commands/schema_based_sharding.c index 65d2b8127..7cde96982 100644 --- a/src/backend/distributed/commands/schema_based_sharding.c +++ b/src/backend/distributed/commands/schema_based_sharding.c @@ -7,27 +7,29 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "access/genam.h" #include "catalog/catalog.h" #include "catalog/pg_namespace_d.h" #include "commands/extension.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + #include "distributed/argutils.h" #include "distributed/backend_data.h" #include "distributed/colocation_utils.h" #include "distributed/commands.h" #include "distributed/listutils.h" -#include "distributed/metadata_sync.h" #include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" #include "distributed/multi_partitioning_utils.h" #include "distributed/shard_transfer.h" #include "distributed/tenant_schema_metadata.h" #include "distributed/worker_shard_visibility.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/syscache.h" /* return value of CreateCitusMoveSchemaParams() */ diff --git a/src/backend/distributed/commands/seclabel.c b/src/backend/distributed/commands/seclabel.c index 208d186c7..3e1847dc9 100644 --- a/src/backend/distributed/commands/seclabel.c +++ b/src/backend/distributed/commands/seclabel.c @@ -16,8 +16,8 @@ #include "distributed/coordinator_protocol.h" #include "distributed/deparser.h" #include "distributed/log_utils.h" -#include "distributed/metadata_sync.h" #include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" /* diff --git a/src/backend/distributed/commands/sequence.c b/src/backend/distributed/commands/sequence.c index 9ff586c8c..4d838a882 100644 --- a/src/backend/distributed/commands/sequence.c +++ b/src/backend/distributed/commands/sequence.c @@ -16,6 +16,12 @@ #include "catalog/namespace.h" #include "commands/defrem.h" #include "commands/extension.h" +#include "nodes/makefuncs.h" +#include "nodes/parsenodes.h" +#include "rewrite/rewriteHandler.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" + #include "distributed/commands.h" #include "distributed/commands/sequence.h" #include "distributed/commands/utility_hook.h" @@ -24,12 +30,7 @@ #include "distributed/metadata/distobject.h" #include "distributed/metadata_cache.h" #include "distributed/metadata_sync.h" -#include "nodes/makefuncs.h" #include "distributed/worker_create_or_replace.h" -#include "nodes/parsenodes.h" -#include "rewrite/rewriteHandler.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" /* Local functions forward declarations for helper functions */ static bool OptionsSpecifyOwnedBy(List *optionList, Oid *ownedByTableId); diff --git a/src/backend/distributed/commands/statistics.c b/src/backend/distributed/commands/statistics.c index dae72ada9..5fac767fd 100644 --- a/src/backend/distributed/commands/statistics.c +++ b/src/backend/distributed/commands/statistics.c @@ -19,6 +19,8 @@ #include "postgres.h" +#include "miscadmin.h" + #include "access/genam.h" #include "access/htup_details.h" #include "access/xact.h" @@ -26,8 +28,16 @@ #include "catalog/pg_namespace.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_type.h" -#include "distributed/commands/utility_hook.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/fmgrprotos.h" +#include "utils/lsyscache.h" +#include "utils/relcache.h" +#include "utils/ruleutils.h" +#include "utils/syscache.h" + #include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" #include "distributed/deparse_shard_query.h" #include "distributed/deparser.h" #include "distributed/listutils.h" @@ -37,14 +47,6 @@ #include "distributed/relation_access_tracking.h" #include "distributed/resource_lock.h" #include "distributed/worker_transaction.h" -#include "miscadmin.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/fmgrprotos.h" -#include "utils/lsyscache.h" -#include "utils/relcache.h" -#include "utils/ruleutils.h" -#include "utils/syscache.h" #define DEFAULT_STATISTICS_TARGET -1 #define ALTER_INDEX_COLUMN_SET_STATS_COMMAND \ diff --git a/src/backend/distributed/commands/subscription.c b/src/backend/distributed/commands/subscription.c index 52519b680..f5f80d17a 100644 --- a/src/backend/distributed/commands/subscription.c +++ b/src/backend/distributed/commands/subscription.c @@ -8,21 +8,23 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - -#include "safe_lib.h" - #include -#include "commands/defrem.h" -#include "distributed/commands.h" -#include "distributed/connection_management.h" -#include "pg_version_constants.h" -#include "distributed/version_compat.h" +#include "postgres.h" + #include "libpq-fe.h" +#include "safe_lib.h" + +#include "commands/defrem.h" #include "nodes/parsenodes.h" #include "utils/builtins.h" +#include "pg_version_constants.h" + +#include "distributed/commands.h" +#include "distributed/connection_management.h" +#include "distributed/version_compat.h" + static char * GenerateConninfoWithAuth(char *conninfo); diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index e8404d38c..074a789ed 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -9,7 +9,7 @@ */ #include "postgres.h" -#include "pg_version_constants.h" + #include "access/genam.h" #include "access/htup_details.h" #include "access/xact.h" @@ -20,28 +20,6 @@ #include "catalog/pg_depend.h" #include "catalog/pg_type.h" #include "commands/tablecmds.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/deparser.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/distribution_column.h" -#include "distributed/foreign_key_relationship.h" -#include "distributed/local_executor.h" -#include "distributed/listutils.h" -#include "distributed/metadata_sync.h" -#include "distributed/metadata/dependency.h" -#include "distributed/metadata/distobject.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/reference_table_utils.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/resource_lock.h" -#include "distributed/version_compat.h" -#include "distributed/worker_shard_visibility.h" -#include "distributed/tenant_schema_metadata.h" #include "foreign/foreign.h" #include "lib/stringinfo.h" #include "nodes/parsenodes.h" @@ -53,6 +31,31 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" +#include "pg_version_constants.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparse_shard_query.h" +#include "distributed/deparser.h" +#include "distributed/distribution_column.h" +#include "distributed/foreign_key_relationship.h" +#include "distributed/listutils.h" +#include "distributed/local_executor.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/resource_lock.h" +#include "distributed/tenant_schema_metadata.h" +#include "distributed/version_compat.h" +#include "distributed/worker_shard_visibility.h" + /* controlled via GUC, should be accessed via GetEnableLocalReferenceForeignKeys() */ bool EnableLocalReferenceForeignKeys = true; diff --git a/src/backend/distributed/commands/text_search.c b/src/backend/distributed/commands/text_search.c index 54dfdae85..4a386e321 100644 --- a/src/backend/distributed/commands/text_search.c +++ b/src/backend/distributed/commands/text_search.c @@ -10,6 +10,8 @@ #include "postgres.h" +#include "fmgr.h" + #include "access/genam.h" #include "access/xact.h" #include "catalog/namespace.h" @@ -22,7 +24,6 @@ #include "commands/comment.h" #include "commands/defrem.h" #include "commands/extension.h" -#include "fmgr.h" #include "nodes/makefuncs.h" #include "tsearch/ts_cache.h" #include "tsearch/ts_public.h" diff --git a/src/backend/distributed/commands/trigger.c b/src/backend/distributed/commands/trigger.c index 0ec8287f5..74cb6259f 100644 --- a/src/backend/distributed/commands/trigger.c +++ b/src/backend/distributed/commands/trigger.c @@ -9,7 +9,6 @@ *------------------------------------------------------------------------- */ #include "postgres.h" -#include "pg_version_constants.h" #include "access/genam.h" #include "access/table.h" @@ -18,6 +17,14 @@ #include "catalog/pg_trigger.h" #include "commands/extension.h" #include "commands/trigger.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/fmgrprotos.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + +#include "pg_version_constants.h" + #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" #include "distributed/coordinator_protocol.h" @@ -29,11 +36,6 @@ #include "distributed/namespace_utils.h" #include "distributed/shard_utils.h" #include "distributed/worker_protocol.h" -#include "utils/builtins.h" -#include "utils/fmgrprotos.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/syscache.h" /* appropriate lock modes for the owner relation according to postgres */ diff --git a/src/backend/distributed/commands/truncate.c b/src/backend/distributed/commands/truncate.c index 4de518a06..0eb43f529 100644 --- a/src/backend/distributed/commands/truncate.c +++ b/src/backend/distributed/commands/truncate.c @@ -9,12 +9,19 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "catalog/namespace.h" #include "catalog/pg_class.h" #include "commands/tablecmds.h" #include "commands/trigger.h" +#include "storage/lmgr.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/regproc.h" +#include "utils/rel.h" + #include "distributed/adaptive_executor.h" #include "distributed/citus_ruleutils.h" #include "distributed/commands.h" @@ -31,13 +38,8 @@ #include "distributed/reference_table_utils.h" #include "distributed/resource_lock.h" #include "distributed/transaction_management.h" -#include "distributed/worker_transaction.h" #include "distributed/worker_shard_visibility.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "utils/regproc.h" -#include "utils/rel.h" +#include "distributed/worker_transaction.h" /* Local functions forward declarations for unsupported command checks */ diff --git a/src/backend/distributed/commands/type.c b/src/backend/distributed/commands/type.c index ccb7bf528..b1e573638 100644 --- a/src/backend/distributed/commands/type.c +++ b/src/backend/distributed/commands/type.c @@ -43,7 +43,7 @@ #include "postgres.h" -#include "pg_version_constants.h" +#include "miscadmin.h" #include "access/genam.h" #include "access/htup_details.h" @@ -52,6 +52,18 @@ #include "catalog/pg_enum.h" #include "catalog/pg_type.h" #include "commands/extension.h" +#include "nodes/makefuncs.h" +#include "parser/parse_type.h" +#include "storage/lmgr.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/regproc.h" +#include "utils/syscache.h" +#include "utils/typcache.h" + +#include "pg_version_constants.h" + #include "distributed/citus_safe_lib.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" @@ -64,20 +76,10 @@ #include "distributed/relation_access_tracking.h" #include "distributed/remote_commands.h" #include "distributed/transaction_management.h" -#include "distributed/worker_create_or_replace.h" #include "distributed/version_compat.h" +#include "distributed/worker_create_or_replace.h" #include "distributed/worker_manager.h" #include "distributed/worker_transaction.h" -#include "miscadmin.h" -#include "nodes/makefuncs.h" -#include "parser/parse_type.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/regproc.h" -#include "utils/syscache.h" -#include "utils/typcache.h" #define AlterEnumIsRename(stmt) (stmt->oldVal != NULL) #define AlterEnumIsAddValue(stmt) (stmt->oldVal == NULL) diff --git a/src/backend/distributed/commands/utility_hook.c b/src/backend/distributed/commands/utility_hook.c index afc8fa9fd..b62dda9ad 100644 --- a/src/backend/distributed/commands/utility_hook.c +++ b/src/backend/distributed/commands/utility_hook.c @@ -25,9 +25,8 @@ *------------------------------------------------------------------------- */ -#include "pg_version_constants.h" - #include "postgres.h" + #include "miscadmin.h" #include "access/attnum.h" @@ -35,11 +34,26 @@ #include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/dependency.h" -#include "citus_version.h" +#include "catalog/pg_database.h" #include "commands/dbcommands.h" #include "commands/defrem.h" #include "commands/extension.h" #include "commands/tablecmds.h" +#include "foreign/foreign.h" +#include "lib/stringinfo.h" +#include "nodes/makefuncs.h" +#include "nodes/parsenodes.h" +#include "nodes/pg_list.h" +#include "tcop/utility.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/inval.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + +#include "citus_version.h" +#include "pg_version_constants.h" + #include "distributed/adaptive_executor.h" #include "distributed/backend_data.h" #include "distributed/citus_depended_object.h" @@ -48,19 +62,19 @@ #include "distributed/commands/multi_copy.h" #include "distributed/commands/utility_hook.h" /* IWYU pragma: keep */ #include "distributed/coordinator_protocol.h" -#include "distributed/deparser.h" #include "distributed/deparse_shard_query.h" +#include "distributed/deparser.h" #include "distributed/executor_util.h" #include "distributed/foreign_key_relationship.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" #include "distributed/maintenanced.h" -#include "distributed/multi_logical_replication.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/metadata_sync.h" #include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" #include "distributed/multi_executor.h" #include "distributed/multi_explain.h" +#include "distributed/multi_logical_replication.h" +#include "distributed/multi_partitioning_utils.h" #include "distributed/multi_physical_planner.h" #include "distributed/reference_table_utils.h" #include "distributed/resource_lock.h" @@ -69,17 +83,6 @@ #include "distributed/version_compat.h" #include "distributed/worker_shard_visibility.h" #include "distributed/worker_transaction.h" -#include "foreign/foreign.h" -#include "lib/stringinfo.h" -#include "nodes/parsenodes.h" -#include "nodes/pg_list.h" -#include "nodes/makefuncs.h" -#include "tcop/utility.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/inval.h" -#include "utils/lsyscache.h" -#include "utils/syscache.h" bool EnableDDLPropagation = true; /* ddl propagation is enabled */ @@ -694,7 +697,7 @@ citus_ProcessUtilityInternal(PlannedStmt *pstmt, } /* inform the user about potential caveats */ - if (IsA(parsetree, CreatedbStmt)) + if (IsA(parsetree, CreatedbStmt) && !EnableCreateDatabasePropagation) { if (EnableUnsupportedFeatureMessages) { @@ -724,22 +727,13 @@ citus_ProcessUtilityInternal(PlannedStmt *pstmt, } /* - * Make sure that dropping the role deletes the pg_dist_object entries. There is a - * separate logic for roles, since roles are not included as dropped objects in the - * drop event trigger. To handle it both on worker and coordinator nodes, it is not - * implemented as a part of process functions but here. + * Make sure that dropping node-wide objects deletes the pg_dist_object + * entries. There is a separate logic for node-wide objects (such as role + * and databases), since they are not included as dropped objects in the + * drop event trigger. To handle it both on worker and coordinator nodes, + * it is not implemented as a part of process functions but here. */ - if (IsA(parsetree, DropRoleStmt)) - { - DropRoleStmt *stmt = castNode(DropRoleStmt, parsetree); - List *allDropRoles = stmt->roles; - - List *distributedDropRoles = FilterDistributedRoles(allDropRoles); - if (list_length(distributedDropRoles) > 0) - { - UnmarkRolesDistributed(distributedDropRoles); - } - } + UnmarkNodeWideObjectsDistributed(parsetree); pstmt->utilityStmt = parsetree; @@ -1275,9 +1269,12 @@ ExecuteDistributedDDLJob(DDLJob *ddlJob) { ereport(WARNING, (errmsg( - "CONCURRENTLY-enabled index commands can fail partially, " - "leaving behind an INVALID index.\n Use DROP INDEX " - "CONCURRENTLY IF EXISTS to remove the invalid index."))); + "Commands that are not transaction-safe may result in " + "partial failure, potentially leading to an inconsistent " + "state.\nIf the problematic command is a CREATE operation, " + "consider using the 'IF EXISTS' syntax to drop the object," + "\nif applicable, and then re-attempt the original command."))); + PG_RE_THROW(); } } @@ -1491,6 +1488,28 @@ DDLTaskList(Oid relationId, const char *commandString) } +/* + * NontransactionalNodeDDLTaskList builds a list of tasks to execute a DDL command on a + * given target set of nodes with cannotBeExecutedInTransaction is set to make sure + * that task list is executed outside a transaction block. + */ +List * +NontransactionalNodeDDLTaskList(TargetWorkerSet targets, List *commands) +{ + List *ddlJobs = NodeDDLTaskList(targets, commands); + DDLJob *ddlJob = NULL; + foreach_ptr(ddlJob, ddlJobs) + { + Task *task = NULL; + foreach_ptr(task, ddlJob->taskList) + { + task->cannotBeExecutedInTransaction = true; + } + } + return ddlJobs; +} + + /* * NodeDDLTaskList builds a list of tasks to execute a DDL command on a * given target set of nodes. diff --git a/src/backend/distributed/commands/vacuum.c b/src/backend/distributed/commands/vacuum.c index f1cf3cb31..5988a447d 100644 --- a/src/backend/distributed/commands/vacuum.c +++ b/src/backend/distributed/commands/vacuum.c @@ -10,10 +10,16 @@ #include "postgres.h" -#include "pg_version_constants.h" - +#include "access/xact.h" #include "commands/defrem.h" #include "commands/vacuum.h" +#include "postmaster/bgworker_internals.h" +#include "storage/lmgr.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" + +#include "pg_version_constants.h" + #include "distributed/adaptive_executor.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" @@ -24,11 +30,6 @@ #include "distributed/resource_lock.h" #include "distributed/transaction_management.h" #include "distributed/version_compat.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "postmaster/bgworker_internals.h" -#include "access/xact.h" #define VACUUM_PARALLEL_NOTSET -2 diff --git a/src/backend/distributed/commands/variableset.c b/src/backend/distributed/commands/variableset.c index 277f5b63f..2a3bc2f67 100644 --- a/src/backend/distributed/commands/variableset.c +++ b/src/backend/distributed/commands/variableset.c @@ -9,21 +9,23 @@ */ #include "postgres.h" + #include "c.h" #include "common/string.h" -#include "distributed/commands.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/metadata_cache.h" -#include "distributed/resource_lock.h" -#include "distributed/transaction_management.h" -#include "distributed/version_compat.h" +#include "lib/ilist.h" #include "storage/lmgr.h" #include "utils/builtins.h" #include "utils/lsyscache.h" -#include "lib/ilist.h" #include "utils/varlena.h" + +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/metadata_cache.h" #include "distributed/remote_commands.h" +#include "distributed/resource_lock.h" +#include "distributed/transaction_management.h" +#include "distributed/version_compat.h" /* * ShouldPropagateSetCommand determines whether a SET or RESET command should be diff --git a/src/backend/distributed/commands/view.c b/src/backend/distributed/commands/view.c index 7c4816144..0c39be4ca 100644 --- a/src/backend/distributed/commands/view.c +++ b/src/backend/distributed/commands/view.c @@ -9,23 +9,12 @@ */ #include "postgres.h" + #include "fmgr.h" #include "access/genam.h" #include "catalog/objectaddress.h" #include "commands/extension.h" -#include "distributed/commands.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/deparser.h" -#include "distributed/errormessage.h" -#include "distributed/listutils.h" -#include "distributed/metadata_sync.h" -#include "distributed/metadata/dependency.h" -#include "distributed/metadata/distobject.h" -#include "distributed/multi_executor.h" -#include "distributed/namespace_utils.h" -#include "distributed/worker_transaction.h" #include "executor/spi.h" #include "nodes/nodes.h" #include "nodes/pg_list.h" @@ -35,6 +24,19 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/deparser.h" +#include "distributed/errormessage.h" +#include "distributed/listutils.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_sync.h" +#include "distributed/multi_executor.h" +#include "distributed/namespace_utils.h" +#include "distributed/worker_transaction.h" + /* * GUC controls some restrictions for local objects. For example, * if it is disabled, a local view with no distributed relation dependency diff --git a/src/backend/distributed/connection/connection_configuration.c b/src/backend/distributed/connection/connection_configuration.c index bf61f7fac..c6a34a9d7 100644 --- a/src/backend/distributed/connection/connection_configuration.c +++ b/src/backend/distributed/connection/connection_configuration.c @@ -12,6 +12,10 @@ #include "access/transam.h" #include "access/xact.h" +#include "mb/pg_wchar.h" +#include "postmaster/postmaster.h" +#include "utils/builtins.h" + #include "distributed/backend_data.h" #include "distributed/citus_safe_lib.h" #include "distributed/connection_management.h" @@ -19,10 +23,6 @@ #include "distributed/metadata_cache.h" #include "distributed/worker_manager.h" -#include "postmaster/postmaster.h" -#include "mb/pg_wchar.h" -#include "utils/builtins.h" - /* stores the string representation of our node connection GUC */ #ifdef USE_SSL char *NodeConninfo = "sslmode=require"; diff --git a/src/backend/distributed/connection/connection_management.c b/src/backend/distributed/connection/connection_management.c index 9439b38c5..64ec1904f 100644 --- a/src/backend/distributed/connection/connection_management.c +++ b/src/backend/distributed/connection/connection_management.c @@ -9,39 +9,39 @@ */ #include "postgres.h" -#include "pgstat.h" #include "libpq-fe.h" - #include "miscadmin.h" - +#include "pg_config.h" +#include "pgstat.h" #include "safe_lib.h" -#include "postmaster/postmaster.h" + #include "access/hash.h" #include "commands/dbcommands.h" +#include "mb/pg_wchar.h" +#include "portability/instr_time.h" +#include "postmaster/postmaster.h" +#include "storage/ipc.h" +#include "utils/hsearch.h" +#include "utils/memutils.h" + #include "distributed/backend_data.h" +#include "distributed/cancel_utils.h" #include "distributed/connection_management.h" -#include "distributed/errormessage.h" #include "distributed/error_codes.h" +#include "distributed/errormessage.h" +#include "distributed/hash_helpers.h" #include "distributed/listutils.h" #include "distributed/log_utils.h" #include "distributed/memutils.h" #include "distributed/metadata_cache.h" -#include "distributed/hash_helpers.h" #include "distributed/placement_connection.h" +#include "distributed/remote_commands.h" #include "distributed/run_from_same_connection.h" #include "distributed/shared_connection_stats.h" -#include "distributed/cancel_utils.h" -#include "distributed/remote_commands.h" #include "distributed/time_constants.h" #include "distributed/version_compat.h" #include "distributed/worker_log_messages.h" -#include "mb/pg_wchar.h" -#include "pg_config.h" -#include "portability/instr_time.h" -#include "storage/ipc.h" -#include "utils/hsearch.h" -#include "utils/memutils.h" int NodeConnectionTimeout = 30000; diff --git a/src/backend/distributed/connection/locally_reserved_shared_connections.c b/src/backend/distributed/connection/locally_reserved_shared_connections.c index 0a27ba17c..a64930b32 100644 --- a/src/backend/distributed/connection/locally_reserved_shared_connections.c +++ b/src/backend/distributed/connection/locally_reserved_shared_connections.c @@ -33,12 +33,15 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "miscadmin.h" #include "access/hash.h" #include "commands/dbcommands.h" +#include "common/hashfn.h" +#include "utils/builtins.h" + +#include "pg_version_constants.h" + #include "distributed/listutils.h" #include "distributed/locally_reserved_shared_connections.h" #include "distributed/metadata_cache.h" @@ -47,8 +50,6 @@ #include "distributed/shared_connection_stats.h" #include "distributed/tuplestore.h" #include "distributed/worker_manager.h" -#include "utils/builtins.h" -#include "common/hashfn.h" #define RESERVED_CONNECTION_COLUMNS 4 diff --git a/src/backend/distributed/connection/placement_connection.c b/src/backend/distributed/connection/placement_connection.c index 3924e5a05..10c99bd80 100644 --- a/src/backend/distributed/connection/placement_connection.c +++ b/src/backend/distributed/connection/placement_connection.c @@ -11,23 +11,24 @@ #include "postgres.h" +#include "access/hash.h" +#include "common/hashfn.h" +#include "utils/hsearch.h" +#include "utils/memutils.h" + #include "pg_version_constants.h" -#include "access/hash.h" #include "distributed/colocation_utils.h" #include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distributed_planner.h" #include "distributed/hash_helpers.h" #include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" #include "distributed/metadata_cache.h" #include "distributed/multi_executor.h" -#include "distributed/distributed_planner.h" #include "distributed/multi_partitioning_utils.h" #include "distributed/placement_connection.h" #include "distributed/relation_access_tracking.h" -#include "utils/hsearch.h" -#include "common/hashfn.h" -#include "utils/memutils.h" /* diff --git a/src/backend/distributed/connection/remote_commands.c b/src/backend/distributed/connection/remote_commands.c index 15dd985ec..f694ff390 100644 --- a/src/backend/distributed/connection/remote_commands.c +++ b/src/backend/distributed/connection/remote_commands.c @@ -9,23 +9,23 @@ */ #include "postgres.h" -#include "pgstat.h" #include "libpq-fe.h" +#include "miscadmin.h" +#include "pgstat.h" +#include "lib/stringinfo.h" +#include "storage/latch.h" +#include "utils/builtins.h" +#include "utils/fmgrprotos.h" +#include "utils/palloc.h" + +#include "distributed/cancel_utils.h" #include "distributed/connection_management.h" #include "distributed/errormessage.h" #include "distributed/listutils.h" #include "distributed/log_utils.h" #include "distributed/remote_commands.h" -#include "distributed/errormessage.h" -#include "distributed/cancel_utils.h" -#include "lib/stringinfo.h" -#include "miscadmin.h" -#include "storage/latch.h" -#include "utils/builtins.h" -#include "utils/fmgrprotos.h" -#include "utils/palloc.h" /* diff --git a/src/backend/distributed/connection/shared_connection_stats.c b/src/backend/distributed/connection/shared_connection_stats.c index 104caed07..26598b465 100644 --- a/src/backend/distributed/connection/shared_connection_stats.c +++ b/src/backend/distributed/connection/shared_connection_stats.c @@ -11,18 +11,21 @@ */ #include "postgres.h" -#include "pgstat.h" - -#include "pg_version_constants.h" #include "libpq-fe.h" - #include "miscadmin.h" +#include "pgstat.h" #include "access/hash.h" #include "access/htup_details.h" #include "catalog/pg_authid.h" #include "commands/dbcommands.h" +#include "common/hashfn.h" +#include "storage/ipc.h" +#include "utils/builtins.h" + +#include "pg_version_constants.h" + #include "distributed/backend_data.h" #include "distributed/cancel_utils.h" #include "distributed/connection_management.h" @@ -32,12 +35,9 @@ #include "distributed/multi_executor.h" #include "distributed/placement_connection.h" #include "distributed/shared_connection_stats.h" -#include "distributed/worker_manager.h" #include "distributed/time_constants.h" #include "distributed/tuplestore.h" -#include "utils/builtins.h" -#include "common/hashfn.h" -#include "storage/ipc.h" +#include "distributed/worker_manager.h" #define REMOTE_CONNECTION_STATS_COLUMNS 4 diff --git a/src/backend/distributed/connection/worker_log_messages.c b/src/backend/distributed/connection/worker_log_messages.c index 9c240620e..9b64b81a6 100644 --- a/src/backend/distributed/connection/worker_log_messages.c +++ b/src/backend/distributed/connection/worker_log_messages.c @@ -10,12 +10,13 @@ #include "postgres.h" +#include "utils/elog.h" + #include "distributed/connection_management.h" #include "distributed/error_codes.h" #include "distributed/errormessage.h" #include "distributed/log_utils.h" #include "distributed/worker_log_messages.h" -#include "utils/elog.h" /* diff --git a/src/backend/distributed/deparser/citus_deparseutils.c b/src/backend/distributed/deparser/citus_deparseutils.c new file mode 100644 index 000000000..061263f6e --- /dev/null +++ b/src/backend/distributed/deparser/citus_deparseutils.c @@ -0,0 +1,90 @@ +/*------------------------------------------------------------------------- + * + * citus_deparseutils.c + * + * This file contains common functions used for deparsing PostgreSQL + * statements to their equivalent SQL representation. + * + * Copyright (c) Citus Data, Inc. + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "commands/defrem.h" +#include "utils/builtins.h" +#include "utils/elog.h" +#include "utils/rel.h" +#include "utils/relcache.h" +#include "utils/syscache.h" +#include "utils/typcache.h" + +#include "pg_version_constants.h" + +#include "distributed/deparser.h" + + +/** + * DefElemOptionToStatement converts a DefElem option to a SQL statement and + * appends it to the given StringInfo buffer. + * + * @param buf The StringInfo buffer to append the SQL statement to. + * @param option The DefElem option to convert to a SQL statement. + * @param optionFormats The option format specification to use for the conversion. + * @param optionFormatsLen The number of option formats in the opt_formats array. + */ +void +DefElemOptionToStatement(StringInfo buf, DefElem *option, + const DefElemOptionFormat *optionFormats, + int optionFormatsLen) +{ + const char *name = option->defname; + int i; + + for (i = 0; i < optionFormatsLen; i++) + { + if (strcmp(name, optionFormats[i].name) == 0) + { + switch (optionFormats[i].type) + { + case OPTION_FORMAT_STRING: + { + char *value = defGetString(option); + appendStringInfo(buf, optionFormats[i].format, quote_identifier( + value)); + break; + } + + case OPTION_FORMAT_INTEGER: + { + int32 value = defGetInt32(option); + appendStringInfo(buf, optionFormats[i].format, value); + break; + } + + case OPTION_FORMAT_BOOLEAN: + { + bool value = defGetBoolean(option); + appendStringInfo(buf, optionFormats[i].format, value ? "true" : + "false"); + break; + } + + case OPTION_FORMAT_LITERAL_CSTR: + { + char *value = defGetString(option); + appendStringInfo(buf, optionFormats[i].format, quote_literal_cstr( + value)); + break; + } + + default: + { + elog(ERROR, "unrecognized option type: %d", optionFormats[i].type); + break; + } + } + } + } +} diff --git a/src/backend/distributed/deparser/citus_grantutils.c b/src/backend/distributed/deparser/citus_grantutils.c index 8e0dadff2..c944013f6 100644 --- a/src/backend/distributed/deparser/citus_grantutils.c +++ b/src/backend/distributed/deparser/citus_grantutils.c @@ -1,8 +1,10 @@ #include "postgres.h" + #include "lib/stringinfo.h" #include "nodes/parsenodes.h" -#include "distributed/deparser.h" + #include "distributed/citus_ruleutils.h" +#include "distributed/deparser.h" /* * Append the 'WITH GRANT OPTION' clause to the given buffer if the given diff --git a/src/backend/distributed/deparser/citus_ruleutils.c b/src/backend/distributed/deparser/citus_ruleutils.c index 1456f2fb5..f99462058 100644 --- a/src/backend/distributed/deparser/citus_ruleutils.c +++ b/src/backend/distributed/deparser/citus_ruleutils.c @@ -7,13 +7,12 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "miscadmin.h" - -#include "pg_version_constants.h" - #include +#include "postgres.h" + +#include "miscadmin.h" + #include "access/attnum.h" #include "access/genam.h" #include "access/heapam.h" @@ -39,21 +38,11 @@ #include "catalog/pg_type.h" #include "commands/defrem.h" #include "commands/extension.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands.h" -#include "distributed/listutils.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/metadata_utility.h" -#include "distributed/namespace_utils.h" -#include "distributed/relay_utility.h" -#include "distributed/version_compat.h" -#include "distributed/worker_protocol.h" +#include "commands/sequence.h" #include "foreign/foreign.h" #include "lib/stringinfo.h" -#include "nodes/nodes.h" #include "nodes/nodeFuncs.h" +#include "nodes/nodes.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" #include "parser/parse_utilcmd.h" @@ -71,7 +60,20 @@ #include "utils/relcache.h" #include "utils/ruleutils.h" #include "utils/syscache.h" -#include "commands/sequence.h" + +#include "pg_version_constants.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/namespace_utils.h" +#include "distributed/relay_utility.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" static void deparse_index_columns(StringInfo buffer, List *indexParameterList, diff --git a/src/backend/distributed/deparser/citus_setutils.c b/src/backend/distributed/deparser/citus_setutils.c index 481a2860b..c113a47d5 100644 --- a/src/backend/distributed/deparser/citus_setutils.c +++ b/src/backend/distributed/deparser/citus_setutils.c @@ -1,18 +1,18 @@ #include "postgres.h" +#include "catalog/namespace.h" +#include "commands/defrem.h" +#include "lib/stringinfo.h" +#include "nodes/parsenodes.h" +#include "nodes/print.h" +#include "parser/parse_type.h" +#include "utils/builtins.h" + #include "pg_version_compat.h" -#include "catalog/namespace.h" -#include "lib/stringinfo.h" -#include "nodes/parsenodes.h" -#include "utils/builtins.h" - -#include "distributed/deparser.h" #include "distributed/citus_ruleutils.h" -#include "commands/defrem.h" +#include "distributed/deparser.h" #include "distributed/log_utils.h" -#include "parser/parse_type.h" -#include "nodes/print.h" void AppendVarSetValue(StringInfo buf, VariableSetStmt *setStmt); diff --git a/src/backend/distributed/deparser/deparse_collation_stmts.c b/src/backend/distributed/deparser/deparse_collation_stmts.c index 44f7f9098..3a568d2ad 100644 --- a/src/backend/distributed/deparser/deparse_collation_stmts.c +++ b/src/backend/distributed/deparser/deparse_collation_stmts.c @@ -17,8 +17,8 @@ #include "nodes/value.h" #include "utils/builtins.h" -#include "distributed/deparser.h" #include "distributed/citus_ruleutils.h" +#include "distributed/deparser.h" static void AppendDropCollationStmt(StringInfo buf, DropStmt *stmt); static void AppendRenameCollationStmt(StringInfo buf, RenameStmt *stmt); diff --git a/src/backend/distributed/deparser/deparse_database_stmts.c b/src/backend/distributed/deparser/deparse_database_stmts.c index d3d3ce633..3614ba797 100644 --- a/src/backend/distributed/deparser/deparse_database_stmts.c +++ b/src/backend/distributed/deparser/deparse_database_stmts.c @@ -11,24 +11,47 @@ #include "postgres.h" -#include "pg_version_compat.h" - #include "catalog/namespace.h" +#include "commands/defrem.h" #include "lib/stringinfo.h" #include "nodes/parsenodes.h" +#include "parser/parse_type.h" #include "utils/builtins.h" -#include "distributed/deparser.h" +#include "pg_version_compat.h" + #include "distributed/citus_ruleutils.h" -#include "commands/defrem.h" +#include "distributed/commands.h" #include "distributed/deparser.h" +#include "distributed/listutils.h" #include "distributed/log_utils.h" -#include "parser/parse_type.h" static void AppendAlterDatabaseOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt); +static void AppendAlterDatabaseSetStmt(StringInfo buf, AlterDatabaseSetStmt *stmt); static void AppendAlterDatabaseStmt(StringInfo buf, AlterDatabaseStmt *stmt); static void AppendDefElemConnLimit(StringInfo buf, DefElem *def); +static void AppendCreateDatabaseStmt(StringInfo buf, CreatedbStmt *stmt); +static void AppendDropDatabaseStmt(StringInfo buf, DropdbStmt *stmt); +static void AppendGrantOnDatabaseStmt(StringInfo buf, GrantStmt *stmt); + +const DefElemOptionFormat create_database_option_formats[] = { + { "owner", " OWNER %s", OPTION_FORMAT_STRING }, + { "template", " TEMPLATE %s", OPTION_FORMAT_STRING }, + { "encoding", " ENCODING %s", OPTION_FORMAT_LITERAL_CSTR }, + { "strategy", " STRATEGY %s", OPTION_FORMAT_LITERAL_CSTR }, + { "locale", " LOCALE %s", OPTION_FORMAT_LITERAL_CSTR }, + { "lc_collate", " LC_COLLATE %s", OPTION_FORMAT_LITERAL_CSTR }, + { "lc_ctype", " LC_CTYPE %s", OPTION_FORMAT_LITERAL_CSTR }, + { "icu_locale", " ICU_LOCALE %s", OPTION_FORMAT_LITERAL_CSTR }, + { "icu_rules", " ICU_RULES %s", OPTION_FORMAT_LITERAL_CSTR }, + { "locale_provider", " LOCALE_PROVIDER %s", OPTION_FORMAT_LITERAL_CSTR }, + { "collation_version", " COLLATION_VERSION %s", OPTION_FORMAT_LITERAL_CSTR }, + { "tablespace", " TABLESPACE %s", OPTION_FORMAT_STRING }, + { "allow_connections", " ALLOW_CONNECTIONS %s", OPTION_FORMAT_BOOLEAN }, + { "connection_limit", " CONNECTION LIMIT %d", OPTION_FORMAT_INTEGER }, + { "is_template", " IS_TEMPLATE %s", OPTION_FORMAT_BOOLEAN } +}; char * DeparseAlterDatabaseOwnerStmt(Node *node) @@ -205,3 +228,87 @@ DeparseAlterDatabaseSetStmt(Node *node) return str.data; } + + +static void +AppendCreateDatabaseStmt(StringInfo buf, CreatedbStmt *stmt) +{ + /* + * Make sure that we don't try to deparse something that this + * function doesn't expect. + */ + EnsureSupportedCreateDatabaseCommand(stmt); + + appendStringInfo(buf, + "CREATE DATABASE %s", + quote_identifier(stmt->dbname)); + + DefElem *option = NULL; + foreach_ptr(option, stmt->options) + { + DefElemOptionToStatement(buf, option, create_database_option_formats, + lengthof(create_database_option_formats)); + } +} + + +char * +DeparseCreateDatabaseStmt(Node *node) +{ + CreatedbStmt *stmt = castNode(CreatedbStmt, node); + StringInfoData str = { 0 }; + initStringInfo(&str); + + AppendCreateDatabaseStmt(&str, stmt); + + return str.data; +} + + +static void +AppendDropDatabaseStmt(StringInfo buf, DropdbStmt *stmt) +{ + char *ifExistsStatement = stmt->missing_ok ? "IF EXISTS" : ""; + appendStringInfo(buf, + "DROP DATABASE %s %s", + ifExistsStatement, + quote_identifier(stmt->dbname)); + + if (list_length(stmt->options) > 1) + { + /* FORCE is the only option that can be provided for this command */ + elog(ERROR, "got unexpected number of options for DROP DATABASE"); + } + else if (list_length(stmt->options) == 1) + { + DefElem *option = linitial(stmt->options); + appendStringInfo(buf, " WITH ( "); + + if (strcmp(option->defname, "force") == 0) + { + appendStringInfo(buf, "FORCE"); + } + else + { + /* FORCE is the only option that can be provided for this command */ + ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized DROP DATABASE option \"%s\"", + option->defname))); + } + + appendStringInfo(buf, " )"); + } +} + + +char * +DeparseDropDatabaseStmt(Node *node) +{ + DropdbStmt *stmt = castNode(DropdbStmt, node); + StringInfoData str = { 0 }; + initStringInfo(&str); + + AppendDropDatabaseStmt(&str, stmt); + + return str.data; +} diff --git a/src/backend/distributed/deparser/deparse_extension_stmts.c b/src/backend/distributed/deparser/deparse_extension_stmts.c index bb6b15dbd..92d54602f 100644 --- a/src/backend/distributed/deparser/deparse_extension_stmts.c +++ b/src/backend/distributed/deparser/deparse_extension_stmts.c @@ -14,13 +14,14 @@ #include "catalog/namespace.h" #include "commands/defrem.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" #include "lib/stringinfo.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" #include "utils/builtins.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" + /* Local functions forward declarations for helper functions */ static void AppendCreateExtensionStmt(StringInfo buf, CreateExtensionStmt *stmt); static void AppendCreateExtensionStmtOptions(StringInfo buf, List *options); diff --git a/src/backend/distributed/deparser/deparse_foreign_data_wrapper_stmts.c b/src/backend/distributed/deparser/deparse_foreign_data_wrapper_stmts.c index 3f755c905..fab1cc7ab 100644 --- a/src/backend/distributed/deparser/deparse_foreign_data_wrapper_stmts.c +++ b/src/backend/distributed/deparser/deparse_foreign_data_wrapper_stmts.c @@ -10,13 +10,14 @@ #include "postgres.h" #include "commands/defrem.h" +#include "lib/stringinfo.h" +#include "nodes/nodes.h" +#include "utils/builtins.h" + #include "distributed/citus_ruleutils.h" #include "distributed/deparser.h" #include "distributed/listutils.h" #include "distributed/relay_utility.h" -#include "lib/stringinfo.h" -#include "nodes/nodes.h" -#include "utils/builtins.h" static void AppendGrantOnFDWStmt(StringInfo buf, GrantStmt *stmt); static void AppendGrantOnFDWNames(StringInfo buf, GrantStmt *stmt); diff --git a/src/backend/distributed/deparser/deparse_foreign_server_stmts.c b/src/backend/distributed/deparser/deparse_foreign_server_stmts.c index 403569b94..9c708a771 100644 --- a/src/backend/distributed/deparser/deparse_foreign_server_stmts.c +++ b/src/backend/distributed/deparser/deparse_foreign_server_stmts.c @@ -10,13 +10,14 @@ #include "postgres.h" #include "commands/defrem.h" +#include "lib/stringinfo.h" +#include "nodes/nodes.h" +#include "utils/builtins.h" + #include "distributed/citus_ruleutils.h" #include "distributed/deparser.h" #include "distributed/listutils.h" #include "distributed/relay_utility.h" -#include "lib/stringinfo.h" -#include "nodes/nodes.h" -#include "utils/builtins.h" static void AppendCreateForeignServerStmt(StringInfo buf, CreateForeignServerStmt *stmt); static void AppendAlterForeignServerStmt(StringInfo buf, AlterForeignServerStmt *stmt); diff --git a/src/backend/distributed/deparser/deparse_function_stmts.c b/src/backend/distributed/deparser/deparse_function_stmts.c index a5bc52e5a..1e3e4a651 100644 --- a/src/backend/distributed/deparser/deparse_function_stmts.c +++ b/src/backend/distributed/deparser/deparse_function_stmts.c @@ -22,10 +22,6 @@ #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/defrem.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/version_compat.h" #include "lib/stringinfo.h" #include "nodes/makefuncs.h" #include "nodes/nodes.h" @@ -38,8 +34,13 @@ #include "utils/guc.h" #include "utils/lsyscache.h" #include "utils/memutils.h" -#include "utils/syscache.h" #include "utils/regproc.h" +#include "utils/syscache.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/deparser.h" +#include "distributed/version_compat.h" /* forward declaration for deparse functions */ diff --git a/src/backend/distributed/deparser/deparse_owned_stmts.c b/src/backend/distributed/deparser/deparse_owned_stmts.c index 61dcc7cf3..f1da2571a 100644 --- a/src/backend/distributed/deparser/deparse_owned_stmts.c +++ b/src/backend/distributed/deparser/deparse_owned_stmts.c @@ -11,13 +11,14 @@ #include "postgres.h" +#include "lib/stringinfo.h" +#include "nodes/parsenodes.h" +#include "utils/builtins.h" + #include "pg_version_compat.h" #include "distributed/citus_ruleutils.h" #include "distributed/deparser.h" -#include "lib/stringinfo.h" -#include "nodes/parsenodes.h" -#include "utils/builtins.h" static void AppendDropOwnedStmt(StringInfo buf, DropOwnedStmt *stmt); static void AppendRoleList(StringInfo buf, List *roleList); diff --git a/src/backend/distributed/deparser/deparse_publication_stmts.c b/src/backend/distributed/deparser/deparse_publication_stmts.c index e22333146..8e3118171 100644 --- a/src/backend/distributed/deparser/deparse_publication_stmts.c +++ b/src/backend/distributed/deparser/deparse_publication_stmts.c @@ -13,20 +13,21 @@ #include "access/relation.h" #include "catalog/namespace.h" #include "commands/defrem.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" -#include "distributed/namespace_utils.h" #include "lib/stringinfo.h" +#include "nodes/value.h" #include "parser/parse_clause.h" #include "parser/parse_collate.h" #include "parser/parse_node.h" #include "parser/parse_relation.h" -#include "nodes/value.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/ruleutils.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" +#include "distributed/namespace_utils.h" + static void AppendCreatePublicationStmt(StringInfo buf, CreatePublicationStmt *stmt, bool whereClauseNeedsTransform, diff --git a/src/backend/distributed/deparser/deparse_role_stmts.c b/src/backend/distributed/deparser/deparse_role_stmts.c index ee216809e..4bbb2e438 100644 --- a/src/backend/distributed/deparser/deparse_role_stmts.c +++ b/src/backend/distributed/deparser/deparse_role_stmts.c @@ -13,16 +13,17 @@ #include "postgres.h" -#include "pg_version_compat.h" - #include "commands/defrem.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" #include "lib/stringinfo.h" #include "nodes/parsenodes.h" #include "utils/builtins.h" +#include "pg_version_compat.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" + static void AppendAlterRoleStmt(StringInfo buf, AlterRoleStmt *stmt); static void AppendAlterRoleSetStmt(StringInfo buf, AlterRoleSetStmt *stmt); static void AppendCreateRoleStmt(StringInfo buf, CreateRoleStmt *stmt); diff --git a/src/backend/distributed/deparser/deparse_schema_stmts.c b/src/backend/distributed/deparser/deparse_schema_stmts.c index 10317b899..0a9c49801 100644 --- a/src/backend/distributed/deparser/deparse_schema_stmts.c +++ b/src/backend/distributed/deparser/deparse_schema_stmts.c @@ -12,13 +12,14 @@ */ #include "postgres.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" #include "lib/stringinfo.h" #include "nodes/nodes.h" #include "utils/builtins.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" + static void AppendCreateSchemaStmt(StringInfo buf, CreateSchemaStmt *stmt); static void AppendDropSchemaStmt(StringInfo buf, DropStmt *stmt); static void AppendGrantOnSchemaStmt(StringInfo buf, GrantStmt *stmt); diff --git a/src/backend/distributed/deparser/deparse_seclabel_stmts.c b/src/backend/distributed/deparser/deparse_seclabel_stmts.c index a1aa047cc..ffe775b76 100644 --- a/src/backend/distributed/deparser/deparse_seclabel_stmts.c +++ b/src/backend/distributed/deparser/deparse_seclabel_stmts.c @@ -10,10 +10,11 @@ #include "postgres.h" -#include "distributed/deparser.h" #include "nodes/parsenodes.h" #include "utils/builtins.h" +#include "distributed/deparser.h" + static void AppendSecLabelStmt(StringInfo buf, SecLabelStmt *stmt); /* diff --git a/src/backend/distributed/deparser/deparse_sequence_stmts.c b/src/backend/distributed/deparser/deparse_sequence_stmts.c index 98488c160..9e5fab2c8 100644 --- a/src/backend/distributed/deparser/deparse_sequence_stmts.c +++ b/src/backend/distributed/deparser/deparse_sequence_stmts.c @@ -14,12 +14,13 @@ #include "postgres.h" #include "catalog/namespace.h" -#include "distributed/deparser.h" -#include "distributed/version_compat.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/lsyscache.h" +#include "distributed/deparser.h" +#include "distributed/version_compat.h" + /* forward declaration for deparse functions */ static void AppendDropSequenceStmt(StringInfo buf, DropStmt *stmt); diff --git a/src/backend/distributed/deparser/deparse_statistics_stmts.c b/src/backend/distributed/deparser/deparse_statistics_stmts.c index 599738dc5..99b9d1c2d 100644 --- a/src/backend/distributed/deparser/deparse_statistics_stmts.c +++ b/src/backend/distributed/deparser/deparse_statistics_stmts.c @@ -12,16 +12,17 @@ */ #include "postgres.h" +#include "catalog/namespace.h" +#include "lib/stringinfo.h" +#include "nodes/nodes.h" +#include "utils/builtins.h" + #include "pg_version_constants.h" -#include "catalog/namespace.h" #include "distributed/citus_ruleutils.h" #include "distributed/deparser.h" #include "distributed/listutils.h" #include "distributed/relay_utility.h" -#include "lib/stringinfo.h" -#include "nodes/nodes.h" -#include "utils/builtins.h" static void AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt); static void AppendDropStatisticsStmt(StringInfo buf, List *nameList, bool ifExists); diff --git a/src/backend/distributed/deparser/deparse_table_stmts.c b/src/backend/distributed/deparser/deparse_table_stmts.c index ff96d7fc3..e976b0e2f 100644 --- a/src/backend/distributed/deparser/deparse_table_stmts.c +++ b/src/backend/distributed/deparser/deparse_table_stmts.c @@ -13,20 +13,20 @@ #include "catalog/heap.h" #include "commands/defrem.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/version_compat.h" +#include "commands/tablecmds.h" #include "nodes/nodes.h" #include "nodes/parsenodes.h" #include "parser/parse_expr.h" -#include "parser/parse_type.h" #include "parser/parse_relation.h" +#include "parser/parse_type.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/ruleutils.h" +#include "distributed/commands.h" +#include "distributed/deparser.h" #include "distributed/namespace_utils.h" -#include "commands/tablecmds.h" +#include "distributed/version_compat.h" static void AppendAlterTableSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt); static void AppendAlterTableStmt(StringInfo buf, AlterTableStmt *stmt); diff --git a/src/backend/distributed/deparser/deparse_view_stmts.c b/src/backend/distributed/deparser/deparse_view_stmts.c index 39c4ccb63..5592aec9d 100644 --- a/src/backend/distributed/deparser/deparse_view_stmts.c +++ b/src/backend/distributed/deparser/deparse_view_stmts.c @@ -13,15 +13,16 @@ #include "catalog/namespace.h" #include "commands/defrem.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" #include "lib/stringinfo.h" #include "nodes/parsenodes.h" #include "utils/builtins.h" #include "utils/lsyscache.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" + static void AppendDropViewStmt(StringInfo buf, DropStmt *stmt); static void AppendViewNameList(StringInfo buf, List *objects); static void AppendAlterViewStmt(StringInfo buf, AlterTableStmt *stmt); diff --git a/src/backend/distributed/deparser/objectaddress.c b/src/backend/distributed/deparser/objectaddress.c index d835a3b1a..6718c22cf 100644 --- a/src/backend/distributed/deparser/objectaddress.c +++ b/src/backend/distributed/deparser/objectaddress.c @@ -12,11 +12,12 @@ #include "postgres.h" -#include "commands/extension.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" #include "catalog/objectaddress.h" #include "catalog/pg_extension_d.h" +#include "commands/extension.h" + +#include "distributed/commands.h" +#include "distributed/deparser.h" /* diff --git a/src/backend/distributed/deparser/qualify_aggregate_stmts.c b/src/backend/distributed/deparser/qualify_aggregate_stmts.c index 9debc244a..e5d7210f3 100644 --- a/src/backend/distributed/deparser/qualify_aggregate_stmts.c +++ b/src/backend/distributed/deparser/qualify_aggregate_stmts.c @@ -15,10 +15,11 @@ #include "postgres.h" #include "catalog/namespace.h" -#include "distributed/deparser.h" #include "nodes/makefuncs.h" #include "utils/lsyscache.h" +#include "distributed/deparser.h" + void QualifyDefineAggregateStmt(Node *node) { diff --git a/src/backend/distributed/deparser/qualify_function_stmt.c b/src/backend/distributed/deparser/qualify_function_stmt.c index fbd6c17a0..184ff92bf 100644 --- a/src/backend/distributed/deparser/qualify_function_stmt.c +++ b/src/backend/distributed/deparser/qualify_function_stmt.c @@ -21,12 +21,13 @@ #include "access/htup_details.h" #include "catalog/namespace.h" #include "catalog/pg_proc.h" -#include "distributed/deparser.h" -#include "distributed/version_compat.h" #include "parser/parse_func.h" #include "utils/lsyscache.h" #include "utils/syscache.h" +#include "distributed/deparser.h" +#include "distributed/version_compat.h" + /* forward declaration for qualify functions */ static void QualifyFunction(ObjectWithArgs *func, ObjectType type); static void QualifyFunctionSchemaName(ObjectWithArgs *func, ObjectType type); diff --git a/src/backend/distributed/deparser/qualify_publication_stmt.c b/src/backend/distributed/deparser/qualify_publication_stmt.c index 3231fe363..73ffe3a35 100644 --- a/src/backend/distributed/deparser/qualify_publication_stmt.c +++ b/src/backend/distributed/deparser/qualify_publication_stmt.c @@ -12,12 +12,13 @@ #include "postgres.h" #include "catalog/namespace.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" #include "nodes/nodes.h" #include "utils/guc.h" #include "utils/lsyscache.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" + #if (PG_VERSION_NUM >= PG_VERSION_15) static void QualifyPublicationObjects(List *publicationObjects); #else diff --git a/src/backend/distributed/deparser/qualify_role_stmt.c b/src/backend/distributed/deparser/qualify_role_stmt.c index 93a958ea9..cffb7ac4c 100644 --- a/src/backend/distributed/deparser/qualify_role_stmt.c +++ b/src/backend/distributed/deparser/qualify_role_stmt.c @@ -17,10 +17,11 @@ #include "postgres.h" -#include "distributed/deparser.h" #include "nodes/nodes.h" #include "utils/guc.h" +#include "distributed/deparser.h" + static void QualifyVarSetCurrent(VariableSetStmt *setStmt); diff --git a/src/backend/distributed/deparser/qualify_sequence_stmt.c b/src/backend/distributed/deparser/qualify_sequence_stmt.c index 384e0c953..1a0ecc831 100644 --- a/src/backend/distributed/deparser/qualify_sequence_stmt.c +++ b/src/backend/distributed/deparser/qualify_sequence_stmt.c @@ -17,12 +17,13 @@ #include "postgres.h" +#include "parser/parse_func.h" +#include "utils/lsyscache.h" + #include "distributed/commands.h" #include "distributed/deparser.h" #include "distributed/listutils.h" #include "distributed/version_compat.h" -#include "parser/parse_func.h" -#include "utils/lsyscache.h" /* diff --git a/src/backend/distributed/deparser/qualify_statistics_stmt.c b/src/backend/distributed/deparser/qualify_statistics_stmt.c index ce9443930..ba8e8a764 100644 --- a/src/backend/distributed/deparser/qualify_statistics_stmt.c +++ b/src/backend/distributed/deparser/qualify_statistics_stmt.c @@ -16,15 +16,16 @@ #include "catalog/namespace.h" #include "catalog/pg_statistic_ext.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" #include "nodes/parsenodes.h" #include "nodes/value.h" -#include "utils/syscache.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/relcache.h" +#include "utils/syscache.h" + +#include "distributed/commands.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" static Oid GetStatsNamespaceOid(Oid statsOid); diff --git a/src/backend/distributed/deparser/qualify_table_stmt.c b/src/backend/distributed/deparser/qualify_table_stmt.c index 9667c4c79..e760ff388 100644 --- a/src/backend/distributed/deparser/qualify_table_stmt.c +++ b/src/backend/distributed/deparser/qualify_table_stmt.c @@ -23,6 +23,7 @@ #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/relcache.h" + #include "distributed/deparser.h" void diff --git a/src/backend/distributed/deparser/qualify_type_stmt.c b/src/backend/distributed/deparser/qualify_type_stmt.c index 487e6fc97..91052b576 100644 --- a/src/backend/distributed/deparser/qualify_type_stmt.c +++ b/src/backend/distributed/deparser/qualify_type_stmt.c @@ -23,13 +23,14 @@ #include "catalog/namespace.h" #include "catalog/objectaddress.h" #include "catalog/pg_type.h" +#include "nodes/makefuncs.h" +#include "parser/parse_type.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + #include "distributed/commands.h" #include "distributed/deparser.h" #include "distributed/version_compat.h" -#include "nodes/makefuncs.h" -#include "parser/parse_type.h" -#include "utils/syscache.h" -#include "utils/lsyscache.h" /* * GetTypeNamespaceNameByNameList resolved the schema name of a type by its namelist. diff --git a/src/backend/distributed/deparser/qualify_view_stmt.c b/src/backend/distributed/deparser/qualify_view_stmt.c index 1f450d50a..af3fb280a 100644 --- a/src/backend/distributed/deparser/qualify_view_stmt.c +++ b/src/backend/distributed/deparser/qualify_view_stmt.c @@ -12,12 +12,13 @@ #include "postgres.h" #include "catalog/namespace.h" -#include "distributed/deparser.h" -#include "distributed/listutils.h" #include "nodes/nodes.h" #include "utils/guc.h" #include "utils/lsyscache.h" +#include "distributed/deparser.h" +#include "distributed/listutils.h" + static void QualifyViewRangeVar(RangeVar *view); /* diff --git a/src/backend/distributed/executor/adaptive_executor.c b/src/backend/distributed/executor/adaptive_executor.c index 61a52e7c4..b5566985a 100644 --- a/src/backend/distributed/executor/adaptive_executor.c +++ b/src/backend/distributed/executor/adaptive_executor.c @@ -118,32 +118,43 @@ *------------------------------------------------------------------------- */ +#include +#include +#include + #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" #include "pgstat.h" -#include -#include -#include - +#include "access/htup_details.h" #include "access/transam.h" #include "access/xact.h" -#include "access/htup_details.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" #include "commands/schemacmds.h" +#include "lib/ilist.h" +#include "portability/instr_time.h" +#include "storage/fd.h" +#include "storage/latch.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/memutils.h" +#include "utils/syscache.h" +#include "utils/timestamp.h" + #include "distributed/adaptive_executor.h" +#include "distributed/backend_data.h" #include "distributed/cancel_utils.h" #include "distributed/citus_custom_scan.h" #include "distributed/citus_safe_lib.h" -#include "distributed/connection_management.h" #include "distributed/commands/multi_copy.h" +#include "distributed/connection_management.h" #include "distributed/deparse_shard_query.h" -#include "distributed/executor_util.h" -#include "distributed/shared_connection_stats.h" #include "distributed/distributed_execution_locks.h" +#include "distributed/executor_util.h" #include "distributed/intermediate_result_pruning.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" @@ -161,21 +172,11 @@ #include "distributed/resource_lock.h" #include "distributed/shared_connection_stats.h" #include "distributed/subplan_execution.h" -#include "distributed/transaction_management.h" #include "distributed/transaction_identifier.h" +#include "distributed/transaction_management.h" #include "distributed/tuple_destination.h" #include "distributed/version_compat.h" #include "distributed/worker_protocol.h" -#include "distributed/backend_data.h" -#include "lib/ilist.h" -#include "portability/instr_time.h" -#include "storage/fd.h" -#include "storage/latch.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "utils/memutils.h" -#include "utils/syscache.h" -#include "utils/timestamp.h" #define SLOW_START_DISABLED 0 diff --git a/src/backend/distributed/executor/citus_custom_scan.c b/src/backend/distributed/executor/citus_custom_scan.c index 3403e27ca..34a2f3d90 100644 --- a/src/backend/distributed/executor/citus_custom_scan.c +++ b/src/backend/distributed/executor/citus_custom_scan.c @@ -9,19 +9,30 @@ */ #include "postgres.h" -#include "pg_version_constants.h" - #include "miscadmin.h" #include "commands/copy.h" +#include "executor/executor.h" +#include "nodes/makefuncs.h" +#include "optimizer/clauses.h" +#include "optimizer/optimizer.h" +#include "utils/datum.h" +#include "utils/lsyscache.h" +#include "utils/memutils.h" +#include "utils/rel.h" + +#include "pg_version_constants.h" + #include "distributed/backend_data.h" #include "distributed/citus_clauses.h" #include "distributed/citus_custom_scan.h" #include "distributed/citus_nodefuncs.h" #include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" #include "distributed/connection_management.h" #include "distributed/deparse_shard_query.h" #include "distributed/distributed_execution_locks.h" +#include "distributed/function_call_delegation.h" #include "distributed/insert_select_executor.h" #include "distributed/insert_select_planner.h" #include "distributed/listutils.h" @@ -30,23 +41,13 @@ #include "distributed/merge_executor.h" #include "distributed/merge_planner.h" #include "distributed/multi_executor.h" -#include "distributed/multi_server_executor.h" #include "distributed/multi_router_planner.h" +#include "distributed/multi_server_executor.h" #include "distributed/query_stats.h" #include "distributed/shard_utils.h" #include "distributed/subplan_execution.h" #include "distributed/worker_log_messages.h" #include "distributed/worker_protocol.h" -#include "distributed/colocation_utils.h" -#include "distributed/function_call_delegation.h" -#include "executor/executor.h" -#include "nodes/makefuncs.h" -#include "optimizer/optimizer.h" -#include "optimizer/clauses.h" -#include "utils/lsyscache.h" -#include "utils/memutils.h" -#include "utils/rel.h" -#include "utils/datum.h" extern AllowedDistributionColumn AllowedDistributionColumnValue; diff --git a/src/backend/distributed/executor/directed_acyclic_graph_execution.c b/src/backend/distributed/executor/directed_acyclic_graph_execution.c index e0d4c9b81..15b0272dd 100644 --- a/src/backend/distributed/executor/directed_acyclic_graph_execution.c +++ b/src/backend/distributed/executor/directed_acyclic_graph_execution.c @@ -8,11 +8,12 @@ */ #include "postgres.h" + #include "access/hash.h" -#include "distributed/hash_helpers.h" #include "distributed/adaptive_executor.h" #include "distributed/directed_acyclic_graph_execution.h" +#include "distributed/hash_helpers.h" #include "distributed/listutils.h" #include "distributed/metadata_cache.h" #include "distributed/multi_physical_planner.h" diff --git a/src/backend/distributed/executor/distributed_execution_locks.c b/src/backend/distributed/executor/distributed_execution_locks.c index f7d2fd49d..4424accb7 100644 --- a/src/backend/distributed/executor/distributed_execution_locks.c +++ b/src/backend/distributed/executor/distributed_execution_locks.c @@ -8,10 +8,10 @@ * Copyright (c) Citus Data, Inc. *------------------------------------------------------------------------- */ +#include "distributed/coordinator_protocol.h" #include "distributed/distributed_execution_locks.h" #include "distributed/executor_util.h" #include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" #include "distributed/metadata_cache.h" #include "distributed/multi_executor.h" #include "distributed/multi_partitioning_utils.h" diff --git a/src/backend/distributed/executor/distributed_intermediate_results.c b/src/backend/distributed/executor/distributed_intermediate_results.c index cc351a1fc..c5ac27fb6 100644 --- a/src/backend/distributed/executor/distributed_intermediate_results.c +++ b/src/backend/distributed/executor/distributed_intermediate_results.c @@ -8,12 +8,11 @@ *------------------------------------------------------------------------- */ -#include "pg_version_constants.h" - #include #include #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" #include "port.h" @@ -21,21 +20,24 @@ #include "access/htup_details.h" #include "access/tupdesc.h" #include "catalog/pg_type.h" +#include "tcop/pquery.h" +#include "tcop/tcopprot.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" + +#include "pg_version_constants.h" + #include "distributed/deparse_shard_query.h" #include "distributed/intermediate_results.h" #include "distributed/listutils.h" -#include "distributed/metadata_utility.h" #include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" #include "distributed/multi_executor.h" #include "distributed/multi_physical_planner.h" #include "distributed/transaction_management.h" #include "distributed/tuple_destination.h" #include "distributed/tuplestore.h" #include "distributed/worker_protocol.h" -#include "tcop/pquery.h" -#include "tcop/tcopprot.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" /* diff --git a/src/backend/distributed/executor/executor_util_params.c b/src/backend/distributed/executor/executor_util_params.c index 6b5139bff..975654f22 100644 --- a/src/backend/distributed/executor/executor_util_params.c +++ b/src/backend/distributed/executor/executor_util_params.c @@ -8,12 +8,14 @@ */ #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" -#include "distributed/executor_util.h" #include "utils/lsyscache.h" +#include "distributed/executor_util.h" + /* * ExtractParametersForRemoteExecution extracts parameter types and values from diff --git a/src/backend/distributed/executor/executor_util_tasks.c b/src/backend/distributed/executor/executor_util_tasks.c index 483fd55a7..6a3eec8fc 100644 --- a/src/backend/distributed/executor/executor_util_tasks.c +++ b/src/backend/distributed/executor/executor_util_tasks.c @@ -8,6 +8,7 @@ */ #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" diff --git a/src/backend/distributed/executor/executor_util_tuples.c b/src/backend/distributed/executor/executor_util_tuples.c index c5fde9f90..68f699956 100644 --- a/src/backend/distributed/executor/executor_util_tuples.c +++ b/src/backend/distributed/executor/executor_util_tuples.c @@ -8,12 +8,14 @@ */ #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" -#include "distributed/executor_util.h" #include "utils/lsyscache.h" +#include "distributed/executor_util.h" + /* * TupleDescGetAttBinaryInMetadata - Build an AttInMetadata structure based on diff --git a/src/backend/distributed/executor/insert_select_executor.c b/src/backend/distributed/executor/insert_select_executor.c index 4a15289e6..f5fbb3f78 100644 --- a/src/backend/distributed/executor/insert_select_executor.c +++ b/src/backend/distributed/executor/insert_select_executor.c @@ -9,34 +9,9 @@ */ #include "postgres.h" + #include "miscadmin.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands/multi_copy.h" -#include "distributed/adaptive_executor.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/distributed_execution_locks.h" -#include "distributed/insert_select_executor.h" -#include "distributed/insert_select_planner.h" -#include "distributed/intermediate_results.h" -#include "distributed/local_executor.h" -#include "distributed/merge_planner.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_router_planner.h" -#include "distributed/local_executor.h" -#include "distributed/distributed_planner.h" -#include "distributed/recursive_planning.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/repartition_executor.h" -#include "distributed/resource_lock.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/subplan_execution.h" -#include "distributed/transaction_management.h" -#include "distributed/version_compat.h" #include "executor/executor.h" #include "nodes/execnodes.h" #include "nodes/makefuncs.h" @@ -53,6 +28,32 @@ #include "utils/rel.h" #include "utils/snapmgr.h" +#include "distributed/adaptive_executor.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/commands/multi_copy.h" +#include "distributed/deparse_shard_query.h" +#include "distributed/distributed_execution_locks.h" +#include "distributed/distributed_planner.h" +#include "distributed/insert_select_executor.h" +#include "distributed/insert_select_planner.h" +#include "distributed/intermediate_results.h" +#include "distributed/listutils.h" +#include "distributed/local_executor.h" +#include "distributed/merge_planner.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/recursive_planning.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/repartition_executor.h" +#include "distributed/resource_lock.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/subplan_execution.h" +#include "distributed/transaction_management.h" +#include "distributed/version_compat.h" + /* Config variables managed via guc.c */ bool EnableRepartitionedInsertSelect = true; diff --git a/src/backend/distributed/executor/intermediate_results.c b/src/backend/distributed/executor/intermediate_results.c index d17e65217..0e18d4416 100644 --- a/src/backend/distributed/executor/intermediate_results.c +++ b/src/backend/distributed/executor/intermediate_results.c @@ -11,6 +11,7 @@ #include #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" @@ -19,22 +20,6 @@ #include "catalog/pg_enum.h" #include "catalog/pg_type.h" #include "commands/copy.h" -#include "distributed/commands/multi_copy.h" -#include "distributed/connection_management.h" -#include "distributed/error_codes.h" -#include "distributed/intermediate_results.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_executor.h" -#include "distributed/remote_commands.h" -#include "distributed/transmit.h" -#include "distributed/transaction_identifier.h" -#include "distributed/tuplestore.h" -#include "distributed/utils/array_type.h" -#include "distributed/utils/directory.h" -#include "distributed/version_compat.h" -#include "distributed/worker_protocol.h" #include "nodes/makefuncs.h" #include "nodes/parsenodes.h" #include "nodes/primnodes.h" @@ -45,6 +30,23 @@ #include "utils/memutils.h" #include "utils/syscache.h" +#include "distributed/commands/multi_copy.h" +#include "distributed/connection_management.h" +#include "distributed/error_codes.h" +#include "distributed/intermediate_results.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/remote_commands.h" +#include "distributed/transaction_identifier.h" +#include "distributed/transmit.h" +#include "distributed/tuplestore.h" +#include "distributed/utils/array_type.h" +#include "distributed/utils/directory.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" + static List *CreatedResultsDirectories = NIL; diff --git a/src/backend/distributed/executor/local_executor.c b/src/backend/distributed/executor/local_executor.c index 7168fd314..bedaa643e 100644 --- a/src/backend/distributed/executor/local_executor.c +++ b/src/backend/distributed/executor/local_executor.c @@ -76,36 +76,38 @@ * via coordinator cannot happen via the local execution. */ #include "postgres.h" + #include "miscadmin.h" +#include "executor/tstoreReceiver.h" +#include "executor/tuptable.h" +#include "nodes/params.h" +#include "optimizer/optimizer.h" +#include "utils/snapmgr.h" + #include "pg_version_constants.h" #include "distributed/adaptive_executor.h" -#include "distributed/commands/utility_hook.h" #include "distributed/citus_custom_scan.h" #include "distributed/citus_ruleutils.h" #include "distributed/colocation_utils.h" -#include "distributed/query_utils.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" #include "distributed/deparse_shard_query.h" +#include "distributed/executor_util.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" #include "distributed/local_plan_cache.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/executor_util.h" #include "distributed/metadata_cache.h" #include "distributed/multi_executor.h" #include "distributed/multi_server_executor.h" +#include "distributed/query_utils.h" #include "distributed/relation_access_tracking.h" #include "distributed/remote_commands.h" /* to access LogRemoteCommands */ #include "distributed/transaction_management.h" #include "distributed/utils/citus_stat_tenants.h" #include "distributed/version_compat.h" #include "distributed/worker_protocol.h" -#include "executor/tstoreReceiver.h" -#include "executor/tuptable.h" -#include "optimizer/optimizer.h" -#include "nodes/params.h" -#include "utils/snapmgr.h" /* controlled via a GUC */ bool EnableLocalExecution = true; diff --git a/src/backend/distributed/executor/merge_executor.c b/src/backend/distributed/executor/merge_executor.c index bcacbcd1e..969b03faf 100644 --- a/src/backend/distributed/executor/merge_executor.c +++ b/src/backend/distributed/executor/merge_executor.c @@ -9,8 +9,13 @@ */ #include "postgres.h" + #include "miscadmin.h" +#include "nodes/execnodes.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" + #include "distributed/distributed_execution_locks.h" #include "distributed/insert_select_executor.h" #include "distributed/intermediate_results.h" @@ -23,10 +28,6 @@ #include "distributed/repartition_executor.h" #include "distributed/subplan_execution.h" -#include "nodes/execnodes.h" -#include "nodes/makefuncs.h" -#include "nodes/nodeFuncs.h" - static void ExecuteSourceAtWorkerAndRepartition(CitusScanState *scanState); static void ExecuteSourceAtCoordAndRedistribution(CitusScanState *scanState); static HTAB * ExecuteMergeSourcePlanIntoColocatedIntermediateResults(Oid targetRelationId, diff --git a/src/backend/distributed/executor/multi_executor.c b/src/backend/distributed/executor/multi_executor.c index 306698251..45a791af4 100644 --- a/src/backend/distributed/executor/multi_executor.c +++ b/src/backend/distributed/executor/multi_executor.c @@ -10,50 +10,50 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "miscadmin.h" #include "access/xact.h" #include "catalog/dependency.h" -#include "catalog/pg_class.h" #include "catalog/namespace.h" +#include "catalog/pg_class.h" +#include "commands/copy.h" +#include "executor/execdebug.h" +#include "nodes/execnodes.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "parser/parse_oper.h" +#include "parser/parsetree.h" +#include "storage/lmgr.h" +#include "tcop/dest.h" +#include "tcop/pquery.h" +#include "tcop/utility.h" +#include "utils/fmgrprotos.h" +#include "utils/memutils.h" +#include "utils/snapmgr.h" + +#include "pg_version_constants.h" + #include "distributed/backend_data.h" #include "distributed/citus_custom_scan.h" +#include "distributed/combine_query_planner.h" #include "distributed/commands/multi_copy.h" #include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distributed_planner.h" #include "distributed/function_call_delegation.h" #include "distributed/insert_select_executor.h" #include "distributed/insert_select_planner.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" -#include "distributed/coordinator_protocol.h" #include "distributed/multi_executor.h" -#include "distributed/combine_query_planner.h" -#include "distributed/distributed_planner.h" #include "distributed/multi_router_planner.h" #include "distributed/multi_server_executor.h" #include "distributed/relation_access_tracking.h" #include "distributed/resource_lock.h" #include "distributed/transaction_management.h" #include "distributed/version_compat.h" -#include "distributed/worker_shard_visibility.h" #include "distributed/worker_protocol.h" -#include "distributed/function_call_delegation.h" -#include "executor/execdebug.h" -#include "commands/copy.h" -#include "nodes/execnodes.h" -#include "nodes/makefuncs.h" -#include "nodes/nodeFuncs.h" -#include "parser/parsetree.h" -#include "parser/parse_oper.h" -#include "storage/lmgr.h" -#include "tcop/dest.h" -#include "tcop/pquery.h" -#include "tcop/utility.h" -#include "utils/fmgrprotos.h" -#include "utils/snapmgr.h" -#include "utils/memutils.h" +#include "distributed/worker_shard_visibility.h" /* diff --git a/src/backend/distributed/executor/multi_server_executor.c b/src/backend/distributed/executor/multi_server_executor.c index ac144c350..209019833 100644 --- a/src/backend/distributed/executor/multi_server_executor.c +++ b/src/backend/distributed/executor/multi_server_executor.c @@ -14,22 +14,24 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "miscadmin.h" - #include +#include "postgres.h" + +#include "miscadmin.h" + +#include "utils/lsyscache.h" + +#include "distributed/coordinator_protocol.h" #include "distributed/listutils.h" #include "distributed/log_utils.h" #include "distributed/multi_executor.h" #include "distributed/multi_physical_planner.h" -#include "distributed/multi_server_executor.h" #include "distributed/multi_router_planner.h" -#include "distributed/coordinator_protocol.h" +#include "distributed/multi_server_executor.h" #include "distributed/subplan_execution.h" #include "distributed/tuple_destination.h" #include "distributed/worker_protocol.h" -#include "utils/lsyscache.h" int RemoteTaskCheckInterval = 10; /* per cycle sleep interval in millisecs */ int TaskExecutorType = MULTI_EXECUTOR_ADAPTIVE; /* distributed executor type */ diff --git a/src/backend/distributed/executor/partitioned_intermediate_results.c b/src/backend/distributed/executor/partitioned_intermediate_results.c index 752552343..3ec73a456 100644 --- a/src/backend/distributed/executor/partitioned_intermediate_results.c +++ b/src/backend/distributed/executor/partitioned_intermediate_results.c @@ -11,6 +11,7 @@ #include #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" @@ -20,9 +21,15 @@ #include "access/nbtree.h" #include "catalog/pg_am.h" #include "catalog/pg_type.h" +#include "nodes/makefuncs.h" +#include "nodes/primnodes.h" +#include "tcop/pquery.h" +#include "tcop/tcopprot.h" +#include "utils/typcache.h" + #include "distributed/intermediate_results.h" -#include "distributed/metadata_utility.h" #include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" #include "distributed/multi_executor.h" #include "distributed/pg_dist_shard.h" #include "distributed/remote_commands.h" @@ -31,11 +38,6 @@ #include "distributed/utils/function.h" #include "distributed/version_compat.h" #include "distributed/worker_protocol.h" -#include "nodes/makefuncs.h" -#include "nodes/primnodes.h" -#include "tcop/pquery.h" -#include "tcop/tcopprot.h" -#include "utils/typcache.h" /* diff --git a/src/backend/distributed/executor/placement_access.c b/src/backend/distributed/executor/placement_access.c index df5143a54..a8573de7c 100644 --- a/src/backend/distributed/executor/placement_access.c +++ b/src/backend/distributed/executor/placement_access.c @@ -8,9 +8,9 @@ * Copyright (c) Citus Data, Inc. *------------------------------------------------------------------------- */ -#include "distributed/placement_access.h" #include "distributed/listutils.h" #include "distributed/metadata_cache.h" +#include "distributed/placement_access.h" static List * BuildPlacementSelectList(int32 groupId, List *relationShardList); static List * BuildPlacementDDLList(int32 groupId, List *relationShardList); diff --git a/src/backend/distributed/executor/query_stats.c b/src/backend/distributed/executor/query_stats.c index b59777d45..f37a99bbf 100644 --- a/src/backend/distributed/executor/query_stats.c +++ b/src/backend/distributed/executor/query_stats.c @@ -9,32 +9,32 @@ *------------------------------------------------------------------------- */ +#include + #include "postgres.h" -#include "safe_lib.h" - +#include "funcapi.h" #include "miscadmin.h" - -#include "pg_version_constants.h" +#include "safe_lib.h" #include "access/hash.h" #include "catalog/pg_authid.h" +#include "storage/fd.h" +#include "storage/ipc.h" +#include "storage/spin.h" +#include "tcop/utility.h" +#include "utils/builtins.h" + +#include "pg_version_constants.h" + #include "distributed/citus_safe_lib.h" #include "distributed/function_utils.h" #include "distributed/hash_helpers.h" #include "distributed/multi_executor.h" #include "distributed/multi_server_executor.h" -#include "distributed/version_compat.h" #include "distributed/query_stats.h" #include "distributed/tuplestore.h" -#include "funcapi.h" -#include "storage/ipc.h" -#include "storage/fd.h" -#include "storage/spin.h" -#include "tcop/utility.h" -#include "utils/builtins.h" - -#include +#include "distributed/version_compat.h" #define CITUS_STATS_DUMP_FILE "pg_stat/citus_query_stats.stat" #define CITUS_STAT_STATEMENTS_COLS 6 diff --git a/src/backend/distributed/executor/repartition_executor.c b/src/backend/distributed/executor/repartition_executor.c index af4f0ac7e..6e4dd3df4 100644 --- a/src/backend/distributed/executor/repartition_executor.c +++ b/src/backend/distributed/executor/repartition_executor.c @@ -10,6 +10,7 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "nodes/makefuncs.h" diff --git a/src/backend/distributed/executor/repartition_join_execution.c b/src/backend/distributed/executor/repartition_join_execution.c index 29d994e59..8dce12390 100644 --- a/src/backend/distributed/executor/repartition_join_execution.c +++ b/src/backend/distributed/executor/repartition_join_execution.c @@ -24,20 +24,22 @@ */ #include "postgres.h" -#include "access/hash.h" + #include "miscadmin.h" + +#include "access/hash.h" #include "utils/builtins.h" -#include "distributed/hash_helpers.h" #include "distributed/adaptive_executor.h" #include "distributed/directed_acyclic_graph_execution.h" +#include "distributed/hash_helpers.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" #include "distributed/metadata_cache.h" #include "distributed/multi_physical_planner.h" #include "distributed/multi_server_executor.h" -#include "distributed/task_execution_utils.h" #include "distributed/repartition_join_execution.h" +#include "distributed/task_execution_utils.h" #include "distributed/transaction_management.h" #include "distributed/transmit.h" #include "distributed/worker_manager.h" diff --git a/src/backend/distributed/executor/subplan_execution.c b/src/backend/distributed/executor/subplan_execution.c index 3651d7f52..4e81bb486 100644 --- a/src/backend/distributed/executor/subplan_execution.c +++ b/src/backend/distributed/executor/subplan_execution.c @@ -10,6 +10,9 @@ #include "postgres.h" +#include "executor/executor.h" +#include "utils/datetime.h" + #include "distributed/intermediate_result_pruning.h" #include "distributed/intermediate_results.h" #include "distributed/listutils.h" @@ -19,8 +22,6 @@ #include "distributed/subplan_execution.h" #include "distributed/transaction_management.h" #include "distributed/worker_manager.h" -#include "executor/executor.h" -#include "utils/datetime.h" #define SECOND_TO_MILLI_SECOND 1000 #define MICRO_TO_MILLI_SECOND 0.001 diff --git a/src/backend/distributed/executor/transmit.c b/src/backend/distributed/executor/transmit.c index 24cbbb550..a10ae4fbf 100644 --- a/src/backend/distributed/executor/transmit.c +++ b/src/backend/distributed/executor/transmit.c @@ -7,24 +7,26 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "miscadmin.h" -#include "pgstat.h" - #include #include #include +#include "postgres.h" + +#include "miscadmin.h" +#include "pgstat.h" + #include "commands/defrem.h" +#include "libpq/libpq.h" +#include "libpq/pqformat.h" +#include "storage/fd.h" + #include "distributed/listutils.h" #include "distributed/relay_utility.h" #include "distributed/transmit.h" #include "distributed/utils/directory.h" -#include "distributed/worker_protocol.h" #include "distributed/version_compat.h" -#include "libpq/libpq.h" -#include "libpq/pqformat.h" -#include "storage/fd.h" +#include "distributed/worker_protocol.h" /* Local functions forward declarations */ diff --git a/src/backend/distributed/executor/tuple_destination.c b/src/backend/distributed/executor/tuple_destination.c index 42dbf001e..3c44d21c0 100644 --- a/src/backend/distributed/executor/tuple_destination.c +++ b/src/backend/distributed/executor/tuple_destination.c @@ -1,13 +1,15 @@ +#include +#include + #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" #include "pgstat.h" -#include -#include - #include "access/htup_details.h" + #include "distributed/multi_server_executor.h" #include "distributed/subplan_execution.h" #include "distributed/tuple_destination.h" diff --git a/src/backend/distributed/metadata/dependency.c b/src/backend/distributed/metadata/dependency.c index 989e957af..01653721e 100644 --- a/src/backend/distributed/metadata/dependency.c +++ b/src/backend/distributed/metadata/dependency.c @@ -10,8 +10,7 @@ #include "postgres.h" -#include "distributed/commands.h" -#include "pg_version_constants.h" +#include "miscadmin.h" #include "access/genam.h" #include "access/heapam.h" @@ -36,6 +35,13 @@ #include "catalog/pg_type.h" #include "commands/extension.h" #include "common/hashfn.h" +#include "utils/fmgroids.h" +#include "utils/hsearch.h" +#include "utils/lsyscache.h" +#include "utils/syscache.h" + +#include "pg_version_constants.h" + #include "distributed/citus_depended_object.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" @@ -46,11 +52,6 @@ #include "distributed/metadata_cache.h" #include "distributed/metadata_sync.h" #include "distributed/version_compat.h" -#include "miscadmin.h" -#include "utils/fmgroids.h" -#include "utils/hsearch.h" -#include "utils/lsyscache.h" -#include "utils/syscache.h" /* * ObjectAddressCollector keeps track of collected ObjectAddresses. This can be used @@ -698,7 +699,6 @@ SupportedDependencyByCitus(const ObjectAddress *address) case OCLASS_DATABASE: { - /* only to propagate its owner */ return true; } diff --git a/src/backend/distributed/metadata/distobject.c b/src/backend/distributed/metadata/distobject.c index fa9da8b75..25d976a55 100644 --- a/src/backend/distributed/metadata/distobject.c +++ b/src/backend/distributed/metadata/distobject.c @@ -10,8 +10,6 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "miscadmin.h" #include "access/genam.h" @@ -22,23 +20,13 @@ #include "catalog/dependency.h" #include "catalog/namespace.h" #include "catalog/objectaddress.h" +#include "catalog/pg_database.h" #include "catalog/pg_extension_d.h" #include "catalog/pg_namespace.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "citus_version.h" +#include "commands/dbcommands.h" #include "commands/extension.h" -#include "distributed/listutils.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/metadata/dependency.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata/pg_dist_object.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/version_compat.h" -#include "distributed/worker_transaction.h" #include "executor/spi.h" #include "nodes/makefuncs.h" #include "nodes/pg_list.h" @@ -49,6 +37,20 @@ #include "utils/regproc.h" #include "utils/rel.h" +#include "citus_version.h" +#include "pg_version_constants.h" + +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/listutils.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata/pg_dist_object.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/version_compat.h" +#include "distributed/worker_transaction.h" static char * CreatePgDistObjectEntryCommand(const ObjectAddress *objectAddress); static int ExecuteCommandAsSuperuser(char *query, int paramCount, Oid *paramTypes, @@ -357,6 +359,42 @@ ExecuteCommandAsSuperuser(char *query, int paramCount, Oid *paramTypes, } +/* + * UnmarkNodeWideObjectsDistributed deletes pg_dist_object records + * for all distributed objects in given Drop stmt node. + * + * Today we only expect DropRoleStmt and DropdbStmt to get here. + */ +void +UnmarkNodeWideObjectsDistributed(Node *node) +{ + if (IsA(node, DropRoleStmt)) + { + DropRoleStmt *stmt = castNode(DropRoleStmt, node); + List *allDropRoles = stmt->roles; + + List *distributedDropRoles = FilterDistributedRoles(allDropRoles); + if (list_length(distributedDropRoles) > 0) + { + UnmarkRolesDistributed(distributedDropRoles); + } + } + else if (IsA(node, DropdbStmt)) + { + DropdbStmt *stmt = castNode(DropdbStmt, node); + char *dbName = stmt->dbname; + + Oid dbOid = get_database_oid(dbName, stmt->missing_ok); + ObjectAddress *dbObjectAddress = palloc0(sizeof(ObjectAddress)); + ObjectAddressSet(*dbObjectAddress, DatabaseRelationId, dbOid); + if (IsAnyObjectDistributed(list_make1(dbObjectAddress))) + { + UnmarkObjectDistributed(dbObjectAddress); + } + } +} + + /* * UnmarkObjectDistributed removes the entry from pg_dist_object that marks this object as * distributed. This will prevent updates to that object to be propagated to the worker. diff --git a/src/backend/distributed/metadata/metadata_cache.c b/src/backend/distributed/metadata/metadata_cache.c index 44179cffb..1b2fa229f 100644 --- a/src/backend/distributed/metadata/metadata_cache.c +++ b/src/backend/distributed/metadata/metadata_cache.c @@ -8,20 +8,17 @@ */ #include "postgres.h" -#include "pg_version_constants.h" -#include "pg_version_compat.h" -#include "stdint.h" -#include "postgres.h" #include "libpq-fe.h" #include "miscadmin.h" +#include "stdint.h" #include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" #include "access/nbtree.h" -#include "access/xact.h" #include "access/sysattr.h" +#include "access/xact.h" #include "catalog/index.h" #include "catalog/indexing.h" #include "catalog/pg_am.h" @@ -30,38 +27,10 @@ #include "catalog/pg_extension.h" #include "catalog/pg_namespace.h" #include "catalog/pg_type.h" -#include "citus_version.h" #include "commands/dbcommands.h" #include "commands/extension.h" #include "commands/trigger.h" -#include "distributed/backend_data.h" -#include "distributed/citus_depended_object.h" -#include "distributed/colocation_utils.h" -#include "distributed/connection_management.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/multi_executor.h" -#include "distributed/function_utils.h" -#include "distributed/listutils.h" -#include "distributed/foreign_key_relationship.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/metadata/pg_dist_object.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/pg_dist_local_group.h" -#include "distributed/pg_dist_node_metadata.h" -#include "distributed/pg_dist_node.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/pg_dist_placement.h" -#include "distributed/shared_library_init.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/utils/array_type.h" -#include "distributed/utils/function.h" -#include "distributed/version_compat.h" -#include "distributed/worker_manager.h" -#include "distributed/worker_protocol.h" +#include "common/hashfn.h" #include "executor/executor.h" #include "nodes/makefuncs.h" #include "nodes/memnodes.h" @@ -74,23 +43,54 @@ #include "utils/catcache.h" #include "utils/datum.h" #include "utils/elog.h" -#include "utils/hsearch.h" -#include "utils/jsonb.h" -#include "common/hashfn.h" -#include "utils/inval.h" #include "utils/fmgroids.h" +#include "utils/hsearch.h" +#include "utils/inval.h" +#include "utils/jsonb.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/palloc.h" #include "utils/rel.h" -#if PG_VERSION_NUM < PG_VERSION_16 -#include "utils/relfilenodemap.h" -#endif #include "utils/relmapper.h" #include "utils/resowner.h" #include "utils/syscache.h" #include "utils/typcache.h" +#include "citus_version.h" +#include "pg_version_compat.h" +#include "pg_version_constants.h" + +#include "distributed/backend_data.h" +#include "distributed/citus_depended_object.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" +#include "distributed/connection_management.h" +#include "distributed/foreign_key_relationship.h" +#include "distributed/function_utils.h" +#include "distributed/listutils.h" +#include "distributed/metadata/pg_dist_object.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/pg_dist_local_group.h" +#include "distributed/pg_dist_node.h" +#include "distributed/pg_dist_node_metadata.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/pg_dist_placement.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/shared_library_init.h" +#include "distributed/utils/array_type.h" +#include "distributed/utils/function.h" +#include "distributed/version_compat.h" +#include "distributed/worker_manager.h" +#include "distributed/worker_protocol.h" + +#if PG_VERSION_NUM < PG_VERSION_16 +#include "utils/relfilenodemap.h" +#endif + /* user configuration */ int ReadFromSecondaries = USE_SECONDARY_NODES_NEVER; diff --git a/src/backend/distributed/metadata/metadata_sync.c b/src/backend/distributed/metadata/metadata_sync.c index 53dc7e747..f0be1995b 100644 --- a/src/backend/distributed/metadata/metadata_sync.c +++ b/src/backend/distributed/metadata/metadata_sync.c @@ -11,13 +11,15 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "miscadmin.h" - #include #include #include +#include "postgres.h" + +#include "miscadmin.h" +#include "pgstat.h" + #include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" @@ -30,57 +32,22 @@ #include "catalog/pg_attrdef.h" #include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" +#include "catalog/pg_database.h" +#include "catalog/pg_database_d.h" #include "catalog/pg_depend.h" #include "catalog/pg_foreign_server.h" #include "catalog/pg_namespace.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/async.h" -#include "distributed/argutils.h" -#include "distributed/backend_data.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/colocation_utils.h" -#include "distributed/tenant_schema_metadata.h" -#include "distributed/commands.h" -#include "distributed/deparser.h" -#include "distributed/distribution_column.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/maintenanced.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/metadata_utility.h" -#include "distributed/metadata/dependency.h" -#include "distributed/metadata/distobject.h" -#include "distributed/metadata/pg_dist_object.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/pg_dist_colocation.h" -#include "distributed/pg_dist_node.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/pg_dist_schema.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/remote_commands.h" -#include "distributed/resource_lock.h" -#include "distributed/utils/array_type.h" -#include "distributed/utils/function.h" -#include "distributed/worker_manager.h" -#include "distributed/worker_protocol.h" -#include "distributed/worker_transaction.h" -#include "distributed/version_compat.h" -#include "distributed/commands/utility_hook.h" +#include "commands/dbcommands.h" #include "executor/spi.h" #include "foreign/foreign.h" -#include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/pg_list.h" -#include "pgstat.h" +#include "parser/parse_type.h" #include "postmaster/bgworker.h" #include "postmaster/postmaster.h" -#include "parser/parse_type.h" #include "storage/lmgr.h" #include "utils/builtins.h" #include "utils/fmgroids.h" @@ -89,6 +56,42 @@ #include "utils/snapmgr.h" #include "utils/syscache.h" +#include "distributed/argutils.h" +#include "distributed/backend_data.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparser.h" +#include "distributed/distribution_column.h" +#include "distributed/listutils.h" +#include "distributed/maintenanced.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata/pg_dist_object.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/pg_dist_colocation.h" +#include "distributed/pg_dist_node.h" +#include "distributed/pg_dist_schema.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/remote_commands.h" +#include "distributed/resource_lock.h" +#include "distributed/tenant_schema_metadata.h" +#include "distributed/utils/array_type.h" +#include "distributed/utils/function.h" +#include "distributed/version_compat.h" +#include "distributed/worker_manager.h" +#include "distributed/worker_protocol.h" +#include "distributed/worker_transaction.h" + /* managed via a GUC */ char *EnableManualMetadataChangesForUser = ""; @@ -120,6 +123,7 @@ static List * GetObjectsForGrantStmt(ObjectType objectType, Oid objectId); static AccessPriv * GetAccessPrivObjectForGrantStmt(char *permission); static List * GenerateGrantOnSchemaQueriesFromAclItem(Oid schemaOid, AclItem *aclItem); +static List * GenerateGrantOnDatabaseFromAclItem(Oid databaseOid, AclItem *aclItem); static List * GenerateGrantOnFunctionQueriesFromAclItem(Oid schemaOid, AclItem *aclItem); static List * GrantOnSequenceDDLCommands(Oid sequenceOid); @@ -179,6 +183,7 @@ PG_FUNCTION_INFO_V1(citus_internal_delete_colocation_metadata); PG_FUNCTION_INFO_V1(citus_internal_add_tenant_schema); PG_FUNCTION_INFO_V1(citus_internal_delete_tenant_schema); PG_FUNCTION_INFO_V1(citus_internal_update_none_dist_table_metadata); +PG_FUNCTION_INFO_V1(citus_internal_database_command); static bool got_SIGTERM = false; @@ -2043,6 +2048,92 @@ GenerateGrantOnSchemaQueriesFromAclItem(Oid schemaOid, AclItem *aclItem) } +/* + * GrantOnDatabaseDDLCommands creates a list of ddl command for replicating the permissions + * of roles on databases. + */ +List * +GrantOnDatabaseDDLCommands(Oid databaseOid) +{ + HeapTuple databaseTuple = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(databaseOid)); + bool isNull = true; + Datum aclDatum = SysCacheGetAttr(DATABASEOID, databaseTuple, Anum_pg_database_datacl, + &isNull); + if (isNull) + { + ReleaseSysCache(databaseTuple); + return NIL; + } + Acl *acl = DatumGetAclPCopy(aclDatum); + AclItem *aclDat = ACL_DAT(acl); + int aclNum = ACL_NUM(acl); + List *commands = NIL; + + ReleaseSysCache(databaseTuple); + + for (int i = 0; i < aclNum; i++) + { + commands = list_concat(commands, + GenerateGrantOnDatabaseFromAclItem( + databaseOid, &aclDat[i])); + } + + return commands; +} + + +/* + * GenerateGrantOnDatabaseFromAclItem generates a query string for replicating a users permissions + * on a database. + */ +List * +GenerateGrantOnDatabaseFromAclItem(Oid databaseOid, AclItem *aclItem) +{ + AclMode permissions = ACLITEM_GET_PRIVS(*aclItem) & ACL_ALL_RIGHTS_DATABASE; + AclMode grants = ACLITEM_GET_GOPTIONS(*aclItem) & ACL_ALL_RIGHTS_DATABASE; + + /* + * seems unlikely but we check if there is a grant option in the list without the actual permission + */ + Assert(!(grants & ACL_CONNECT) || (permissions & ACL_CONNECT)); + Assert(!(grants & ACL_CREATE) || (permissions & ACL_CREATE)); + Assert(!(grants & ACL_CREATE_TEMP) || (permissions & ACL_CREATE_TEMP)); + Oid granteeOid = aclItem->ai_grantee; + List *queries = NIL; + + queries = lappend(queries, GenerateSetRoleQuery(aclItem->ai_grantor)); + + if (permissions & ACL_CONNECT) + { + char *query = DeparseTreeNode((Node *) GenerateGrantStmtForRights( + OBJECT_DATABASE, granteeOid, databaseOid, + "CONNECT", + grants & ACL_CONNECT)); + queries = lappend(queries, query); + } + if (permissions & ACL_CREATE) + { + char *query = DeparseTreeNode((Node *) GenerateGrantStmtForRights( + OBJECT_DATABASE, granteeOid, databaseOid, + "CREATE", + grants & ACL_CREATE)); + queries = lappend(queries, query); + } + if (permissions & ACL_CREATE_TEMP) + { + char *query = DeparseTreeNode((Node *) GenerateGrantStmtForRights( + OBJECT_DATABASE, granteeOid, databaseOid, + "TEMPORARY", + grants & ACL_CREATE_TEMP)); + queries = lappend(queries, query); + } + + queries = lappend(queries, "RESET ROLE"); + + return queries; +} + + /* * GenerateGrantStmtForRights is the function for creating GrantStmt's for all * types of objects that are supported. It takes parameters to fill a GrantStmt's @@ -2116,6 +2207,11 @@ GetObjectsForGrantStmt(ObjectType objectType, Oid objectId) return list_make1(sequence); } + case OBJECT_DATABASE: + { + return list_make1(makeString(get_database_name(objectId))); + } + default: { elog(ERROR, "unsupported object type for GRANT"); @@ -3889,6 +3985,70 @@ citus_internal_update_none_dist_table_metadata(PG_FUNCTION_ARGS) } +/* + * citus_internal_database_command is an internal UDF to + * create a database in an idempotent maner without + * transaction block restrictions. + */ +Datum +citus_internal_database_command(PG_FUNCTION_ARGS) +{ + CheckCitusVersion(ERROR); + + if (!ShouldSkipMetadataChecks()) + { + EnsureCitusInitiatedOperation(); + } + + PG_ENSURE_ARGNOTNULL(0, "command"); + + text *commandText = PG_GETARG_TEXT_P(0); + char *command = text_to_cstring(commandText); + Node *parseTree = ParseTreeNode(command); + + int saveNestLevel = NewGUCNestLevel(); + + set_config_option("citus.enable_ddl_propagation", "off", + (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + GUC_ACTION_LOCAL, true, 0, false); + + set_config_option("citus.enable_create_database_propagation", "off", + (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + GUC_ACTION_LOCAL, true, 0, false); + + /* + * createdb() uses ParseState to report the error position for the + * input command and the position is reported to be 0 when it's provided as NULL. + * We're okay with that because we don't expect this UDF to be called with an incorrect + * DDL command. + */ + ParseState *pstate = NULL; + + if (IsA(parseTree, CreatedbStmt)) + { + CreatedbStmt *stmt = castNode(CreatedbStmt, parseTree); + + bool missingOk = true; + Oid databaseOid = get_database_oid(stmt->dbname, missingOk); + + if (!OidIsValid(databaseOid)) + { + createdb(pstate, (CreatedbStmt *) parseTree); + } + } + else + { + ereport(ERROR, (errmsg("citus_internal_database_command() can only be used " + "for CREATE DATABASE command by Citus."))); + } + + /* rollback GUCs to the state before this session */ + AtEOXact_GUC(true, saveNestLevel); + + PG_RETURN_VOID(); +} + + /* * SyncNewColocationGroup synchronizes a new pg_dist_colocation entry to a worker. */ diff --git a/src/backend/distributed/metadata/metadata_utility.c b/src/backend/distributed/metadata/metadata_utility.c index 0d9963c12..15e167008 100644 --- a/src/backend/distributed/metadata/metadata_utility.c +++ b/src/backend/distributed/metadata/metadata_utility.c @@ -13,12 +13,11 @@ #include #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" -#include "pg_version_constants.h" - #include "access/genam.h" #include "access/htup_details.h" #include "access/sysattr.h" @@ -30,44 +29,9 @@ #include "catalog/pg_constraint.h" #include "catalog/pg_extension.h" #include "catalog/pg_namespace.h" -#if PG_VERSION_NUM >= PG_VERSION_16 -#include "catalog/pg_proc_d.h" -#endif #include "catalog/pg_type.h" #include "commands/extension.h" #include "commands/sequence.h" -#include "distributed/background_jobs.h" -#include "distributed/colocation_utils.h" -#include "distributed/connection_management.h" -#include "distributed/citus_nodes.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/listutils.h" -#include "distributed/lock_graph.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/pg_dist_background_job.h" -#include "distributed/pg_dist_background_task.h" -#include "distributed/pg_dist_backrgound_task_depend.h" -#include "distributed/pg_dist_colocation.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/pg_dist_placement.h" -#include "distributed/reference_table_utils.h" -#include "distributed/relay_utility.h" -#include "distributed/resource_lock.h" -#include "distributed/remote_commands.h" -#include "distributed/shard_rebalancer.h" -#include "distributed/tuplestore.h" -#include "distributed/utils/array_type.h" -#include "distributed/worker_manager.h" -#include "distributed/worker_protocol.h" -#include "distributed/version_compat.h" #include "nodes/makefuncs.h" #include "parser/scansup.h" #include "storage/lmgr.h" @@ -82,6 +46,45 @@ #include "utils/rel.h" #include "utils/syscache.h" +#include "pg_version_constants.h" + +#include "distributed/background_jobs.h" +#include "distributed/citus_nodes.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/colocation_utils.h" +#include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" +#include "distributed/lock_graph.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/pg_dist_background_job.h" +#include "distributed/pg_dist_background_task.h" +#include "distributed/pg_dist_backrgound_task_depend.h" +#include "distributed/pg_dist_colocation.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/pg_dist_placement.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relay_utility.h" +#include "distributed/remote_commands.h" +#include "distributed/resource_lock.h" +#include "distributed/shard_rebalancer.h" +#include "distributed/tuplestore.h" +#include "distributed/utils/array_type.h" +#include "distributed/version_compat.h" +#include "distributed/worker_manager.h" +#include "distributed/worker_protocol.h" + +#if PG_VERSION_NUM >= PG_VERSION_16 +#include "catalog/pg_proc_d.h" +#endif + #define DISK_SPACE_FIELDS 2 /* Local functions forward declarations */ diff --git a/src/backend/distributed/metadata/node_metadata.c b/src/backend/distributed/metadata/node_metadata.c index 041c6dcc4..2bd2b8a09 100644 --- a/src/backend/distributed/metadata/node_metadata.c +++ b/src/backend/distributed/metadata/node_metadata.c @@ -5,34 +5,49 @@ * Copyright (c) Citus Data, Inc. */ #include "postgres.h" -#include "miscadmin.h" + #include "funcapi.h" -#include "utils/plancache.h" +#include "miscadmin.h" #include "access/genam.h" #include "access/heapam.h" #include "access/htup.h" #include "access/htup_details.h" #include "access/skey.h" -#include "access/skey.h" #include "access/tupmacs.h" #include "access/xact.h" #include "catalog/indexing.h" #include "catalog/namespace.h" #include "commands/sequence.h" +#include "executor/spi.h" +#include "lib/stringinfo.h" +#include "postmaster/postmaster.h" +#include "storage/bufmgr.h" +#include "storage/fd.h" +#include "storage/lmgr.h" +#include "storage/lock.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/plancache.h" +#include "utils/rel.h" +#include "utils/relcache.h" + #include "distributed/citus_acquire_lock.h" #include "distributed/citus_safe_lib.h" #include "distributed/colocation_utils.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" #include "distributed/connection_management.h" -#include "distributed/maintenanced.h" #include "distributed/coordinator_protocol.h" -#include "distributed/metadata_utility.h" +#include "distributed/maintenanced.h" #include "distributed/metadata/distobject.h" +#include "distributed/metadata/pg_dist_object.h" #include "distributed/metadata_cache.h" #include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" #include "distributed/multi_join_order.h" +#include "distributed/multi_partitioning_utils.h" #include "distributed/multi_router_planner.h" #include "distributed/pg_dist_node.h" #include "distributed/pg_dist_node_metadata.h" @@ -40,26 +55,12 @@ #include "distributed/remote_commands.h" #include "distributed/resource_lock.h" #include "distributed/shardinterval_utils.h" -#include "distributed/multi_partitioning_utils.h" #include "distributed/shared_connection_stats.h" #include "distributed/string_utils.h" -#include "distributed/metadata/pg_dist_object.h" #include "distributed/transaction_recovery.h" #include "distributed/version_compat.h" #include "distributed/worker_manager.h" #include "distributed/worker_transaction.h" -#include "executor/spi.h" -#include "lib/stringinfo.h" -#include "postmaster/postmaster.h" -#include "storage/bufmgr.h" -#include "storage/lmgr.h" -#include "storage/lock.h" -#include "storage/fd.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" -#include "utils/relcache.h" #define INVALID_GROUP_ID -1 diff --git a/src/backend/distributed/metadata/pg_get_object_address_13_14_15.c b/src/backend/distributed/metadata/pg_get_object_address_13_14_15.c index a7f40e2ad..abe378cdb 100644 --- a/src/backend/distributed/metadata/pg_get_object_address_13_14_15.c +++ b/src/backend/distributed/metadata/pg_get_object_address_13_14_15.c @@ -16,23 +16,26 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "catalog/objectaddress.h" #include "catalog/pg_type.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/metadata/dependency.h" -#include "distributed/metadata/distobject.h" -#include "pg_version_constants.h" -#include "distributed/version_compat.h" +#include "mb/pg_wchar.h" #include "nodes/value.h" +#include "parser/parse_type.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/varlena.h" -#include "mb/pg_wchar.h" -#include "parser/parse_type.h" + +#include "pg_version_constants.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/metadata/dependency.h" +#include "distributed/metadata/distobject.h" +#include "distributed/version_compat.h" static void ErrorIfCurrentUserCanNotDistributeObject(char *textType, ObjectType type, diff --git a/src/backend/distributed/operations/citus_create_restore_point.c b/src/backend/distributed/operations/citus_create_restore_point.c index 42fc5311f..8a5e738e4 100644 --- a/src/backend/distributed/operations/citus_create_restore_point.c +++ b/src/backend/distributed/operations/citus_create_restore_point.c @@ -10,22 +10,24 @@ */ #include "postgres.h" + #include "libpq-fe.h" #include "access/xlog.h" #include "access/xlog_internal.h" #include "catalog/pg_type.h" -#include "distributed/connection_management.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/metadata_cache.h" -#include "distributed/remote_commands.h" #include "nodes/pg_list.h" #include "storage/lmgr.h" #include "storage/lock.h" #include "utils/builtins.h" #include "utils/pg_lsn.h" +#include "distributed/connection_management.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/remote_commands.h" + #define CREATE_RESTORE_POINT_COMMAND "SELECT pg_catalog.pg_create_restore_point($1::text)" diff --git a/src/backend/distributed/operations/citus_split_shard_by_split_points.c b/src/backend/distributed/operations/citus_split_shard_by_split_points.c index 5bdbaf576..076e58d4c 100644 --- a/src/backend/distributed/operations/citus_split_shard_by_split_points.c +++ b/src/backend/distributed/operations/citus_split_shard_by_split_points.c @@ -10,19 +10,21 @@ */ #include "postgres.h" + #include "catalog/pg_type.h" -#include "nodes/pg_list.h" #include "lib/stringinfo.h" +#include "nodes/pg_list.h" #include "utils/builtins.h" #include "utils/lsyscache.h" -#include "distributed/utils/array_type.h" + #include "distributed/colocation_utils.h" -#include "distributed/metadata_cache.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/coordinator_protocol.h" #include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/metadata_cache.h" #include "distributed/remote_commands.h" #include "distributed/shard_split.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/utils/array_type.h" #include "distributed/utils/distribution_column_map.h" /* declarations for dynamic loading */ diff --git a/src/backend/distributed/operations/citus_tools.c b/src/backend/distributed/operations/citus_tools.c index 8f6f80c2b..bc4aa5560 100644 --- a/src/backend/distributed/operations/citus_tools.c +++ b/src/backend/distributed/operations/citus_tools.c @@ -12,8 +12,15 @@ #include "postgres.h" +#include "funcapi.h" +#include "libpq-fe.h" +#include "miscadmin.h" + #include "access/htup_details.h" #include "catalog/pg_type.h" +#include "lib/stringinfo.h" +#include "utils/builtins.h" + #include "distributed/backend_data.h" #include "distributed/connection_management.h" #include "distributed/metadata_cache.h" @@ -23,11 +30,6 @@ #include "distributed/utils/function.h" #include "distributed/version_compat.h" #include "distributed/worker_protocol.h" -#include "funcapi.h" -#include "lib/stringinfo.h" -#include "libpq-fe.h" -#include "miscadmin.h" -#include "utils/builtins.h" PG_FUNCTION_INFO_V1(master_run_on_worker); diff --git a/src/backend/distributed/operations/create_shards.c b/src/backend/distributed/operations/create_shards.c index 8bc3b249f..962547051 100644 --- a/src/backend/distributed/operations/create_shards.c +++ b/src/backend/distributed/operations/create_shards.c @@ -10,35 +10,22 @@ *------------------------------------------------------------------------- */ +#include +#include +#include +#include +#include + #include "postgres.h" + #include "c.h" #include "fmgr.h" #include "libpq-fe.h" #include "miscadmin.h" #include "port.h" -#include -#include -#include -#include -#include - #include "catalog/namespace.h" #include "catalog/pg_class.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/reference_table_utils.h" -#include "distributed/resource_lock.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/transaction_management.h" -#include "distributed/worker_manager.h" #include "lib/stringinfo.h" #include "nodes/pg_list.h" #include "nodes/primnodes.h" @@ -52,6 +39,21 @@ #include "utils/lsyscache.h" #include "utils/palloc.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/reference_table_utils.h" +#include "distributed/resource_lock.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/transaction_management.h" +#include "distributed/worker_manager.h" + /* declarations for dynamic loading */ PG_FUNCTION_INFO_V1(master_create_worker_shards); diff --git a/src/backend/distributed/operations/delete_protocol.c b/src/backend/distributed/operations/delete_protocol.c index 54cb568be..c36121b00 100644 --- a/src/backend/distributed/operations/delete_protocol.c +++ b/src/backend/distributed/operations/delete_protocol.c @@ -13,9 +13,9 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" +#include -#include "pg_version_constants.h" +#include "postgres.h" #include "c.h" #include "fmgr.h" @@ -23,17 +23,37 @@ #include "miscadmin.h" #include "port.h" -#include - #include "access/xact.h" #include "catalog/namespace.h" #include "commands/dbcommands.h" +#include "lib/stringinfo.h" +#include "nodes/nodeFuncs.h" +#include "nodes/nodes.h" +#include "nodes/parsenodes.h" +#include "nodes/pathnodes.h" +#include "nodes/pg_list.h" +#include "nodes/primnodes.h" +#include "optimizer/clauses.h" +#include "optimizer/optimizer.h" +#include "optimizer/restrictinfo.h" +#include "storage/lmgr.h" +#include "storage/lock.h" +#include "tcop/tcopprot.h" +#include "utils/array.h" +#include "utils/builtins.h" +#include "utils/elog.h" +#include "utils/errcodes.h" +#include "utils/lsyscache.h" +#include "utils/varlena.h" + +#include "pg_version_constants.h" + #include "distributed/commands/utility_hook.h" #include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" #include "distributed/deparse_shard_query.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" -#include "distributed/coordinator_protocol.h" #include "distributed/metadata_sync.h" #include "distributed/multi_join_order.h" #include "distributed/multi_logical_planner.h" @@ -47,25 +67,6 @@ #include "distributed/shard_cleaner.h" #include "distributed/worker_protocol.h" #include "distributed/worker_transaction.h" -#include "lib/stringinfo.h" -#include "nodes/nodeFuncs.h" -#include "nodes/nodes.h" -#include "nodes/parsenodes.h" -#include "nodes/pg_list.h" -#include "nodes/primnodes.h" -#include "optimizer/clauses.h" -#include "nodes/pathnodes.h" -#include "optimizer/optimizer.h" -#include "optimizer/restrictinfo.h" -#include "storage/lock.h" -#include "storage/lmgr.h" -#include "tcop/tcopprot.h" -#include "utils/array.h" -#include "utils/builtins.h" -#include "utils/elog.h" -#include "utils/errcodes.h" -#include "utils/lsyscache.h" -#include "utils/varlena.h" /* Local functions forward declarations */ diff --git a/src/backend/distributed/operations/health_check.c b/src/backend/distributed/operations/health_check.c index b3246f888..c908606c1 100644 --- a/src/backend/distributed/operations/health_check.c +++ b/src/backend/distributed/operations/health_check.c @@ -13,6 +13,8 @@ #include "postgres.h" +#include "utils/builtins.h" + #include "distributed/argutils.h" #include "distributed/listutils.h" #include "distributed/lock_graph.h" @@ -20,7 +22,6 @@ #include "distributed/remote_commands.h" #include "distributed/tuplestore.h" #include "distributed/worker_manager.h" -#include "utils/builtins.h" /* simple query to run on workers to check connectivity */ #define CONNECTIVITY_CHECK_QUERY "SELECT 1" diff --git a/src/backend/distributed/operations/isolate_shards.c b/src/backend/distributed/operations/isolate_shards.c index ec89ae402..502b00f5b 100644 --- a/src/backend/distributed/operations/isolate_shards.c +++ b/src/backend/distributed/operations/isolate_shards.c @@ -11,11 +11,20 @@ */ #include "postgres.h" + #include "c.h" #include "fmgr.h" #include "libpq-fe.h" #include "catalog/pg_class.h" +#include "nodes/pg_list.h" +#include "storage/lock.h" +#include "utils/builtins.h" +#include "utils/elog.h" +#include "utils/errcodes.h" +#include "utils/lsyscache.h" +#include "utils/typcache.h" + #include "distributed/colocation_utils.h" #include "distributed/coordinator_protocol.h" #include "distributed/metadata_cache.h" @@ -25,22 +34,15 @@ #include "distributed/multi_router_planner.h" #include "distributed/pg_dist_partition.h" #include "distributed/pg_dist_shard.h" -#include "distributed/remote_commands.h" #include "distributed/reference_table_utils.h" +#include "distributed/remote_commands.h" #include "distributed/resource_lock.h" +#include "distributed/shard_split.h" +#include "distributed/utils/distribution_column_map.h" +#include "distributed/version_compat.h" #include "distributed/worker_manager.h" #include "distributed/worker_protocol.h" #include "distributed/worker_transaction.h" -#include "distributed/version_compat.h" -#include "distributed/shard_split.h" -#include "distributed/utils/distribution_column_map.h" -#include "nodes/pg_list.h" -#include "storage/lock.h" -#include "utils/builtins.h" -#include "utils/elog.h" -#include "utils/errcodes.h" -#include "utils/lsyscache.h" -#include "utils/typcache.h" /* declarations for dynamic loading */ PG_FUNCTION_INFO_V1(isolate_tenant_to_new_shard); diff --git a/src/backend/distributed/operations/modify_multiple_shards.c b/src/backend/distributed/operations/modify_multiple_shards.c index 8d596a10b..9e2879728 100644 --- a/src/backend/distributed/operations/modify_multiple_shards.c +++ b/src/backend/distributed/operations/modify_multiple_shards.c @@ -14,40 +14,17 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" - #include "catalog/pg_class.h" #include "commands/dbcommands.h" #include "commands/event_trigger.h" -#include "distributed/citus_clauses.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/multi_server_executor.h" -#include "distributed/distributed_planner.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/resource_lock.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/shard_pruning.h" -#include "distributed/version_compat.h" -#include "distributed/worker_protocol.h" -#include "distributed/worker_transaction.h" +#include "nodes/makefuncs.h" #include "optimizer/clauses.h" #include "optimizer/optimizer.h" #include "optimizer/restrictinfo.h" -#include "nodes/makefuncs.h" #include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/datum.h" @@ -55,6 +32,29 @@ #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "pg_version_constants.h" + +#include "distributed/citus_clauses.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distributed_planner.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_server_executor.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/resource_lock.h" +#include "distributed/shard_pruning.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" +#include "distributed/worker_transaction.h" + PG_FUNCTION_INFO_V1(master_modify_multiple_shards); diff --git a/src/backend/distributed/operations/node_protocol.c b/src/backend/distributed/operations/node_protocol.c index eeaf34321..52e44bea0 100644 --- a/src/backend/distributed/operations/node_protocol.c +++ b/src/backend/distributed/operations/node_protocol.c @@ -11,17 +11,15 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" +#include -#include "pg_version_constants.h" +#include "postgres.h" #include "c.h" #include "fmgr.h" #include "funcapi.h" #include "miscadmin.h" -#include - #include "access/attnum.h" #include "access/genam.h" #include "access/heapam.h" @@ -37,20 +35,9 @@ #include "catalog/pg_class.h" #include "catalog/pg_constraint.h" #include "catalog/pg_index.h" -#include "catalog/pg_type.h" #include "catalog/pg_namespace.h" +#include "catalog/pg_type.h" #include "commands/sequence.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands.h" -#include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/namespace_utils.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/shared_library_init.h" -#include "distributed/version_compat.h" -#include "distributed/worker_manager.h" #include "foreign/foreign.h" #include "lib/stringinfo.h" #include "nodes/pg_list.h" @@ -65,6 +52,20 @@ #include "utils/ruleutils.h" #include "utils/varlena.h" +#include "pg_version_constants.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/namespace_utils.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/shared_library_init.h" +#include "distributed/version_compat.h" +#include "distributed/worker_manager.h" + /* Shard related configuration */ int ShardCount = 32; int ShardReplicationFactor = 1; /* desired replication factor for shards */ diff --git a/src/backend/distributed/operations/partitioning.c b/src/backend/distributed/operations/partitioning.c index 9e2057927..afcaa8ac1 100644 --- a/src/backend/distributed/operations/partitioning.c +++ b/src/backend/distributed/operations/partitioning.c @@ -9,13 +9,12 @@ */ #include "postgres.h" + #include "fmgr.h" #include "funcapi.h" #include "access/htup.h" #include "access/htup_details.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_utility.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" #include "utils/builtins.h" @@ -23,6 +22,9 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" + /* exports for SQL callable functions */ PG_FUNCTION_INFO_V1(time_partition_range); diff --git a/src/backend/distributed/operations/replicate_none_dist_table_shard.c b/src/backend/distributed/operations/replicate_none_dist_table_shard.c index c28490367..33a98ee42 100644 --- a/src/backend/distributed/operations/replicate_none_dist_table_shard.c +++ b/src/backend/distributed/operations/replicate_none_dist_table_shard.c @@ -10,7 +10,9 @@ */ #include "postgres.h" + #include "miscadmin.h" + #include "nodes/pg_list.h" #include "distributed/adaptive_executor.h" diff --git a/src/backend/distributed/operations/shard_cleaner.c b/src/backend/distributed/operations/shard_cleaner.c index 42877bf10..790414530 100644 --- a/src/backend/distributed/operations/shard_cleaner.c +++ b/src/backend/distributed/operations/shard_cleaner.c @@ -10,27 +10,29 @@ */ #include "postgres.h" + #include "miscadmin.h" + #include "access/genam.h" #include "access/xact.h" #include "catalog/namespace.h" #include "commands/dbcommands.h" #include "commands/sequence.h" -#include "postmaster/postmaster.h" #include "nodes/makefuncs.h" +#include "postmaster/postmaster.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "distributed/citus_safe_lib.h" -#include "distributed/listutils.h" #include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" #include "distributed/metadata_cache.h" -#include "distributed/shard_cleaner.h" -#include "distributed/shard_rebalancer.h" +#include "distributed/pg_dist_cleanup.h" #include "distributed/remote_commands.h" #include "distributed/resource_lock.h" +#include "distributed/shard_cleaner.h" +#include "distributed/shard_rebalancer.h" #include "distributed/worker_transaction.h" -#include "distributed/pg_dist_cleanup.h" #define REPLICATION_SLOT_CATALOG_TABLE_NAME "pg_replication_slots" #define STR_ERRCODE_OBJECT_IN_USE "55006" diff --git a/src/backend/distributed/operations/shard_rebalancer.c b/src/backend/distributed/operations/shard_rebalancer.c index 213d135e6..d1868d3c4 100644 --- a/src/backend/distributed/operations/shard_rebalancer.c +++ b/src/backend/distributed/operations/shard_rebalancer.c @@ -12,30 +12,47 @@ */ -#include "postgres.h" -#include "libpq-fe.h" - #include +#include "postgres.h" + +#include "funcapi.h" +#include "libpq-fe.h" +#include "miscadmin.h" + +#include "access/genam.h" +#include "access/htup_details.h" +#include "catalog/pg_proc.h" +#include "catalog/pg_type.h" +#include "commands/dbcommands.h" +#include "commands/sequence.h" +#include "common/hashfn.h" +#include "postmaster/postmaster.h" +#include "storage/lmgr.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/guc_tables.h" +#include "utils/json.h" +#include "utils/lsyscache.h" +#include "utils/memutils.h" +#include "utils/pg_lsn.h" +#include "utils/syscache.h" +#include "utils/varlena.h" + #include "pg_version_constants.h" -#include "access/htup_details.h" -#include "access/genam.h" -#include "catalog/pg_type.h" -#include "catalog/pg_proc.h" -#include "commands/dbcommands.h" -#include "commands/sequence.h" #include "distributed/argutils.h" #include "distributed/background_jobs.h" -#include "distributed/citus_safe_lib.h" #include "distributed/citus_ruleutils.h" +#include "distributed/citus_safe_lib.h" #include "distributed/colocation_utils.h" +#include "distributed/commands/utility_hook.h" #include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" #include "distributed/enterprise.h" #include "distributed/hash_helpers.h" #include "distributed/listutils.h" #include "distributed/lock_graph.h" -#include "distributed/coordinator_protocol.h" #include "distributed/metadata_cache.h" #include "distributed/metadata_utility.h" #include "distributed/multi_logical_replication.h" @@ -45,27 +62,12 @@ #include "distributed/reference_table_utils.h" #include "distributed/remote_commands.h" #include "distributed/resource_lock.h" -#include "distributed/shard_rebalancer.h" #include "distributed/shard_cleaner.h" +#include "distributed/shard_rebalancer.h" #include "distributed/shard_transfer.h" #include "distributed/tuplestore.h" #include "distributed/utils/array_type.h" #include "distributed/worker_protocol.h" -#include "funcapi.h" -#include "miscadmin.h" -#include "postmaster/postmaster.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/json.h" -#include "utils/lsyscache.h" -#include "utils/memutils.h" -#include "utils/pg_lsn.h" -#include "utils/syscache.h" -#include "common/hashfn.h" -#include "utils/varlena.h" -#include "utils/guc_tables.h" -#include "distributed/commands/utility_hook.h" /* RebalanceOptions are the options used to control the rebalance algorithm */ typedef struct RebalanceOptions diff --git a/src/backend/distributed/operations/shard_split.c b/src/backend/distributed/operations/shard_split.c index 0772b03b4..cf9f301b7 100644 --- a/src/backend/distributed/operations/shard_split.c +++ b/src/backend/distributed/operations/shard_split.c @@ -10,41 +10,43 @@ */ #include "postgres.h" + #include "miscadmin.h" + +#include "commands/dbcommands.h" #include "common/hashfn.h" -#include "nodes/pg_list.h" -#include "utils/array.h" -#include "distributed/utils/array_type.h" #include "lib/stringinfo.h" +#include "nodes/pg_list.h" +#include "postmaster/postmaster.h" +#include "utils/array.h" #include "utils/builtins.h" #include "utils/lsyscache.h" -#include "distributed/shared_library_init.h" + #include "distributed/adaptive_executor.h" #include "distributed/colocation_utils.h" +#include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparse_shard_query.h" #include "distributed/hash_helpers.h" #include "distributed/metadata_cache.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/connection_management.h" -#include "distributed/remote_commands.h" -#include "distributed/shard_split.h" -#include "distributed/reference_table_utils.h" -#include "distributed/shard_transfer.h" -#include "distributed/resource_lock.h" +#include "distributed/metadata_sync.h" #include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/reference_table_utils.h" +#include "distributed/remote_commands.h" +#include "distributed/resource_lock.h" +#include "distributed/shard_cleaner.h" +#include "distributed/shard_rebalancer.h" +#include "distributed/shard_split.h" +#include "distributed/shard_transfer.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/shardsplit_logical_replication.h" +#include "distributed/shared_library_init.h" +#include "distributed/utils/array_type.h" +#include "distributed/utils/distribution_column_map.h" #include "distributed/worker_manager.h" #include "distributed/worker_transaction.h" -#include "distributed/shard_cleaner.h" -#include "distributed/shared_library_init.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/utils/distribution_column_map.h" -#include "commands/dbcommands.h" -#include "distributed/shardsplit_logical_replication.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/shard_rebalancer.h" -#include "postmaster/postmaster.h" /* * Entry for map that tracks ShardInterval -> Placement Node diff --git a/src/backend/distributed/operations/shard_transfer.c b/src/backend/distributed/operations/shard_transfer.c index 79895cc3d..7d6747caf 100644 --- a/src/backend/distributed/operations/shard_transfer.c +++ b/src/backend/distributed/operations/shard_transfer.c @@ -9,27 +9,39 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "fmgr.h" -#include "miscadmin.h" - #include #include +#include "postgres.h" + +#include "fmgr.h" +#include "miscadmin.h" + #include "access/htup_details.h" #include "catalog/pg_class.h" #include "catalog/pg_enum.h" +#include "lib/stringinfo.h" +#include "nodes/pg_list.h" +#include "storage/lmgr.h" +#include "storage/lock.h" +#include "utils/builtins.h" +#include "utils/elog.h" +#include "utils/errcodes.h" +#include "utils/lsyscache.h" +#include "utils/palloc.h" +#include "utils/rel.h" +#include "utils/syscache.h" + #include "distributed/adaptive_executor.h" #include "distributed/backend_data.h" #include "distributed/citus_ruleutils.h" #include "distributed/colocation_utils.h" #include "distributed/commands.h" #include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" #include "distributed/deparse_shard_query.h" #include "distributed/distributed_planner.h" #include "distributed/listutils.h" -#include "distributed/shard_cleaner.h" -#include "distributed/coordinator_protocol.h" #include "distributed/metadata_cache.h" #include "distributed/metadata_sync.h" #include "distributed/multi_join_order.h" @@ -39,24 +51,13 @@ #include "distributed/reference_table_utils.h" #include "distributed/remote_commands.h" #include "distributed/resource_lock.h" +#include "distributed/shard_cleaner.h" #include "distributed/shard_rebalancer.h" #include "distributed/shard_split.h" #include "distributed/shard_transfer.h" #include "distributed/worker_manager.h" #include "distributed/worker_protocol.h" #include "distributed/worker_transaction.h" -#include "lib/stringinfo.h" -#include "nodes/pg_list.h" -#include "storage/lmgr.h" -#include "storage/lock.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" -#include "utils/elog.h" -#include "utils/errcodes.h" -#include "utils/lsyscache.h" -#include "utils/palloc.h" -#include "utils/rel.h" -#include "utils/syscache.h" /* local type declarations */ diff --git a/src/backend/distributed/operations/stage_protocol.c b/src/backend/distributed/operations/stage_protocol.c index 421593c66..5770d648e 100644 --- a/src/backend/distributed/operations/stage_protocol.c +++ b/src/backend/distributed/operations/stage_protocol.c @@ -15,31 +15,40 @@ */ #include "postgres.h" + #include "funcapi.h" -#include "miscadmin.h" #include "libpq-fe.h" +#include "miscadmin.h" #include "access/htup_details.h" #include "access/xact.h" -#include "commands/tablecmds.h" #include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/partition.h" +#include "commands/tablecmds.h" +#include "storage/lmgr.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/inval.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" +#include "utils/syscache.h" + +#include "distributed/adaptive_executor.h" #include "distributed/citus_ruleutils.h" #include "distributed/colocation_utils.h" #include "distributed/commands.h" -#include "distributed/adaptive_executor.h" #include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" #include "distributed/deparse_shard_query.h" #include "distributed/distributed_planner.h" #include "distributed/foreign_key_relationship.h" #include "distributed/hash_helpers.h" #include "distributed/listutils.h" #include "distributed/lock_graph.h" -#include "distributed/multi_executor.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" #include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" #include "distributed/multi_join_order.h" #include "distributed/multi_partitioning_utils.h" #include "distributed/pg_dist_partition.h" @@ -50,16 +59,9 @@ #include "distributed/remote_commands.h" #include "distributed/resource_lock.h" #include "distributed/transaction_management.h" +#include "distributed/version_compat.h" #include "distributed/worker_manager.h" #include "distributed/worker_protocol.h" -#include "distributed/version_compat.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/inval.h" -#include "utils/lsyscache.h" -#include "utils/syscache.h" -#include "utils/rel.h" /* Local functions forward declarations */ diff --git a/src/backend/distributed/operations/worker_copy_table_to_node_udf.c b/src/backend/distributed/operations/worker_copy_table_to_node_udf.c index f0f83744d..c603de72a 100644 --- a/src/backend/distributed/operations/worker_copy_table_to_node_udf.c +++ b/src/backend/distributed/operations/worker_copy_table_to_node_udf.c @@ -15,6 +15,7 @@ #include "utils/builtins.h" #include "utils/lsyscache.h" + #include "distributed/citus_ruleutils.h" #include "distributed/metadata_cache.h" #include "distributed/multi_executor.h" diff --git a/src/backend/distributed/operations/worker_node_manager.c b/src/backend/distributed/operations/worker_node_manager.c index e616770dd..ba622e4d7 100644 --- a/src/backend/distributed/operations/worker_node_manager.c +++ b/src/backend/distributed/operations/worker_node_manager.c @@ -12,16 +12,13 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "commands/dbcommands.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/hash_helpers.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/worker_manager.h" -#include "libpq/hba.h" +#include "common/hashfn.h" #include "common/ip.h" +#include "libpq/hba.h" #include "libpq/libpq-be.h" #include "postmaster/postmaster.h" #include "storage/fd.h" @@ -31,7 +28,12 @@ #include "utils/guc.h" #include "utils/hsearch.h" #include "utils/memutils.h" -#include "common/hashfn.h" + +#include "distributed/coordinator_protocol.h" +#include "distributed/hash_helpers.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/worker_manager.h" /* Config variables managed via guc.c */ diff --git a/src/backend/distributed/operations/worker_shard_copy.c b/src/backend/distributed/operations/worker_shard_copy.c index ba65635a7..f99c9b537 100644 --- a/src/backend/distributed/operations/worker_shard_copy.c +++ b/src/backend/distributed/operations/worker_shard_copy.c @@ -8,23 +8,26 @@ *------------------------------------------------------------------------- */ -#include "libpq-fe.h" #include "postgres.h" + +#include "libpq-fe.h" + #include "commands/copy.h" #include "nodes/makefuncs.h" #include "parser/parse_relation.h" -#include "utils/lsyscache.h" #include "utils/builtins.h" -#include "distributed/remote_commands.h" -#include "distributed/worker_shard_copy.h" +#include "utils/lsyscache.h" + #include "distributed/commands/multi_copy.h" -#include "distributed/local_multi_copy.h" -#include "distributed/worker_manager.h" #include "distributed/connection_management.h" -#include "distributed/relation_utils.h" -#include "distributed/version_compat.h" #include "distributed/local_executor.h" +#include "distributed/local_multi_copy.h" +#include "distributed/relation_utils.h" +#include "distributed/remote_commands.h" #include "distributed/replication_origin_session_utils.h" +#include "distributed/version_compat.h" +#include "distributed/worker_manager.h" +#include "distributed/worker_shard_copy.h" /* * LocalCopyBuffer is used in copy callback to return the copied rows. diff --git a/src/backend/distributed/operations/worker_split_copy_udf.c b/src/backend/distributed/operations/worker_split_copy_udf.c index 18fdbfc4a..03354ea04 100644 --- a/src/backend/distributed/operations/worker_split_copy_udf.c +++ b/src/backend/distributed/operations/worker_split_copy_udf.c @@ -8,7 +8,13 @@ */ #include "postgres.h" + +#include "utils/array.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" + #include "pg_version_compat.h" + #include "distributed/citus_ruleutils.h" #include "distributed/distribution_column.h" #include "distributed/intermediate_results.h" @@ -16,9 +22,6 @@ #include "distributed/multi_executor.h" #include "distributed/utils/array_type.h" #include "distributed/worker_shard_copy.h" -#include "utils/lsyscache.h" -#include "utils/array.h" -#include "utils/builtins.h" PG_FUNCTION_INFO_V1(worker_split_copy); diff --git a/src/backend/distributed/operations/worker_split_shard_release_dsm_udf.c b/src/backend/distributed/operations/worker_split_shard_release_dsm_udf.c index 94ce40cdb..7f3f3ff7a 100644 --- a/src/backend/distributed/operations/worker_split_shard_release_dsm_udf.c +++ b/src/backend/distributed/operations/worker_split_shard_release_dsm_udf.c @@ -9,6 +9,7 @@ *------------------------------------------------------------------------- */ #include "postgres.h" + #include "distributed/shardinterval_utils.h" #include "distributed/shardsplit_shared_memory.h" diff --git a/src/backend/distributed/operations/worker_split_shard_replication_setup_udf.c b/src/backend/distributed/operations/worker_split_shard_replication_setup_udf.c index 4d116dfa1..d4775995c 100644 --- a/src/backend/distributed/operations/worker_split_shard_replication_setup_udf.c +++ b/src/backend/distributed/operations/worker_split_shard_replication_setup_udf.c @@ -9,24 +9,27 @@ *------------------------------------------------------------------------- */ #include "postgres.h" + #include "miscadmin.h" -#include "postmaster/postmaster.h" + +#include "commands/dbcommands.h" #include "common/hashfn.h" -#include "distributed/distribution_column.h" -#include "distributed/hash_helpers.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/shard_cleaner.h" -#include "distributed/shard_utils.h" -#include "distributed/shardsplit_shared_memory.h" -#include "distributed/connection_management.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/listutils.h" -#include "distributed/remote_commands.h" -#include "distributed/tuplestore.h" -#include "distributed/shardsplit_logical_replication.h" +#include "postmaster/postmaster.h" #include "utils/builtins.h" #include "utils/lsyscache.h" -#include "commands/dbcommands.h" + +#include "distributed/citus_safe_lib.h" +#include "distributed/connection_management.h" +#include "distributed/distribution_column.h" +#include "distributed/hash_helpers.h" +#include "distributed/listutils.h" +#include "distributed/remote_commands.h" +#include "distributed/shard_cleaner.h" +#include "distributed/shard_utils.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/shardsplit_logical_replication.h" +#include "distributed/shardsplit_shared_memory.h" +#include "distributed/tuplestore.h" /* declarations for dynamic loading */ diff --git a/src/backend/distributed/planner/combine_query_planner.c b/src/backend/distributed/planner/combine_query_planner.c index 6a171dac1..e3aa7b3e6 100644 --- a/src/backend/distributed/planner/combine_query_planner.c +++ b/src/backend/distributed/planner/combine_query_planner.c @@ -11,21 +11,22 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "catalog/pg_type.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/insert_select_planner.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/combine_query_planner.h" -#include "distributed/multi_physical_planner.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/clauses.h" #include "optimizer/planner.h" #include "rewrite/rewriteManip.h" +#include "pg_version_constants.h" + +#include "distributed/citus_ruleutils.h" +#include "distributed/combine_query_planner.h" +#include "distributed/insert_select_planner.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_physical_planner.h" + static List * RemoteScanTargetList(List *workerTargetList); static PlannedStmt * BuildSelectStatementViaStdPlanner(Query *combineQuery, List *remoteScanTargetList, diff --git a/src/backend/distributed/planner/cte_inline.c b/src/backend/distributed/planner/cte_inline.c index 9a1bbab96..d6f88525c 100644 --- a/src/backend/distributed/planner/cte_inline.c +++ b/src/backend/distributed/planner/cte_inline.c @@ -12,13 +12,15 @@ *------------------------------------------------------------------------- */ #include "postgres.h" + +#include "nodes/nodeFuncs.h" +#include "optimizer/optimizer.h" +#include "rewrite/rewriteManip.h" + #include "pg_version_compat.h" #include "pg_version_constants.h" #include "distributed/cte_inline.h" -#include "nodes/nodeFuncs.h" -#include "optimizer/optimizer.h" -#include "rewrite/rewriteManip.h" typedef struct inline_cte_walker_context { diff --git a/src/backend/distributed/planner/deparse_shard_query.c b/src/backend/distributed/planner/deparse_shard_query.c index ac37b1399..43b5f1493 100644 --- a/src/backend/distributed/planner/deparse_shard_query.c +++ b/src/backend/distributed/planner/deparse_shard_query.c @@ -10,11 +10,24 @@ */ #include "postgres.h" + #include "c.h" #include "access/heapam.h" #include "access/htup_details.h" #include "catalog/pg_constraint.h" +#include "lib/stringinfo.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "nodes/nodes.h" +#include "nodes/parsenodes.h" +#include "nodes/pg_list.h" +#include "parser/parsetree.h" +#include "storage/lock.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" +#include "utils/syscache.h" + #include "distributed/citus_nodefuncs.h" #include "distributed/citus_ruleutils.h" #include "distributed/combine_query_planner.h" @@ -28,17 +41,6 @@ #include "distributed/shard_utils.h" #include "distributed/utils/citus_stat_tenants.h" #include "distributed/version_compat.h" -#include "lib/stringinfo.h" -#include "nodes/makefuncs.h" -#include "nodes/nodeFuncs.h" -#include "nodes/nodes.h" -#include "nodes/parsenodes.h" -#include "nodes/pg_list.h" -#include "parser/parsetree.h" -#include "storage/lock.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" -#include "utils/syscache.h" static void UpdateTaskQueryString(Query *query, Task *task); diff --git a/src/backend/distributed/planner/distributed_planner.c b/src/backend/distributed/planner/distributed_planner.c index 7ad419f0a..1d6550afd 100644 --- a/src/backend/distributed/planner/distributed_planner.c +++ b/src/backend/distributed/planner/distributed_planner.c @@ -7,71 +7,73 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - -#include "pg_version_constants.h" - -#include "funcapi.h" - #include #include +#include "postgres.h" + +#include "funcapi.h" + #include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_class.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "distributed/citus_depended_object.h" -#include "distributed/citus_nodefuncs.h" -#include "distributed/citus_nodes.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include "distributed/cte_inline.h" -#include "distributed/function_call_delegation.h" -#include "distributed/insert_select_planner.h" -#include "distributed/intermediate_result_pruning.h" -#include "distributed/intermediate_results.h" -#include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/merge_planner.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_executor.h" -#include "distributed/distributed_planner.h" -#include "distributed/query_pushdown_planning.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/combine_query_planner.h" -#include "distributed/multi_router_planner.h" -#include "distributed/query_utils.h" -#include "distributed/recursive_planning.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/shard_utils.h" -#include "distributed/utils/citus_stat_tenants.h" -#include "distributed/version_compat.h" -#include "distributed/worker_shard_visibility.h" #include "executor/executor.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/pg_list.h" -#if PG_VERSION_NUM >= PG_VERSION_16 -#include "parser/parse_relation.h" -#endif -#include "parser/parsetree.h" -#include "parser/parse_type.h" #include "optimizer/optimizer.h" -#include "optimizer/plancat.h" #include "optimizer/pathnode.h" -#include "optimizer/planner.h" +#include "optimizer/plancat.h" #include "optimizer/planmain.h" +#include "optimizer/planner.h" +#include "parser/parse_type.h" +#include "parser/parsetree.h" #include "utils/builtins.h" #include "utils/datum.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/syscache.h" +#include "pg_version_constants.h" + +#include "distributed/citus_depended_object.h" +#include "distributed/citus_nodefuncs.h" +#include "distributed/citus_nodes.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" +#include "distributed/combine_query_planner.h" +#include "distributed/commands.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/cte_inline.h" +#include "distributed/distributed_planner.h" +#include "distributed/function_call_delegation.h" +#include "distributed/insert_select_planner.h" +#include "distributed/intermediate_result_pruning.h" +#include "distributed/intermediate_results.h" +#include "distributed/listutils.h" +#include "distributed/merge_planner.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/query_pushdown_planning.h" +#include "distributed/query_utils.h" +#include "distributed/recursive_planning.h" +#include "distributed/shard_utils.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/utils/citus_stat_tenants.h" +#include "distributed/version_compat.h" +#include "distributed/worker_shard_visibility.h" + +#if PG_VERSION_NUM >= PG_VERSION_16 +#include "parser/parse_relation.h" +#endif + /* RouterPlanType is used to determine the router plan to invoke */ typedef enum RouterPlanType diff --git a/src/backend/distributed/planner/extended_op_node_utils.c b/src/backend/distributed/planner/extended_op_node_utils.c index bb87b6949..7912de1d9 100644 --- a/src/backend/distributed/planner/extended_op_node_utils.c +++ b/src/backend/distributed/planner/extended_op_node_utils.c @@ -9,6 +9,12 @@ */ #include "postgres.h" + +#include "nodes/nodeFuncs.h" +#include "nodes/pg_list.h" +#include "optimizer/optimizer.h" +#include "optimizer/restrictinfo.h" + #include "pg_version_constants.h" #include "distributed/extended_op_node_utils.h" @@ -16,10 +22,6 @@ #include "distributed/metadata_cache.h" #include "distributed/multi_logical_optimizer.h" #include "distributed/pg_dist_partition.h" -#include "optimizer/optimizer.h" -#include "optimizer/restrictinfo.h" -#include "nodes/nodeFuncs.h" -#include "nodes/pg_list.h" static bool GroupedByPartitionColumn(MultiNode *node, MultiExtendedOp *opNode); diff --git a/src/backend/distributed/planner/fast_path_router_planner.c b/src/backend/distributed/planner/fast_path_router_planner.c index 1d58911eb..531075f9e 100644 --- a/src/backend/distributed/planner/fast_path_router_planner.c +++ b/src/backend/distributed/planner/fast_path_router_planner.c @@ -34,16 +34,6 @@ */ #include "postgres.h" -#include "pg_version_constants.h" - -#include "distributed/distributed_planner.h" -#include "distributed/insert_select_planner.h" -#include "distributed/multi_physical_planner.h" /* only to use some utility functions */ -#include "distributed/metadata_cache.h" -#include "distributed/multi_router_planner.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/shard_pruning.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/parsenodes.h" @@ -51,6 +41,17 @@ #include "optimizer/optimizer.h" #include "tcop/pquery.h" +#include "pg_version_constants.h" + +#include "distributed/distributed_planner.h" +#include "distributed/insert_select_planner.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_physical_planner.h" /* only to use some utility functions */ +#include "distributed/multi_router_planner.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/shard_pruning.h" +#include "distributed/shardinterval_utils.h" + bool EnableFastPathRouterPlanner = true; static bool ColumnAppearsMultipleTimes(Node *quals, Var *distributionKey); diff --git a/src/backend/distributed/planner/function_call_delegation.c b/src/backend/distributed/planner/function_call_delegation.c index bacbe16af..f17b02347 100644 --- a/src/backend/distributed/planner/function_call_delegation.c +++ b/src/backend/distributed/planner/function_call_delegation.c @@ -12,32 +12,11 @@ #include "postgres.h" -#include "pg_version_constants.h" +#include "miscadmin.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/defrem.h" -#include "distributed/backend_data.h" -#include "distributed/metadata_utility.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include "distributed/commands/multi_copy.h" -#include "distributed/connection_management.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/function_call_delegation.h" -#include "distributed/insert_select_planner.h" -#include "distributed/citus_custom_scan.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/remote_commands.h" -#include "distributed/shard_pruning.h" -#include "distributed/recursive_planning.h" -#include "distributed/version_compat.h" -#include "distributed/worker_manager.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/parsenodes.h" @@ -46,11 +25,34 @@ #include "optimizer/clauses.h" #include "parser/parse_coerce.h" #include "parser/parsetree.h" -#include "miscadmin.h" #include "tcop/dest.h" #include "utils/lsyscache.h" #include "utils/syscache.h" +#include "pg_version_constants.h" + +#include "distributed/backend_data.h" +#include "distributed/citus_custom_scan.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/commands/multi_copy.h" +#include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparse_shard_query.h" +#include "distributed/function_call_delegation.h" +#include "distributed/insert_select_planner.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/recursive_planning.h" +#include "distributed/remote_commands.h" +#include "distributed/shard_pruning.h" +#include "distributed/version_compat.h" +#include "distributed/worker_manager.h" + struct ParamWalkerContext { bool hasParam; diff --git a/src/backend/distributed/planner/insert_select_planner.c b/src/backend/distributed/planner/insert_select_planner.c index dd4bee90f..60d6ce466 100644 --- a/src/backend/distributed/planner/insert_select_planner.c +++ b/src/backend/distributed/planner/insert_select_planner.c @@ -10,22 +10,39 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "catalog/pg_class.h" #include "catalog/pg_type.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "nodes/parsenodes.h" +#include "nodes/print.h" +#include "optimizer/clauses.h" +#include "optimizer/optimizer.h" +#include "optimizer/planner.h" +#include "optimizer/restrictinfo.h" +#include "optimizer/tlist.h" +#include "parser/parse_coerce.h" +#include "parser/parse_relation.h" +#include "parser/parsetree.h" +#include "tcop/tcopprot.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" + +#include "pg_version_constants.h" + #include "distributed/citus_clauses.h" #include "distributed/citus_ruleutils.h" #include "distributed/colocation_utils.h" #include "distributed/errormessage.h" -#include "distributed/listutils.h" -#include "distributed/log_utils.h" #include "distributed/insert_select_executor.h" #include "distributed/insert_select_planner.h" +#include "distributed/listutils.h" +#include "distributed/log_utils.h" #include "distributed/metadata_cache.h" #include "distributed/multi_executor.h" -#include "distributed/multi_logical_planner.h" #include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" #include "distributed/multi_physical_planner.h" #include "distributed/multi_router_planner.h" #include "distributed/pg_dist_partition.h" @@ -34,22 +51,6 @@ #include "distributed/repartition_executor.h" #include "distributed/resource_lock.h" #include "distributed/version_compat.h" -#include "nodes/makefuncs.h" -#include "nodes/nodeFuncs.h" -#include "nodes/parsenodes.h" -#include "optimizer/clauses.h" -#include "optimizer/planner.h" -#include "optimizer/restrictinfo.h" -#include "optimizer/tlist.h" -#include "optimizer/optimizer.h" -#include "parser/parsetree.h" -#include "parser/parse_coerce.h" -#include "parser/parse_relation.h" -#include "tcop/tcopprot.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" -#include static void PrepareInsertSelectForCitusPlanner(Query *insertSelectQuery); diff --git a/src/backend/distributed/planner/intermediate_result_pruning.c b/src/backend/distributed/planner/intermediate_result_pruning.c index cefbfb833..5c9ee6c43 100644 --- a/src/backend/distributed/planner/intermediate_result_pruning.c +++ b/src/backend/distributed/planner/intermediate_result_pruning.c @@ -11,6 +11,10 @@ * *------------------------------------------------------------------------- */ +#include "postgres.h" + +#include "common/hashfn.h" +#include "utils/builtins.h" #include "distributed/citus_custom_scan.h" #include "distributed/citus_ruleutils.h" @@ -20,8 +24,6 @@ #include "distributed/metadata_cache.h" #include "distributed/query_utils.h" #include "distributed/worker_manager.h" -#include "utils/builtins.h" -#include "common/hashfn.h" /* controlled via GUC, used mostly for testing */ bool LogIntermediateResults = false; diff --git a/src/backend/distributed/planner/local_distributed_join_planner.c b/src/backend/distributed/planner/local_distributed_join_planner.c index 1867a790c..a6502bf43 100644 --- a/src/backend/distributed/planner/local_distributed_join_planner.c +++ b/src/backend/distributed/planner/local_distributed_join_planner.c @@ -71,55 +71,53 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "funcapi.h" -#include "catalog/pg_type.h" #include "catalog/pg_class.h" #include "catalog/pg_index.h" -#include "distributed/citus_nodes.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands.h" -#include "distributed/commands/multi_copy.h" -#include "distributed/distributed_planner.h" -#include "distributed/errormessage.h" -#include "distributed/local_distributed_join_planner.h" -#include "distributed/listutils.h" -#include "distributed/log_utils.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/multi_router_planner.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/multi_server_executor.h" -#include "distributed/multi_router_planner.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/query_colocation_checker.h" -#include "distributed/query_pushdown_planning.h" -#include "distributed/recursive_planning.h" -#include "distributed/relation_restriction_equivalence.h" -#include "distributed/log_utils.h" -#include "distributed/shard_pruning.h" -#include "distributed/version_compat.h" +#include "catalog/pg_type.h" #include "lib/stringinfo.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "nodes/nodes.h" +#include "nodes/pathnodes.h" +#include "nodes/pg_list.h" +#include "nodes/primnodes.h" #include "optimizer/clauses.h" #include "optimizer/optimizer.h" #include "optimizer/planner.h" #include "optimizer/prep.h" #include "parser/parse_relation.h" #include "parser/parsetree.h" -#include "nodes/makefuncs.h" -#include "nodes/nodeFuncs.h" -#include "nodes/nodes.h" -#include "nodes/nodeFuncs.h" -#include "nodes/pg_list.h" -#include "nodes/primnodes.h" -#include "nodes/pathnodes.h" #include "utils/builtins.h" #include "utils/guc.h" #include "utils/lsyscache.h" +#include "pg_version_constants.h" + +#include "distributed/citus_nodes.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/commands.h" +#include "distributed/commands/multi_copy.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distributed_planner.h" +#include "distributed/errormessage.h" +#include "distributed/listutils.h" +#include "distributed/local_distributed_join_planner.h" +#include "distributed/log_utils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/multi_server_executor.h" +#include "distributed/query_colocation_checker.h" +#include "distributed/query_pushdown_planning.h" +#include "distributed/recursive_planning.h" +#include "distributed/relation_restriction_equivalence.h" +#include "distributed/shard_pruning.h" +#include "distributed/version_compat.h" + #define INVALID_RTE_IDENTITY -1 /* diff --git a/src/backend/distributed/planner/local_plan_cache.c b/src/backend/distributed/planner/local_plan_cache.c index 1ac8e24a3..2e5ca4e55 100644 --- a/src/backend/distributed/planner/local_plan_cache.c +++ b/src/backend/distributed/planner/local_plan_cache.c @@ -9,19 +9,20 @@ */ #include "postgres.h" +#include "optimizer/clauses.h" +#include "optimizer/optimizer.h" + #include "pg_version_constants.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/deparse_shard_query.h" +#include "distributed/insert_select_planner.h" #include "distributed/listutils.h" #include "distributed/local_executor.h" #include "distributed/local_plan_cache.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/insert_select_planner.h" #include "distributed/metadata_cache.h" #include "distributed/multi_executor.h" #include "distributed/version_compat.h" -#include "optimizer/optimizer.h" -#include "optimizer/clauses.h" static Query * GetLocalShardQueryForCache(Query *jobQuery, Task *task, diff --git a/src/backend/distributed/planner/merge_planner.c b/src/backend/distributed/planner/merge_planner.c index 5c593d153..4d64b8f56 100644 --- a/src/backend/distributed/planner/merge_planner.c +++ b/src/backend/distributed/planner/merge_planner.c @@ -12,6 +12,7 @@ #include #include "postgres.h" + #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" @@ -20,6 +21,8 @@ #include "tcop/tcopprot.h" #include "utils/lsyscache.h" +#include "pg_version_constants.h" + #include "distributed/citus_clauses.h" #include "distributed/citus_custom_scan.h" #include "distributed/insert_select_planner.h" @@ -29,12 +32,11 @@ #include "distributed/multi_logical_optimizer.h" #include "distributed/multi_router_planner.h" #include "distributed/pg_dist_node_metadata.h" -#include "pg_version_constants.h" -#include "distributed/query_pushdown_planning.h" #include "distributed/query_colocation_checker.h" +#include "distributed/query_pushdown_planning.h" #include "distributed/repartition_executor.h" -#include "distributed/shared_library_init.h" #include "distributed/shard_pruning.h" +#include "distributed/shared_library_init.h" #if PG_VERSION_NUM >= PG_VERSION_15 diff --git a/src/backend/distributed/planner/multi_explain.c b/src/backend/distributed/planner/multi_explain.c index bf9a1871e..1d6a88934 100644 --- a/src/backend/distributed/planner/multi_explain.c +++ b/src/backend/distributed/planner/multi_explain.c @@ -8,11 +8,11 @@ */ #include "postgres.h" + +#include "fmgr.h" #include "libpq-fe.h" #include "miscadmin.h" -#include "pg_version_constants.h" - #include "access/htup_details.h" #include "access/xact.h" #include "catalog/namespace.h" @@ -24,41 +24,13 @@ #include "commands/dbcommands.h" #include "commands/explain.h" #include "commands/tablecmds.h" -#include "optimizer/cost.h" -#include "distributed/citus_depended_object.h" -#include "distributed/citus_nodefuncs.h" -#include "distributed/connection_management.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/executor_util.h" -#include "distributed/insert_select_planner.h" -#include "distributed/insert_select_executor.h" -#include "distributed/listutils.h" -#include "distributed/merge_planner.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_explain.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/combine_query_planner.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/multi_router_planner.h" -#include "distributed/distributed_planner.h" -#include "distributed/multi_server_executor.h" -#include "distributed/remote_commands.h" -#include "distributed/recursive_planning.h" -#include "distributed/placement_connection.h" -#include "distributed/tuple_destination.h" -#include "distributed/tuplestore.h" -#include "distributed/worker_protocol.h" -#include "distributed/version_compat.h" -#include "distributed/jsonbutils.h" -#include "distributed/commands/utility_hook.h" #include "executor/tstoreReceiver.h" -#include "fmgr.h" #include "lib/stringinfo.h" #include "nodes/plannodes.h" #include "nodes/primnodes.h" #include "nodes/print.h" #include "optimizer/clauses.h" +#include "optimizer/cost.h" #include "optimizer/planner.h" #include "parser/analyze.h" #include "portability/instr_time.h" @@ -71,6 +43,36 @@ #include "utils/lsyscache.h" #include "utils/snapmgr.h" +#include "pg_version_constants.h" + +#include "distributed/citus_depended_object.h" +#include "distributed/citus_nodefuncs.h" +#include "distributed/combine_query_planner.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/connection_management.h" +#include "distributed/deparse_shard_query.h" +#include "distributed/distributed_planner.h" +#include "distributed/executor_util.h" +#include "distributed/insert_select_executor.h" +#include "distributed/insert_select_planner.h" +#include "distributed/jsonbutils.h" +#include "distributed/listutils.h" +#include "distributed/merge_planner.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_explain.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/multi_server_executor.h" +#include "distributed/placement_connection.h" +#include "distributed/recursive_planning.h" +#include "distributed/remote_commands.h" +#include "distributed/tuple_destination.h" +#include "distributed/tuplestore.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" + /* Config variables that enable printing distributed query plans */ bool ExplainDistributedQueries = true; diff --git a/src/backend/distributed/planner/multi_join_order.c b/src/backend/distributed/planner/multi_join_order.c index 0eede6b9b..908ed206e 100644 --- a/src/backend/distributed/planner/multi_join_order.c +++ b/src/backend/distributed/planner/multi_join_order.c @@ -11,31 +11,31 @@ *------------------------------------------------------------------------- */ +#include + #include "postgres.h" +#include "access/heapam.h" +#include "access/htup_details.h" +#include "access/nbtree.h" +#include "catalog/pg_am.h" +#include "lib/stringinfo.h" +#include "nodes/nodeFuncs.h" +#include "optimizer/optimizer.h" +#include "utils/builtins.h" +#include "utils/datum.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" +#include "utils/syscache.h" + #include "pg_version_constants.h" -#include - -#include "access/nbtree.h" -#include "access/heapam.h" -#include "access/htup_details.h" -#include "catalog/pg_am.h" #include "distributed/listutils.h" #include "distributed/metadata_cache.h" #include "distributed/multi_join_order.h" #include "distributed/multi_physical_planner.h" #include "distributed/pg_dist_partition.h" #include "distributed/worker_protocol.h" -#include "lib/stringinfo.h" -#include "optimizer/optimizer.h" -#include "utils/builtins.h" -#include "nodes/nodeFuncs.h" -#include "utils/builtins.h" -#include "utils/datum.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" -#include "utils/syscache.h" /* Config variables managed via guc.c */ diff --git a/src/backend/distributed/planner/multi_logical_optimizer.c b/src/backend/distributed/planner/multi_logical_optimizer.c index 9001d724d..76e38237a 100644 --- a/src/backend/distributed/planner/multi_logical_optimizer.c +++ b/src/backend/distributed/planner/multi_logical_optimizer.c @@ -11,12 +11,10 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - -#include "pg_version_constants.h" - #include +#include "postgres.h" + #include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" @@ -27,6 +25,23 @@ #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/extension.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "optimizer/clauses.h" +#include "optimizer/optimizer.h" +#include "optimizer/tlist.h" +#include "parser/parse_agg.h" +#include "parser/parse_coerce.h" +#include "parser/parse_oper.h" +#include "parser/parsetree.h" +#include "rewrite/rewriteManip.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" +#include "utils/syscache.h" + +#include "pg_version_constants.h" + #include "distributed/citus_nodes.h" #include "distributed/citus_ruleutils.h" #include "distributed/colocation_utils.h" @@ -42,22 +57,8 @@ #include "distributed/query_pushdown_planning.h" #include "distributed/string_utils.h" #include "distributed/tdigest_extension.h" -#include "distributed/worker_protocol.h" #include "distributed/version_compat.h" -#include "nodes/makefuncs.h" -#include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" -#include "optimizer/tlist.h" -#include "optimizer/optimizer.h" -#include "parser/parse_agg.h" -#include "parser/parse_coerce.h" -#include "parser/parse_oper.h" -#include "parser/parsetree.h" -#include "rewrite/rewriteManip.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" -#include "utils/syscache.h" +#include "distributed/worker_protocol.h" /* Config variable managed via guc.c */ int LimitClauseRowFetchCount = -1; /* number of rows to fetch from each task */ diff --git a/src/backend/distributed/planner/multi_logical_planner.c b/src/backend/distributed/planner/multi_logical_planner.c index d6897d17b..f62e309f2 100644 --- a/src/backend/distributed/planner/multi_logical_planner.c +++ b/src/backend/distributed/planner/multi_logical_planner.c @@ -14,42 +14,43 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "access/heapam.h" #include "access/nbtree.h" #include "catalog/pg_am.h" #include "catalog/pg_class.h" #include "commands/defrem.h" -#include "distributed/citus_clauses.h" -#include "distributed/colocation_utils.h" -#include "distributed/metadata_cache.h" -#include "distributed/insert_select_planner.h" -#include "distributed/listutils.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/reference_table_utils.h" -#include "distributed/relation_restriction_equivalence.h" -#include "distributed/query_pushdown_planning.h" -#include "distributed/query_utils.h" -#include "distributed/multi_router_planner.h" -#include "distributed/worker_protocol.h" -#include "distributed/version_compat.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/pathnodes.h" -#include "optimizer/optimizer.h" #include "optimizer/clauses.h" +#include "optimizer/optimizer.h" #include "optimizer/prep.h" #include "optimizer/tlist.h" #include "parser/parsetree.h" #include "utils/builtins.h" #include "utils/datum.h" #include "utils/lsyscache.h" -#include "utils/syscache.h" #include "utils/rel.h" #include "utils/relcache.h" +#include "utils/syscache.h" + +#include "pg_version_constants.h" + +#include "distributed/citus_clauses.h" +#include "distributed/colocation_utils.h" +#include "distributed/insert_select_planner.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/query_pushdown_planning.h" +#include "distributed/query_utils.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relation_restriction_equivalence.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" /* Struct to differentiate different qualifier types in an expression tree walker */ diff --git a/src/backend/distributed/planner/multi_physical_planner.c b/src/backend/distributed/planner/multi_physical_planner.c index aa2c2b5b4..fb7f844c7 100644 --- a/src/backend/distributed/planner/multi_physical_planner.c +++ b/src/backend/distributed/planner/multi_physical_planner.c @@ -11,13 +11,11 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - -#include "pg_version_constants.h" - #include #include +#include "postgres.h" + #include "miscadmin.h" #include "access/genam.h" @@ -33,39 +31,11 @@ #include "catalog/pg_type.h" #include "commands/defrem.h" #include "commands/sequence.h" -#include "distributed/backend_data.h" -#include "distributed/listutils.h" -#include "distributed/citus_nodefuncs.h" -#include "distributed/citus_nodes.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/colocation_utils.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/intermediate_results.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_router_planner.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/log_utils.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/query_pushdown_planning.h" -#include "distributed/query_utils.h" -#include "distributed/recursive_planning.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/shard_pruning.h" -#include "distributed/string_utils.h" -#include "distributed/worker_manager.h" -#include "distributed/worker_protocol.h" -#include "distributed/version_compat.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" +#include "nodes/pathnodes.h" #include "nodes/print.h" #include "optimizer/clauses.h" -#include "nodes/pathnodes.h" #include "optimizer/optimizer.h" #include "optimizer/restrictinfo.h" #include "optimizer/tlist.h" @@ -84,6 +54,37 @@ #include "utils/syscache.h" #include "utils/typcache.h" +#include "pg_version_constants.h" + +#include "distributed/backend_data.h" +#include "distributed/citus_nodefuncs.h" +#include "distributed/citus_nodes.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparse_shard_query.h" +#include "distributed/intermediate_results.h" +#include "distributed/listutils.h" +#include "distributed/log_utils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/query_pushdown_planning.h" +#include "distributed/query_utils.h" +#include "distributed/recursive_planning.h" +#include "distributed/shard_pruning.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/string_utils.h" +#include "distributed/version_compat.h" +#include "distributed/worker_manager.h" +#include "distributed/worker_protocol.h" + /* RepartitionJoinBucketCountPerNode determines bucket amount during repartitions */ int RepartitionJoinBucketCountPerNode = 4; diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index c0930ca34..620d506a0 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -11,50 +11,15 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - -#include "pg_version_constants.h" - #include +#include "postgres.h" + #include "access/stratnum.h" #include "access/xact.h" #include "catalog/pg_opfamily.h" +#include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "distributed/colocation_utils.h" -#include "distributed/citus_clauses.h" -#include "distributed/citus_nodes.h" -#include "distributed/citus_nodefuncs.h" -#include "distributed/deparse_shard_query.h" -#include "distributed/distribution_column.h" -#include "distributed/errormessage.h" -#include "distributed/executor_util.h" -#include "distributed/log_utils.h" -#include "distributed/insert_select_planner.h" -#include "distributed/intermediate_result_pruning.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/merge_planner.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/multi_router_planner.h" -#include "distributed/multi_server_executor.h" -#include "distributed/listutils.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/query_pushdown_planning.h" -#include "distributed/query_utils.h" -#include "distributed/reference_table_utils.h" -#include "distributed/relation_restriction_equivalence.h" -#include "distributed/relay_utility.h" -#include "distributed/recursive_planning.h" -#include "distributed/resource_lock.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/shard_pruning.h" #include "executor/execdesc.h" #include "lib/stringinfo.h" #include "nodes/makefuncs.h" @@ -65,12 +30,13 @@ #include "nodes/primnodes.h" #include "optimizer/clauses.h" #include "optimizer/joininfo.h" +#include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" -#include "optimizer/optimizer.h" +#include "optimizer/planmain.h" #include "optimizer/restrictinfo.h" -#include "parser/parsetree.h" #include "parser/parse_oper.h" +#include "parser/parsetree.h" #include "postmaster/postmaster.h" #include "storage/lock.h" #include "utils/builtins.h" @@ -80,8 +46,42 @@ #include "utils/rel.h" #include "utils/typcache.h" -#include "catalog/pg_proc.h" -#include "optimizer/planmain.h" +#include "pg_version_constants.h" + +#include "distributed/citus_clauses.h" +#include "distributed/citus_nodefuncs.h" +#include "distributed/citus_nodes.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/colocation_utils.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/deparse_shard_query.h" +#include "distributed/distribution_column.h" +#include "distributed/errormessage.h" +#include "distributed/executor_util.h" +#include "distributed/insert_select_planner.h" +#include "distributed/intermediate_result_pruning.h" +#include "distributed/listutils.h" +#include "distributed/log_utils.h" +#include "distributed/merge_planner.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/multi_server_executor.h" +#include "distributed/query_pushdown_planning.h" +#include "distributed/query_utils.h" +#include "distributed/recursive_planning.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relation_restriction_equivalence.h" +#include "distributed/relay_utility.h" +#include "distributed/resource_lock.h" +#include "distributed/shard_pruning.h" +#include "distributed/shardinterval_utils.h" /* intermediate value for INSERT processing */ typedef struct InsertValues diff --git a/src/backend/distributed/planner/query_colocation_checker.c b/src/backend/distributed/planner/query_colocation_checker.c index fd1df1be9..827a0286c 100644 --- a/src/backend/distributed/planner/query_colocation_checker.c +++ b/src/backend/distributed/planner/query_colocation_checker.c @@ -21,26 +21,26 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "access/relation.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/query_colocation_checker.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/relation_restriction_equivalence.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_logical_planner.h" /* only to access utility functions */ - #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "parser/parsetree.h" -#include "distributed/listutils.h" -#include "parser/parse_relation.h" #include "optimizer/planner.h" #include "optimizer/prep.h" +#include "parser/parse_relation.h" +#include "parser/parsetree.h" #include "utils/rel.h" +#include "pg_version_constants.h" + +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_logical_planner.h" /* only to access utility functions */ +#include "distributed/pg_dist_partition.h" +#include "distributed/query_colocation_checker.h" +#include "distributed/relation_restriction_equivalence.h" + static RangeTblEntry * AnchorRte(Query *subquery); static List * UnionRelationRestrictionLists(List *firstRelationList, diff --git a/src/backend/distributed/planner/query_pushdown_planning.c b/src/backend/distributed/planner/query_pushdown_planning.c index 8ccc35c82..2eda4e42a 100644 --- a/src/backend/distributed/planner/query_pushdown_planning.c +++ b/src/backend/distributed/planner/query_pushdown_planning.c @@ -21,6 +21,13 @@ #include "postgres.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "nodes/pg_list.h" +#include "optimizer/clauses.h" +#include "optimizer/optimizer.h" +#include "parser/parsetree.h" + #include "pg_version_constants.h" #include "distributed/citus_clauses.h" @@ -32,17 +39,11 @@ #include "distributed/multi_logical_planner.h" #include "distributed/multi_router_planner.h" #include "distributed/pg_dist_partition.h" -#include "distributed/query_utils.h" #include "distributed/query_pushdown_planning.h" +#include "distributed/query_utils.h" #include "distributed/recursive_planning.h" #include "distributed/relation_restriction_equivalence.h" #include "distributed/version_compat.h" -#include "nodes/nodeFuncs.h" -#include "nodes/makefuncs.h" -#include "optimizer/optimizer.h" -#include "nodes/pg_list.h" -#include "optimizer/clauses.h" -#include "parser/parsetree.h" #define INVALID_RELID -1 diff --git a/src/backend/distributed/planner/recursive_planning.c b/src/backend/distributed/planner/recursive_planning.c index d16280662..6c42046ff 100644 --- a/src/backend/distributed/planner/recursive_planning.c +++ b/src/backend/distributed/planner/recursive_planning.c @@ -48,51 +48,50 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "funcapi.h" -#include "catalog/pg_type.h" #include "catalog/pg_class.h" -#include "distributed/citus_nodes.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/commands/multi_copy.h" -#include "distributed/distributed_planner.h" -#include "distributed/errormessage.h" -#include "distributed/local_distributed_join_planner.h" -#include "distributed/listutils.h" -#include "distributed/log_utils.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/multi_router_planner.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/multi_server_executor.h" -#include "distributed/query_colocation_checker.h" -#include "distributed/query_pushdown_planning.h" -#include "distributed/recursive_planning.h" -#include "distributed/relation_restriction_equivalence.h" -#include "distributed/log_utils.h" -#include "distributed/shard_pruning.h" -#include "distributed/version_compat.h" +#include "catalog/pg_type.h" #include "lib/stringinfo.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "nodes/nodes.h" +#include "nodes/pathnodes.h" +#include "nodes/pg_list.h" +#include "nodes/primnodes.h" #include "optimizer/clauses.h" #include "optimizer/optimizer.h" #include "optimizer/planner.h" #include "optimizer/prep.h" #include "parser/parse_relation.h" #include "parser/parsetree.h" -#include "nodes/makefuncs.h" -#include "nodes/nodeFuncs.h" -#include "nodes/nodes.h" -#include "nodes/nodeFuncs.h" -#include "nodes/pg_list.h" -#include "nodes/primnodes.h" -#include "nodes/pathnodes.h" #include "utils/builtins.h" #include "utils/guc.h" #include "utils/lsyscache.h" +#include "pg_version_constants.h" + +#include "distributed/citus_nodes.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/commands/multi_copy.h" +#include "distributed/distributed_planner.h" +#include "distributed/errormessage.h" +#include "distributed/listutils.h" +#include "distributed/local_distributed_join_planner.h" +#include "distributed/log_utils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/multi_server_executor.h" +#include "distributed/query_colocation_checker.h" +#include "distributed/query_pushdown_planning.h" +#include "distributed/recursive_planning.h" +#include "distributed/relation_restriction_equivalence.h" +#include "distributed/shard_pruning.h" +#include "distributed/version_compat.h" + /* * RecursivePlanningContext is used to recursively plan subqueries * and CTEs, pull results to the coordinator, and push it back into diff --git a/src/backend/distributed/planner/relation_restriction_equivalence.c b/src/backend/distributed/planner/relation_restriction_equivalence.c index 4b51a537d..83d7cbcdb 100644 --- a/src/backend/distributed/planner/relation_restriction_equivalence.c +++ b/src/backend/distributed/planner/relation_restriction_equivalence.c @@ -10,31 +10,31 @@ */ #include "postgres.h" +#include "catalog/pg_type.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "nodes/pathnodes.h" +#include "nodes/pg_list.h" +#include "nodes/primnodes.h" +#include "optimizer/optimizer.h" +#include "optimizer/pathnode.h" +#include "optimizer/paths.h" +#include "parser/parsetree.h" + #include "pg_version_constants.h" #include "distributed/colocation_utils.h" #include "distributed/distributed_planner.h" #include "distributed/listutils.h" #include "distributed/metadata_cache.h" -#include "distributed/multi_logical_planner.h" #include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_planner.h" #include "distributed/multi_router_planner.h" #include "distributed/pg_dist_partition.h" #include "distributed/query_utils.h" #include "distributed/relation_restriction_equivalence.h" #include "distributed/shard_pruning.h" -#include "catalog/pg_type.h" -#include "nodes/nodeFuncs.h" -#include "nodes/pg_list.h" -#include "nodes/primnodes.h" -#include "nodes/pathnodes.h" -#include "optimizer/optimizer.h" -#include "nodes/makefuncs.h" -#include "optimizer/paths.h" -#include "parser/parsetree.h" -#include "optimizer/pathnode.h" - static uint32 AttributeEquivalenceId = 1; diff --git a/src/backend/distributed/planner/shard_pruning.c b/src/backend/distributed/planner/shard_pruning.c index ef244ea66..e68ac72b0 100644 --- a/src/backend/distributed/planner/shard_pruning.c +++ b/src/backend/distributed/planner/shard_pruning.c @@ -66,28 +66,14 @@ */ #include "postgres.h" -#include "pg_version_constants.h" - #include "fmgr.h" -#include "distributed/shard_pruning.h" - #include "access/nbtree.h" #include "catalog/pg_am.h" #include "catalog/pg_collation.h" #include "catalog/pg_type.h" -#include "distributed/distributed_planner.h" -#include "distributed/listutils.h" -#include "distributed/log_utils.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/version_compat.h" -#include "distributed/worker_protocol.h" -#include "nodes/nodeFuncs.h" #include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" #include "optimizer/clauses.h" #include "optimizer/planner.h" #include "parser/parse_coerce.h" @@ -98,6 +84,20 @@ #include "utils/memutils.h" #include "utils/ruleutils.h" +#include "pg_version_constants.h" + +#include "distributed/distributed_planner.h" +#include "distributed/listutils.h" +#include "distributed/log_utils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/shard_pruning.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" + /* * Tree node for compact representation of the given query logical tree. diff --git a/src/backend/distributed/planner/tdigest_extension.c b/src/backend/distributed/planner/tdigest_extension.c index 123b170d4..3a3701940 100644 --- a/src/backend/distributed/planner/tdigest_extension.c +++ b/src/backend/distributed/planner/tdigest_extension.c @@ -12,13 +12,14 @@ #include "access/htup_details.h" #include "catalog/pg_extension.h" #include "catalog/pg_type.h" -#include "distributed/metadata_cache.h" -#include "distributed/tdigest_extension.h" -#include "distributed/version_compat.h" #include "parser/parse_func.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" +#include "distributed/metadata_cache.h" +#include "distributed/tdigest_extension.h" +#include "distributed/version_compat.h" + static Oid LookupTDigestFunction(const char *functionName, int argcount, Oid *argtypes); diff --git a/src/backend/distributed/progress/multi_progress.c b/src/backend/distributed/progress/multi_progress.c index 8a3adf4bc..64e0a5b47 100644 --- a/src/backend/distributed/progress/multi_progress.c +++ b/src/backend/distributed/progress/multi_progress.c @@ -8,15 +8,17 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "pgstat.h" +#include "storage/dsm.h" +#include "utils/builtins.h" + #include "distributed/function_utils.h" #include "distributed/listutils.h" #include "distributed/multi_progress.h" #include "distributed/version_compat.h" -#include "storage/dsm.h" -#include "utils/builtins.h" /* dynamic shared memory handle of the current progress */ diff --git a/src/backend/distributed/relay/relay_event_utility.c b/src/backend/distributed/relay/relay_event_utility.c index 3284ead11..d0267025b 100644 --- a/src/backend/distributed/relay/relay_event_utility.c +++ b/src/backend/distributed/relay/relay_event_utility.c @@ -12,34 +12,28 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "c.h" - #include #include +#include "postgres.h" + +#include "c.h" + #include "access/genam.h" -#include "access/heapam.h" -#include "access/htup_details.h" #include "access/hash.h" +#include "access/heapam.h" #include "access/htup.h" +#include "access/htup_details.h" #include "access/skey.h" #include "access/stratnum.h" #include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/pg_class.h" #include "catalog/pg_constraint.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/commands.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/relay_utility.h" -#include "distributed/version_compat.h" #include "lib/stringinfo.h" #include "mb/pg_wchar.h" -#include "nodes/nodes.h" #include "nodes/nodeFuncs.h" +#include "nodes/nodes.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" #include "nodes/primnodes.h" @@ -53,6 +47,14 @@ #include "utils/palloc.h" #include "utils/relcache.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/commands.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/relay_utility.h" +#include "distributed/version_compat.h" + /* Local functions forward declarations */ static void RelayEventExtendConstraintAndIndexNames(AlterTableStmt *alterTableStmt, Constraint *constraint, diff --git a/src/backend/distributed/replication/multi_logical_replication.c b/src/backend/distributed/replication/multi_logical_replication.c index 48571d7c4..056bc9a45 100644 --- a/src/backend/distributed/replication/multi_logical_replication.c +++ b/src/backend/distributed/replication/multi_logical_replication.c @@ -10,55 +10,32 @@ *------------------------------------------------------------------------- */ #include "postgres.h" -#include "miscadmin.h" -#include "fmgr.h" -#include "pgstat.h" -#include "libpq-fe.h" -#include "pg_version_constants.h" +#include "fmgr.h" +#include "libpq-fe.h" +#include "miscadmin.h" +#include "pgstat.h" #include "access/genam.h" - -#include "postmaster/interrupt.h" - #include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" -#include "commands/dbcommands.h" -#include "common/hashfn.h" -#include "catalog/pg_subscription_rel.h" #include "catalog/namespace.h" #include "catalog/pg_constraint.h" -#include "distributed/adaptive_executor.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/colocation_utils.h" -#include "distributed/connection_management.h" -#include "distributed/hash_helpers.h" -#include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_logical_replication.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/priority.h" -#include "distributed/distributed_planner.h" -#include "distributed/remote_commands.h" -#include "distributed/resource_lock.h" -#include "distributed/shard_cleaner.h" -#include "distributed/shard_rebalancer.h" -#include "distributed/shard_transfer.h" -#include "distributed/version_compat.h" +#include "catalog/pg_subscription_rel.h" +#include "commands/dbcommands.h" +#include "common/hashfn.h" #include "nodes/bitmapset.h" #include "parser/scansup.h" +#include "postmaster/interrupt.h" #include "storage/ipc.h" #include "storage/latch.h" #include "storage/lock.h" -#include "utils/guc.h" #include "utils/builtins.h" -#include "utils/fmgrprotos.h" #include "utils/fmgroids.h" +#include "utils/fmgrprotos.h" #include "utils/formatting.h" +#include "utils/guc.h" #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/pg_lsn.h" @@ -66,6 +43,29 @@ #include "utils/ruleutils.h" #include "utils/syscache.h" +#include "pg_version_constants.h" + +#include "distributed/adaptive_executor.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/colocation_utils.h" +#include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distributed_planner.h" +#include "distributed/hash_helpers.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_logical_replication.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/priority.h" +#include "distributed/remote_commands.h" +#include "distributed/resource_lock.h" +#include "distributed/shard_cleaner.h" +#include "distributed/shard_rebalancer.h" +#include "distributed/shard_transfer.h" +#include "distributed/version_compat.h" + #define CURRENT_LOG_POSITION_COMMAND "SELECT pg_current_wal_lsn()" /* decimal representation of Adler-16 hash value of citus_shard_move_publication */ diff --git a/src/backend/distributed/shardsplit/shardsplit_decoder.c b/src/backend/distributed/shardsplit/shardsplit_decoder.c index 7145b4dfa..f14f10557 100644 --- a/src/backend/distributed/shardsplit/shardsplit_decoder.c +++ b/src/backend/distributed/shardsplit/shardsplit_decoder.c @@ -8,16 +8,18 @@ *------------------------------------------------------------------------- */ #include "postgres.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/shardsplit_shared_memory.h" -#include "distributed/worker_shard_visibility.h" -#include "distributed/worker_protocol.h" + +#include "catalog/pg_namespace.h" +#include "replication/logical.h" +#include "utils/lsyscache.h" +#include "utils/typcache.h" + #include "distributed/listutils.h" #include "distributed/metadata/distobject.h" -#include "replication/logical.h" -#include "utils/typcache.h" -#include "utils/lsyscache.h" -#include "catalog/pg_namespace.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/shardsplit_shared_memory.h" +#include "distributed/worker_protocol.h" +#include "distributed/worker_shard_visibility.h" extern void _PG_output_plugin_init(OutputPluginCallbacks *cb); static LogicalDecodeChangeCB pgOutputPluginChangeCB; diff --git a/src/backend/distributed/shardsplit/shardsplit_logical_replication.c b/src/backend/distributed/shardsplit/shardsplit_logical_replication.c index 8ffccb90c..328dc9af9 100644 --- a/src/backend/distributed/shardsplit/shardsplit_logical_replication.c +++ b/src/backend/distributed/shardsplit/shardsplit_logical_replication.c @@ -10,23 +10,26 @@ */ #include "postgres.h" + #include "miscadmin.h" + +#include "commands/dbcommands.h" #include "nodes/pg_list.h" +#include "utils/builtins.h" + #include "distributed/colocation_utils.h" +#include "distributed/connection_management.h" #include "distributed/hash_helpers.h" +#include "distributed/listutils.h" #include "distributed/metadata_cache.h" #include "distributed/multi_partitioning_utils.h" #include "distributed/priority.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/connection_management.h" #include "distributed/remote_commands.h" -#include "distributed/shard_split.h" -#include "distributed/shared_library_init.h" -#include "distributed/listutils.h" -#include "distributed/shardsplit_logical_replication.h" #include "distributed/resource_lock.h" -#include "utils/builtins.h" -#include "commands/dbcommands.h" +#include "distributed/shard_split.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/shardsplit_logical_replication.h" +#include "distributed/shared_library_init.h" static HTAB *ShardInfoHashMapForPublications = NULL; diff --git a/src/backend/distributed/shardsplit/shardsplit_shared_memory.c b/src/backend/distributed/shardsplit/shardsplit_shared_memory.c index 3e8745758..16ed79ad7 100644 --- a/src/backend/distributed/shardsplit/shardsplit_shared_memory.c +++ b/src/backend/distributed/shardsplit/shardsplit_shared_memory.c @@ -12,13 +12,15 @@ */ #include "postgres.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/shardsplit_shared_memory.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/multi_logical_replication.h" + +#include "common/hashfn.h" #include "storage/ipc.h" #include "utils/memutils.h" -#include "common/hashfn.h" + +#include "distributed/citus_safe_lib.h" +#include "distributed/multi_logical_replication.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/shardsplit_shared_memory.h" const char *SharedMemoryNameForHandleManagement = "Shared memory handle for shard split"; diff --git a/src/backend/distributed/shared_library_init.c b/src/backend/distributed/shared_library_init.c index 22037c82b..ffb235596 100644 --- a/src/backend/distributed/shared_library_init.c +++ b/src/backend/distributed/shared_library_init.c @@ -7,12 +7,12 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - #include #include #include +#include "postgres.h" + /* necessary to get alloca on illumos */ #ifdef __sun #include @@ -20,93 +20,24 @@ #include "fmgr.h" #include "miscadmin.h" - #include "safe_lib.h" -#include "catalog/pg_authid.h" #include "catalog/objectaccess.h" +#include "catalog/pg_authid.h" #include "catalog/pg_extension.h" -#include "citus_version.h" #include "commands/explain.h" #include "commands/extension.h" #include "commands/seclabel.h" #include "common/string.h" #include "executor/executor.h" -#include "distributed/backend_data.h" -#include "distributed/background_jobs.h" -#include "distributed/causal_clock.h" -#include "distributed/citus_depended_object.h" -#include "distributed/citus_nodefuncs.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/commands.h" -#include "distributed/commands/multi_copy.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/connection_management.h" -#include "distributed/cte_inline.h" -#include "distributed/distributed_deadlock_detection.h" -#include "distributed/errormessage.h" -#include "distributed/repartition_executor.h" -#include "distributed/intermediate_result_pruning.h" -#include "distributed/local_multi_copy.h" -#include "distributed/local_executor.h" -#include "distributed/local_distributed_join_planner.h" -#include "distributed/locally_reserved_shared_connections.h" -#include "distributed/log_utils.h" -#include "distributed/maintenanced.h" -#include "distributed/shard_cleaner.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_explain.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_logical_replication.h" -#include "distributed/multi_logical_optimizer.h" -#include "distributed/distributed_planner.h" -#include "distributed/combine_query_planner.h" -#include "distributed/multi_router_planner.h" -#include "distributed/multi_server_executor.h" -#include "distributed/pg_dist_partition.h" -#include "distributed/placement_connection.h" -#include "distributed/priority.h" -#include "distributed/query_stats.h" -#include "distributed/recursive_planning.h" -#include "distributed/reference_table_utils.h" -#include "distributed/relation_access_tracking.h" -#include "distributed/replication_origin_session_utils.h" -#include "distributed/run_from_same_connection.h" -#include "distributed/shard_cleaner.h" -#include "distributed/shard_transfer.h" -#include "distributed/shared_connection_stats.h" -#include "distributed/shardsplit_shared_memory.h" -#include "distributed/query_pushdown_planning.h" -#include "distributed/time_constants.h" -#include "distributed/query_stats.h" -#include "distributed/remote_commands.h" -#include "distributed/shard_rebalancer.h" -#include "distributed/shared_library_init.h" -#include "distributed/statistics_collection.h" -#include "distributed/subplan_execution.h" -#include "distributed/resource_lock.h" -#include "distributed/transaction_management.h" -#include "distributed/transaction_recovery.h" -#include "distributed/utils/citus_stat_tenants.h" -#include "distributed/utils/directory.h" -#include "distributed/worker_log_messages.h" -#include "distributed/worker_manager.h" -#include "distributed/worker_protocol.h" -#include "distributed/worker_shard_visibility.h" -#include "distributed/adaptive_executor.h" #include "libpq/auth.h" +#include "optimizer/paths.h" +#include "optimizer/plancat.h" +#include "optimizer/planner.h" #include "port/atomics.h" #include "postmaster/postmaster.h" #include "replication/walsender.h" #include "storage/ipc.h" -#include "optimizer/planner.h" -#include "optimizer/plancat.h" -#include "optimizer/paths.h" #include "tcop/tcopprot.h" #include "utils/guc.h" #include "utils/guc_tables.h" @@ -115,8 +46,76 @@ #include "utils/syscache.h" #include "utils/varlena.h" +#include "citus_version.h" + #include "columnar/columnar.h" +#include "distributed/adaptive_executor.h" +#include "distributed/backend_data.h" +#include "distributed/background_jobs.h" +#include "distributed/causal_clock.h" +#include "distributed/citus_depended_object.h" +#include "distributed/citus_nodefuncs.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/combine_query_planner.h" +#include "distributed/commands.h" +#include "distributed/commands/multi_copy.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/connection_management.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/cte_inline.h" +#include "distributed/distributed_deadlock_detection.h" +#include "distributed/distributed_planner.h" +#include "distributed/errormessage.h" +#include "distributed/intermediate_result_pruning.h" +#include "distributed/local_distributed_join_planner.h" +#include "distributed/local_executor.h" +#include "distributed/local_multi_copy.h" +#include "distributed/locally_reserved_shared_connections.h" +#include "distributed/log_utils.h" +#include "distributed/maintenanced.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_explain.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_logical_optimizer.h" +#include "distributed/multi_logical_replication.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/multi_router_planner.h" +#include "distributed/multi_server_executor.h" +#include "distributed/pg_dist_partition.h" +#include "distributed/placement_connection.h" +#include "distributed/priority.h" +#include "distributed/query_pushdown_planning.h" +#include "distributed/query_stats.h" +#include "distributed/recursive_planning.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relation_access_tracking.h" +#include "distributed/remote_commands.h" +#include "distributed/repartition_executor.h" +#include "distributed/replication_origin_session_utils.h" +#include "distributed/resource_lock.h" +#include "distributed/run_from_same_connection.h" +#include "distributed/shard_cleaner.h" +#include "distributed/shard_rebalancer.h" +#include "distributed/shard_transfer.h" +#include "distributed/shardsplit_shared_memory.h" +#include "distributed/shared_connection_stats.h" +#include "distributed/shared_library_init.h" +#include "distributed/statistics_collection.h" +#include "distributed/subplan_execution.h" +#include "distributed/time_constants.h" +#include "distributed/transaction_management.h" +#include "distributed/transaction_recovery.h" +#include "distributed/utils/citus_stat_tenants.h" +#include "distributed/utils/directory.h" +#include "distributed/worker_log_messages.h" +#include "distributed/worker_manager.h" +#include "distributed/worker_protocol.h" +#include "distributed/worker_shard_visibility.h" + /* marks shared object as one loadable by the postgres version compiled against */ PG_MODULE_MAGIC; @@ -1274,6 +1273,17 @@ RegisterCitusConfigVariables(void) GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE, NULL, NULL, NULL); + DefineCustomBoolVariable( + "citus.enable_create_database_propagation", + gettext_noop("Enables propagating CREATE DATABASE " + "and DROP DATABASE statements to workers."), + NULL, + &EnableCreateDatabasePropagation, + false, + PGC_USERSET, + GUC_STANDARD, + NULL, NULL, NULL); + DefineCustomBoolVariable( "citus.enable_create_role_propagation", gettext_noop("Enables propagating CREATE ROLE " diff --git a/src/backend/distributed/sql/citus--12.1-1--12.2-1.sql b/src/backend/distributed/sql/citus--12.1-1--12.2-1.sql index ec4cc7134..63c4a527f 100644 --- a/src/backend/distributed/sql/citus--12.1-1--12.2-1.sql +++ b/src/backend/distributed/sql/citus--12.1-1--12.2-1.sql @@ -1,5 +1,5 @@ -- citus--12.1-1--12.2-1 - -- bump version to 12.2-1 +#include "udfs/citus_internal_database_command/12.2-1.sql" #include "udfs/citus_add_rebalance_strategy/12.2-1.sql" diff --git a/src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql b/src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql index 93d121a12..d18f7257b 100644 --- a/src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql +++ b/src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql @@ -1,3 +1,5 @@ -- citus--12.2-1--12.1-1 +DROP FUNCTION pg_catalog.citus_internal_database_command(text); + #include "../udfs/citus_add_rebalance_strategy/10.1-1.sql" diff --git a/src/backend/distributed/sql/udfs/citus_internal_database_command/12.2-1.sql b/src/backend/distributed/sql/udfs/citus_internal_database_command/12.2-1.sql new file mode 100644 index 000000000..9f6d873cc --- /dev/null +++ b/src/backend/distributed/sql/udfs/citus_internal_database_command/12.2-1.sql @@ -0,0 +1,10 @@ +-- +-- citus_internal_database_command run given database command without transaction block restriction. + +CREATE OR REPLACE FUNCTION pg_catalog.citus_internal_database_command(command text) + RETURNS void + LANGUAGE C + VOLATILE +AS 'MODULE_PATHNAME', $$citus_internal_database_command$$; +COMMENT ON FUNCTION pg_catalog.citus_internal_database_command(text) IS + 'run a database command without transaction block restrictions'; diff --git a/src/backend/distributed/sql/udfs/citus_internal_database_command/latest.sql b/src/backend/distributed/sql/udfs/citus_internal_database_command/latest.sql new file mode 100644 index 000000000..9f6d873cc --- /dev/null +++ b/src/backend/distributed/sql/udfs/citus_internal_database_command/latest.sql @@ -0,0 +1,10 @@ +-- +-- citus_internal_database_command run given database command without transaction block restriction. + +CREATE OR REPLACE FUNCTION pg_catalog.citus_internal_database_command(command text) + RETURNS void + LANGUAGE C + VOLATILE +AS 'MODULE_PATHNAME', $$citus_internal_database_command$$; +COMMENT ON FUNCTION pg_catalog.citus_internal_database_command(text) IS + 'run a database command without transaction block restrictions'; diff --git a/src/backend/distributed/test/backend_counter.c b/src/backend/distributed/test/backend_counter.c index 1b9984ac9..f3f19f0d3 100644 --- a/src/backend/distributed/test/backend_counter.c +++ b/src/backend/distributed/test/backend_counter.c @@ -11,6 +11,7 @@ */ #include "postgres.h" + #include "fmgr.h" #include "distributed/backend_data.h" diff --git a/src/backend/distributed/test/citus_depended_object.c b/src/backend/distributed/test/citus_depended_object.c index 4e1e919e8..77fc2e482 100644 --- a/src/backend/distributed/test/citus_depended_object.c +++ b/src/backend/distributed/test/citus_depended_object.c @@ -13,17 +13,17 @@ #include "catalog/pg_am.h" #include "catalog/pg_amop.h" #include "catalog/pg_amproc.h" -#include "catalog/pg_attribute.h" #include "catalog/pg_attrdef.h" -#include "catalog/pg_constraint.h" +#include "catalog/pg_attribute.h" #include "catalog/pg_class.h" +#include "catalog/pg_constraint.h" #include "catalog/pg_depend.h" #include "catalog/pg_enum.h" #include "catalog/pg_event_trigger.h" #include "catalog/pg_language.h" #include "catalog/pg_namespace.h" -#include "catalog/pg_operator.h" #include "catalog/pg_opclass.h" +#include "catalog/pg_operator.h" #include "catalog/pg_opfamily.h" #include "catalog/pg_proc.h" #include "catalog/pg_rewrite.h" @@ -34,11 +34,12 @@ #include "catalog/pg_ts_dict.h" #include "catalog/pg_ts_template.h" #include "catalog/pg_type.h" + #include "distributed/citus_depended_object.h" #include "distributed/listutils.h" -#include "distributed/metadata_cache.h" #include "distributed/metadata/dependency.h" #include "distributed/metadata/distobject.h" +#include "distributed/metadata_cache.h" static bool IsCitusDependentObject(ObjectAddress objectAddress); diff --git a/src/backend/distributed/test/citus_stat_tenants.c b/src/backend/distributed/test/citus_stat_tenants.c index 2cfe0029b..b8fe305c6 100644 --- a/src/backend/distributed/test/citus_stat_tenants.c +++ b/src/backend/distributed/test/citus_stat_tenants.c @@ -10,11 +10,13 @@ */ #include "postgres.h" + #include "fmgr.h" -#include "distributed/utils/citus_stat_tenants.h" #include "sys/time.h" +#include "distributed/utils/citus_stat_tenants.h" + PG_FUNCTION_INFO_V1(sleep_until_next_period); /* diff --git a/src/backend/distributed/test/colocation_utils.c b/src/backend/distributed/test/colocation_utils.c index 19a4e1664..6a87539c4 100644 --- a/src/backend/distributed/test/colocation_utils.c +++ b/src/backend/distributed/test/colocation_utils.c @@ -11,9 +11,11 @@ */ #include "postgres.h" + #include "fmgr.h" #include "catalog/pg_type.h" + #include "distributed/colocation_utils.h" #include "distributed/listutils.h" #include "distributed/metadata_cache.h" diff --git a/src/backend/distributed/test/create_shards.c b/src/backend/distributed/test/create_shards.c index 4ed1db7c7..4ef13f1cb 100644 --- a/src/backend/distributed/test/create_shards.c +++ b/src/backend/distributed/test/create_shards.c @@ -10,16 +10,18 @@ *------------------------------------------------------------------------- */ +#include + #include "postgres.h" + #include "c.h" #include "fmgr.h" -#include - -#include "distributed/listutils.h" #include "lib/stringinfo.h" #include "nodes/pg_list.h" +#include "distributed/listutils.h" + /* local function forward declarations */ static int CompareStrings(const void *leftElement, const void *rightElement); diff --git a/src/backend/distributed/test/deparse_function_query.c b/src/backend/distributed/test/deparse_function_query.c index 7a6e54424..8971f597a 100644 --- a/src/backend/distributed/test/deparse_function_query.c +++ b/src/backend/distributed/test/deparse_function_query.c @@ -13,9 +13,10 @@ #include "postgres.h" +#include "utils/builtins.h" + #include "distributed/deparser.h" #include "distributed/multi_executor.h" -#include "utils/builtins.h" /* declarations for dynamic loading */ PG_FUNCTION_INFO_V1(deparse_test); diff --git a/src/backend/distributed/test/deparse_shard_query.c b/src/backend/distributed/test/deparse_shard_query.c index a6196146f..a9b4ced1d 100644 --- a/src/backend/distributed/test/deparse_shard_query.c +++ b/src/backend/distributed/test/deparse_shard_query.c @@ -10,18 +10,14 @@ *------------------------------------------------------------------------- */ +#include + #include "postgres.h" + #include "c.h" #include "fmgr.h" -#include - #include "catalog/pg_type.h" -#include "distributed/listutils.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/insert_select_planner.h" -#include "distributed/multi_router_planner.h" #include "lib/stringinfo.h" #include "nodes/makefuncs.h" #include "nodes/nodes.h" @@ -33,6 +29,12 @@ #include "utils/builtins.h" #include "utils/palloc.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/insert_select_planner.h" +#include "distributed/listutils.h" +#include "distributed/multi_router_planner.h" + /* declarations for dynamic loading */ PG_FUNCTION_INFO_V1(deparse_shard_query_test); diff --git a/src/backend/distributed/test/dependency.c b/src/backend/distributed/test/dependency.c index 82e818b8c..7afbfdec7 100644 --- a/src/backend/distributed/test/dependency.c +++ b/src/backend/distributed/test/dependency.c @@ -9,6 +9,7 @@ *------------------------------------------------------------------------- */ #include "postgres.h" + #include "c.h" #include "fmgr.h" diff --git a/src/backend/distributed/test/distributed_deadlock_detection.c b/src/backend/distributed/test/distributed_deadlock_detection.c index d3fa34db2..68b5622a7 100644 --- a/src/backend/distributed/test/distributed_deadlock_detection.c +++ b/src/backend/distributed/test/distributed_deadlock_detection.c @@ -10,10 +10,15 @@ *------------------------------------------------------------------------- */ #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" #include "access/hash.h" +#include "nodes/pg_list.h" +#include "utils/hsearch.h" +#include "utils/timestamp.h" + #include "distributed/backend_data.h" #include "distributed/distributed_deadlock_detection.h" #include "distributed/hash_helpers.h" @@ -22,9 +27,6 @@ #include "distributed/metadata_cache.h" #include "distributed/transaction_identifier.h" #include "distributed/tuplestore.h" -#include "nodes/pg_list.h" -#include "utils/hsearch.h" -#include "utils/timestamp.h" PG_FUNCTION_INFO_V1(get_adjacency_list_wait_graph); diff --git a/src/backend/distributed/test/distributed_intermediate_results.c b/src/backend/distributed/test/distributed_intermediate_results.c index c3b286f52..843bda476 100644 --- a/src/backend/distributed/test/distributed_intermediate_results.c +++ b/src/backend/distributed/test/distributed_intermediate_results.c @@ -13,12 +13,15 @@ #include #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" #include "pgstat.h" #include "catalog/pg_type.h" +#include "tcop/tcopprot.h" + #include "distributed/commands/multi_copy.h" #include "distributed/connection_management.h" #include "distributed/intermediate_results.h" @@ -26,10 +29,8 @@ #include "distributed/multi_executor.h" #include "distributed/remote_commands.h" #include "distributed/tuplestore.h" -#include "distributed/listutils.h" #include "distributed/utils/array_type.h" #include "distributed/version_compat.h" -#include "tcop/tcopprot.h" PG_FUNCTION_INFO_V1(partition_task_list_results); PG_FUNCTION_INFO_V1(redistribute_task_list_results); diff --git a/src/backend/distributed/test/distribution_metadata.c b/src/backend/distributed/test/distribution_metadata.c index c3bc7fb51..01117922e 100644 --- a/src/backend/distributed/test/distribution_metadata.c +++ b/src/backend/distributed/test/distribution_metadata.c @@ -10,37 +10,39 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "c.h" -#include "fmgr.h" - #include #include +#include "postgres.h" + +#include "c.h" +#include "fmgr.h" + #include "access/heapam.h" #include "catalog/pg_type.h" -#include "distributed/distribution_column.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/pg_dist_shard.h" -#include "distributed/query_utils.h" -#include "distributed/resource_lock.h" -#include "distributed/utils/array_type.h" #include "lib/stringinfo.h" #include "nodes/pg_list.h" #include "nodes/primnodes.h" #include "storage/lock.h" #include "tcop/tcopprot.h" #include "utils/array.h" +#include "utils/builtins.h" #include "utils/elog.h" #include "utils/errcodes.h" -#include "utils/builtins.h" #include "utils/palloc.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distribution_column.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/pg_dist_shard.h" +#include "distributed/query_utils.h" +#include "distributed/resource_lock.h" +#include "distributed/utils/array_type.h" + /* declarations for dynamic loading */ PG_FUNCTION_INFO_V1(load_shard_id_array); diff --git a/src/backend/distributed/test/fake_am.c b/src/backend/distributed/test/fake_am.c index 4b11d7871..cff124961 100644 --- a/src/backend/distributed/test/fake_am.c +++ b/src/backend/distributed/test/fake_am.c @@ -19,14 +19,10 @@ #include "postgres.h" -#include "pg_version_constants.h" -#include "pg_version_compat.h" - - #include "access/amapi.h" #include "access/heapam.h" -#include "access/tableam.h" #include "access/multixact.h" +#include "access/tableam.h" #include "access/xact.h" #include "catalog/index.h" #include "catalog/storage.h" @@ -36,6 +32,9 @@ #include "storage/smgr.h" #include "utils/snapmgr.h" +#include "pg_version_compat.h" +#include "pg_version_constants.h" + PG_FUNCTION_INFO_V1(fake_am_handler); static const TableAmRoutine fake_methods; diff --git a/src/backend/distributed/test/fake_fdw.c b/src/backend/distributed/test/fake_fdw.c index f53242f7f..585e61d41 100644 --- a/src/backend/distributed/test/fake_fdw.c +++ b/src/backend/distributed/test/fake_fdw.c @@ -10,27 +10,27 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" +#include -#include "pg_version_constants.h" +#include "postgres.h" #include "c.h" #include "fmgr.h" -#include - #include "executor/tuptable.h" #include "foreign/fdwapi.h" #include "nodes/execnodes.h" #include "nodes/nodes.h" +#include "nodes/pathnodes.h" #include "nodes/pg_list.h" #include "nodes/plannodes.h" -#include "nodes/pathnodes.h" #include "optimizer/pathnode.h" #include "optimizer/planmain.h" #include "optimizer/restrictinfo.h" #include "utils/palloc.h" +#include "pg_version_constants.h" + /* local function forward declarations */ static void FakeGetForeignRelSize(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid); diff --git a/src/backend/distributed/test/foreign_key_relationship_query.c b/src/backend/distributed/test/foreign_key_relationship_query.c index 545c2e970..af187111a 100644 --- a/src/backend/distributed/test/foreign_key_relationship_query.c +++ b/src/backend/distributed/test/foreign_key_relationship_query.c @@ -11,18 +11,20 @@ */ #include "postgres.h" + #include "fmgr.h" #include "funcapi.h" #include "catalog/dependency.h" #include "catalog/pg_constraint.h" -#include "distributed/foreign_key_relationship.h" +#include "utils/builtins.h" + #include "distributed/coordinator_protocol.h" +#include "distributed/foreign_key_relationship.h" #include "distributed/listutils.h" #include "distributed/metadata_cache.h" #include "distributed/tuplestore.h" #include "distributed/version_compat.h" -#include "utils/builtins.h" #define GET_FKEY_CONNECTED_RELATIONS_COLUMNS 1 diff --git a/src/backend/distributed/test/global_pid.c b/src/backend/distributed/test/global_pid.c index de54f1929..b63b39b44 100644 --- a/src/backend/distributed/test/global_pid.c +++ b/src/backend/distributed/test/global_pid.c @@ -10,6 +10,7 @@ */ #include "postgres.h" + #include "fmgr.h" #include "distributed/backend_data.h" diff --git a/src/backend/distributed/test/hide_shards.c b/src/backend/distributed/test/hide_shards.c index 59e738c36..b1adf61b4 100644 --- a/src/backend/distributed/test/hide_shards.c +++ b/src/backend/distributed/test/hide_shards.c @@ -10,6 +10,7 @@ *------------------------------------------------------------------------- */ #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" #include "pgstat.h" diff --git a/src/backend/distributed/test/intermediate_results.c b/src/backend/distributed/test/intermediate_results.c index b4f14bca6..8681a6ca9 100644 --- a/src/backend/distributed/test/intermediate_results.c +++ b/src/backend/distributed/test/intermediate_results.c @@ -13,6 +13,7 @@ #include #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" diff --git a/src/backend/distributed/test/make_external_connection.c b/src/backend/distributed/test/make_external_connection.c index 424793dea..14be057ab 100644 --- a/src/backend/distributed/test/make_external_connection.c +++ b/src/backend/distributed/test/make_external_connection.c @@ -11,10 +11,17 @@ */ #include "postgres.h" -#include "miscadmin.h" + #include "libpq-fe.h" +#include "miscadmin.h" #include "access/xact.h" +#include "executor/spi.h" +#include "lib/stringinfo.h" +#include "postmaster/postmaster.h" +#include "utils/builtins.h" +#include "utils/memutils.h" + #include "distributed/connection_management.h" #include "distributed/coordinator_protocol.h" #include "distributed/function_utils.h" @@ -23,13 +30,7 @@ #include "distributed/metadata_cache.h" #include "distributed/remote_commands.h" #include "distributed/run_from_same_connection.h" - #include "distributed/version_compat.h" -#include "executor/spi.h" -#include "lib/stringinfo.h" -#include "postmaster/postmaster.h" -#include "utils/builtins.h" -#include "utils/memutils.h" PG_FUNCTION_INFO_V1(make_external_connection_to_node); diff --git a/src/backend/distributed/test/metadata_sync.c b/src/backend/distributed/test/metadata_sync.c index 8ad4b15f2..d6aeb842c 100644 --- a/src/backend/distributed/test/metadata_sync.c +++ b/src/backend/distributed/test/metadata_sync.c @@ -10,10 +10,17 @@ *------------------------------------------------------------------------- */ #include "postgres.h" + #include "c.h" #include "fmgr.h" +#include "miscadmin.h" #include "catalog/pg_type.h" +#include "postmaster/postmaster.h" +#include "storage/latch.h" +#include "utils/array.h" +#include "utils/builtins.h" + #include "distributed/connection_management.h" #include "distributed/intermediate_result_pruning.h" #include "distributed/listutils.h" @@ -22,11 +29,6 @@ #include "distributed/remote_commands.h" #include "distributed/utils/array_type.h" #include "distributed/worker_manager.h" -#include "postmaster/postmaster.h" -#include "miscadmin.h" -#include "storage/latch.h" -#include "utils/array.h" -#include "utils/builtins.h" /* declarations for dynamic loading */ diff --git a/src/backend/distributed/test/partitioning_utils.c b/src/backend/distributed/test/partitioning_utils.c index 95adaddf6..be9163561 100644 --- a/src/backend/distributed/test/partitioning_utils.c +++ b/src/backend/distributed/test/partitioning_utils.c @@ -10,16 +10,18 @@ *------------------------------------------------------------------------- */ #include "postgres.h" + #include "fmgr.h" #include "catalog/pg_type.h" -#include "distributed/listutils.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/reference_table_utils.h" #include "lib/stringinfo.h" #include "utils/builtins.h" #include "utils/lsyscache.h" +#include "distributed/listutils.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/reference_table_utils.h" + PG_FUNCTION_INFO_V1(generate_alter_table_detach_partition_command); PG_FUNCTION_INFO_V1(generate_alter_table_attach_partition_command); diff --git a/src/backend/distributed/test/progress_utils.c b/src/backend/distributed/test/progress_utils.c index 42b065dae..e1ea09e3d 100644 --- a/src/backend/distributed/test/progress_utils.c +++ b/src/backend/distributed/test/progress_utils.c @@ -11,18 +11,20 @@ */ +#include + #include "postgres.h" -#include "miscadmin.h" + #include "fmgr.h" #include "funcapi.h" +#include "miscadmin.h" -#include +#include "nodes/execnodes.h" +#include "utils/tuplestore.h" #include "distributed/listutils.h" #include "distributed/multi_progress.h" #include "distributed/tuplestore.h" -#include "nodes/execnodes.h" -#include "utils/tuplestore.h" PG_FUNCTION_INFO_V1(create_progress); diff --git a/src/backend/distributed/test/prune_shard_list.c b/src/backend/distributed/test/prune_shard_list.c index 023a759cb..f972281ec 100644 --- a/src/backend/distributed/test/prune_shard_list.c +++ b/src/backend/distributed/test/prune_shard_list.c @@ -10,25 +10,15 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" +#include -#include "pg_version_constants.h" +#include "postgres.h" #include "c.h" #include "fmgr.h" -#include - #include "access/stratnum.h" #include "catalog/pg_type.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_utility.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/resource_lock.h" -#include "distributed/shard_pruning.h" -#include "distributed/utils/array_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/nodes.h" @@ -38,6 +28,17 @@ #include "utils/array.h" #include "utils/palloc.h" +#include "pg_version_constants.h" + +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/resource_lock.h" +#include "distributed/shard_pruning.h" +#include "distributed/utils/array_type.h" + /* local function forward declarations */ static Expr * MakeTextPartitionExpression(Oid distributedTableId, text *value); diff --git a/src/backend/distributed/test/relation_access_tracking.c b/src/backend/distributed/test/relation_access_tracking.c index 5715bd03d..85c0ff2aa 100644 --- a/src/backend/distributed/test/relation_access_tracking.c +++ b/src/backend/distributed/test/relation_access_tracking.c @@ -10,6 +10,7 @@ */ #include "postgres.h" + #include "c.h" #include "fmgr.h" diff --git a/src/backend/distributed/test/run_from_same_connection.c b/src/backend/distributed/test/run_from_same_connection.c index 04a3149da..5663a42fa 100644 --- a/src/backend/distributed/test/run_from_same_connection.c +++ b/src/backend/distributed/test/run_from_same_connection.c @@ -12,10 +12,17 @@ */ #include "postgres.h" -#include "miscadmin.h" + #include "libpq-fe.h" +#include "miscadmin.h" #include "access/xact.h" +#include "executor/spi.h" +#include "lib/stringinfo.h" +#include "postmaster/postmaster.h" +#include "utils/builtins.h" +#include "utils/memutils.h" + #include "distributed/connection_management.h" #include "distributed/coordinator_protocol.h" #include "distributed/function_utils.h" @@ -24,13 +31,7 @@ #include "distributed/metadata_cache.h" #include "distributed/remote_commands.h" #include "distributed/run_from_same_connection.h" - #include "distributed/version_compat.h" -#include "executor/spi.h" -#include "lib/stringinfo.h" -#include "postmaster/postmaster.h" -#include "utils/builtins.h" -#include "utils/memutils.h" #define ALTER_CURRENT_PROCESS_ID \ diff --git a/src/backend/distributed/test/sequential_execution.c b/src/backend/distributed/test/sequential_execution.c index 9b88e3b7a..f967eb75f 100644 --- a/src/backend/distributed/test/sequential_execution.c +++ b/src/backend/distributed/test/sequential_execution.c @@ -11,6 +11,7 @@ */ #include "postgres.h" + #include "fmgr.h" #include "distributed/multi_executor.h" diff --git a/src/backend/distributed/test/shard_rebalancer.c b/src/backend/distributed/test/shard_rebalancer.c index 56a063982..32bfd9f46 100644 --- a/src/backend/distributed/test/shard_rebalancer.c +++ b/src/backend/distributed/test/shard_rebalancer.c @@ -11,27 +11,28 @@ */ #include "postgres.h" -#include "libpq-fe.h" +#include "funcapi.h" +#include "libpq-fe.h" +#include "miscadmin.h" #include "safe_lib.h" #include "catalog/pg_type.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/connection_management.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/shard_cleaner.h" -#include "distributed/shard_rebalancer.h" -#include "distributed/relay_utility.h" -#include "funcapi.h" -#include "miscadmin.h" #include "utils/builtins.h" #include "utils/json.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/connection_management.h" +#include "distributed/listutils.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_physical_planner.h" +#include "distributed/relay_utility.h" +#include "distributed/shard_cleaner.h" +#include "distributed/shard_rebalancer.h" + /* static declarations for json conversion */ static List * JsonArrayToShardPlacementTestInfoList( ArrayType *shardPlacementJsonArrayObject); diff --git a/src/backend/distributed/test/shared_connection_counters.c b/src/backend/distributed/test/shared_connection_counters.c index 641cfd314..c59602887 100644 --- a/src/backend/distributed/test/shared_connection_counters.c +++ b/src/backend/distributed/test/shared_connection_counters.c @@ -11,14 +11,16 @@ */ #include "postgres.h" -#include "miscadmin.h" -#include "fmgr.h" -#include "distributed/shared_connection_stats.h" -#include "distributed/listutils.h" +#include "fmgr.h" +#include "miscadmin.h" + #include "nodes/parsenodes.h" #include "utils/guc.h" +#include "distributed/listutils.h" +#include "distributed/shared_connection_stats.h" + /* exports for SQL callable functions */ PG_FUNCTION_INFO_V1(wake_up_connection_pool_waiters); PG_FUNCTION_INFO_V1(set_max_shared_pool_size); diff --git a/src/backend/distributed/test/xact_stats.c b/src/backend/distributed/test/xact_stats.c index 87e15aa64..a968f8cb6 100644 --- a/src/backend/distributed/test/xact_stats.c +++ b/src/backend/distributed/test/xact_stats.c @@ -13,6 +13,7 @@ #include #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" diff --git a/src/backend/distributed/transaction/backend_data.c b/src/backend/distributed/transaction/backend_data.c index c1981b77a..5f868f548 100644 --- a/src/backend/distributed/transaction/backend_data.c +++ b/src/backend/distributed/transaction/backend_data.c @@ -12,18 +12,29 @@ #include "postgres.h" -#include "pg_version_constants.h" - +#include "funcapi.h" #include "miscadmin.h" +#include "safe_lib.h" #include "unistd.h" -#include "safe_lib.h" - -#include "funcapi.h" #include "access/htup_details.h" #include "catalog/pg_authid.h" #include "catalog/pg_type.h" #include "datatype/timestamp.h" +#include "nodes/execnodes.h" +#include "postmaster/autovacuum.h" /* to access autovacuum_max_workers */ +#include "replication/walsender.h" +#include "storage/ipc.h" +#include "storage/lmgr.h" +#include "storage/lwlock.h" +#include "storage/proc.h" +#include "storage/procarray.h" +#include "storage/s_lock.h" +#include "storage/spin.h" +#include "utils/timestamp.h" + +#include "pg_version_constants.h" + #include "distributed/backend_data.h" #include "distributed/connection_management.h" #include "distributed/listutils.h" @@ -34,17 +45,6 @@ #include "distributed/transaction_identifier.h" #include "distributed/tuplestore.h" #include "distributed/worker_manager.h" -#include "nodes/execnodes.h" -#include "postmaster/autovacuum.h" /* to access autovacuum_max_workers */ -#include "replication/walsender.h" -#include "storage/ipc.h" -#include "storage/lmgr.h" -#include "storage/lwlock.h" -#include "storage/procarray.h" -#include "storage/proc.h" -#include "storage/spin.h" -#include "storage/s_lock.h" -#include "utils/timestamp.h" #define GET_ACTIVE_TRANSACTION_QUERY "SELECT * FROM get_all_active_transactions();" diff --git a/src/backend/distributed/transaction/citus_dist_stat_activity.c b/src/backend/distributed/transaction/citus_dist_stat_activity.c index 3aa6372e6..b0ffc05eb 100644 --- a/src/backend/distributed/transaction/citus_dist_stat_activity.c +++ b/src/backend/distributed/transaction/citus_dist_stat_activity.c @@ -10,8 +10,9 @@ */ #include "postgres.h" -#include "miscadmin.h" + #include "funcapi.h" +#include "miscadmin.h" PG_FUNCTION_INFO_V1(citus_dist_stat_activity); PG_FUNCTION_INFO_V1(citus_worker_stat_activity); diff --git a/src/backend/distributed/transaction/distributed_deadlock_detection.c b/src/backend/distributed/transaction/distributed_deadlock_detection.c index cf8dd43f5..27bb48ee3 100644 --- a/src/backend/distributed/transaction/distributed_deadlock_detection.c +++ b/src/backend/distributed/transaction/distributed_deadlock_detection.c @@ -15,8 +15,11 @@ #include "pgstat.h" #include "access/hash.h" +#include "nodes/pg_list.h" +#include "utils/hsearch.h" +#include "utils/timestamp.h" + #include "distributed/backend_data.h" -#include "distributed/errormessage.h" #include "distributed/distributed_deadlock_detection.h" #include "distributed/errormessage.h" #include "distributed/hash_helpers.h" @@ -25,9 +28,6 @@ #include "distributed/log_utils.h" #include "distributed/metadata_cache.h" #include "distributed/transaction_identifier.h" -#include "nodes/pg_list.h" -#include "utils/hsearch.h" -#include "utils/timestamp.h" /* used only for finding the deadlock cycle path */ diff --git a/src/backend/distributed/transaction/lock_graph.c b/src/backend/distributed/transaction/lock_graph.c index 0b4c0f02e..82f936243 100644 --- a/src/backend/distributed/transaction/lock_graph.c +++ b/src/backend/distributed/transaction/lock_graph.c @@ -18,6 +18,11 @@ #include "miscadmin.h" #include "access/hash.h" +#include "storage/proc.h" +#include "utils/builtins.h" +#include "utils/hsearch.h" +#include "utils/timestamp.h" + #include "distributed/backend_data.h" #include "distributed/connection_management.h" #include "distributed/hash_helpers.h" @@ -26,10 +31,6 @@ #include "distributed/metadata_cache.h" #include "distributed/remote_commands.h" #include "distributed/tuplestore.h" -#include "storage/proc.h" -#include "utils/builtins.h" -#include "utils/hsearch.h" -#include "utils/timestamp.h" /* diff --git a/src/backend/distributed/transaction/relation_access_tracking.c b/src/backend/distributed/transaction/relation_access_tracking.c index 3ad61ac79..5044941c4 100644 --- a/src/backend/distributed/transaction/relation_access_tracking.c +++ b/src/backend/distributed/transaction/relation_access_tracking.c @@ -15,22 +15,23 @@ */ #include "postgres.h" -#include "pg_version_constants.h" - #include "miscadmin.h" #include "access/xact.h" +#include "common/hashfn.h" +#include "utils/hsearch.h" +#include "utils/lsyscache.h" + +#include "pg_version_constants.h" + #include "distributed/colocation_utils.h" #include "distributed/hash_helpers.h" #include "distributed/listutils.h" +#include "distributed/metadata_cache.h" #include "distributed/multi_executor.h" #include "distributed/multi_join_order.h" #include "distributed/multi_partitioning_utils.h" -#include "distributed/metadata_cache.h" #include "distributed/relation_access_tracking.h" -#include "utils/hsearch.h" -#include "common/hashfn.h" -#include "utils/lsyscache.h" /* Config variables managed via guc.c */ diff --git a/src/backend/distributed/transaction/remote_transaction.c b/src/backend/distributed/transaction/remote_transaction.c index 0f6241793..3dc89c995 100644 --- a/src/backend/distributed/transaction/remote_transaction.c +++ b/src/backend/distributed/transaction/remote_transaction.c @@ -16,10 +16,12 @@ #include "postgres.h" #include "libpq-fe.h" - #include "miscadmin.h" #include "access/xact.h" +#include "utils/builtins.h" +#include "utils/hsearch.h" + #include "distributed/backend_data.h" #include "distributed/citus_safe_lib.h" #include "distributed/connection_management.h" @@ -32,8 +34,6 @@ #include "distributed/transaction_management.h" #include "distributed/transaction_recovery.h" #include "distributed/worker_manager.h" -#include "utils/builtins.h" -#include "utils/hsearch.h" #define PREPARED_TRANSACTION_NAME_FORMAT "citus_%u_%u_"UINT64_FORMAT "_%u" diff --git a/src/backend/distributed/transaction/transaction_management.c b/src/backend/distributed/transaction/transaction_management.c index d8b8dfe50..e2cfab331 100644 --- a/src/backend/distributed/transaction/transaction_management.c +++ b/src/backend/distributed/transaction/transaction_management.c @@ -14,15 +14,22 @@ #include "postgres.h" #include "libpq-fe.h" - #include "miscadmin.h" #include "access/twophase.h" #include "access/xact.h" #include "catalog/dependency.h" #include "common/hashfn.h" +#include "nodes/print.h" +#include "storage/fd.h" +#include "utils/datum.h" +#include "utils/guc.h" +#include "utils/hsearch.h" +#include "utils/memutils.h" + #include "distributed/backend_data.h" #include "distributed/citus_safe_lib.h" +#include "distributed/commands.h" #include "distributed/connection_management.h" #include "distributed/distributed_planner.h" #include "distributed/function_call_delegation.h" @@ -33,27 +40,20 @@ #include "distributed/locally_reserved_shared_connections.h" #include "distributed/maintenanced.h" #include "distributed/metadata/dependency.h" +#include "distributed/metadata_cache.h" #include "distributed/multi_executor.h" -#include "distributed/multi_logical_replication.h" #include "distributed/multi_explain.h" -#include "distributed/repartition_join_execution.h" -#include "distributed/replication_origin_session_utils.h" -#include "distributed/transaction_management.h" +#include "distributed/multi_logical_replication.h" #include "distributed/placement_connection.h" #include "distributed/relation_access_tracking.h" -#include "distributed/shared_connection_stats.h" +#include "distributed/repartition_join_execution.h" +#include "distributed/replication_origin_session_utils.h" #include "distributed/shard_cleaner.h" +#include "distributed/shared_connection_stats.h" #include "distributed/subplan_execution.h" +#include "distributed/transaction_management.h" #include "distributed/version_compat.h" #include "distributed/worker_log_messages.h" -#include "distributed/commands.h" -#include "distributed/metadata_cache.h" -#include "utils/hsearch.h" -#include "utils/guc.h" -#include "utils/memutils.h" -#include "utils/datum.h" -#include "storage/fd.h" -#include "nodes/print.h" CoordinatedTransactionState CurrentCoordinatedTransactionState = COORD_TRANS_NONE; diff --git a/src/backend/distributed/transaction/transaction_recovery.c b/src/backend/distributed/transaction/transaction_recovery.c index a833f5a46..0ec5ba0a3 100644 --- a/src/backend/distributed/transaction/transaction_recovery.c +++ b/src/backend/distributed/transaction/transaction_recovery.c @@ -12,22 +12,30 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - -#include "pg_version_constants.h" - -#include "miscadmin.h" -#include "libpq-fe.h" - #include #include +#include "postgres.h" + +#include "libpq-fe.h" +#include "miscadmin.h" + #include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" #include "access/relscan.h" #include "access/xact.h" #include "catalog/indexing.h" +#include "lib/stringinfo.h" +#include "storage/lmgr.h" +#include "storage/lock.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/memutils.h" +#include "utils/rel.h" + +#include "pg_version_constants.h" + #include "distributed/backend_data.h" #include "distributed/connection_management.h" #include "distributed/listutils.h" @@ -36,15 +44,8 @@ #include "distributed/remote_commands.h" #include "distributed/resource_lock.h" #include "distributed/transaction_recovery.h" -#include "distributed/worker_manager.h" #include "distributed/version_compat.h" -#include "lib/stringinfo.h" -#include "storage/lmgr.h" -#include "storage/lock.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/memutils.h" -#include "utils/rel.h" +#include "distributed/worker_manager.h" /* exports for SQL callable functions */ diff --git a/src/backend/distributed/transaction/worker_transaction.c b/src/backend/distributed/transaction/worker_transaction.c index 3399365aa..2af1e9a6c 100644 --- a/src/backend/distributed/transaction/worker_transaction.c +++ b/src/backend/distributed/transaction/worker_transaction.c @@ -11,28 +11,30 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" -#include "miscadmin.h" -#include "libpq-fe.h" - #include #include +#include "postgres.h" + +#include "libpq-fe.h" +#include "miscadmin.h" + #include "access/xact.h" +#include "utils/builtins.h" +#include "utils/memutils.h" + #include "distributed/connection_management.h" +#include "distributed/jsonbutils.h" #include "distributed/listutils.h" #include "distributed/metadata_cache.h" -#include "distributed/resource_lock.h" #include "distributed/metadata_sync.h" -#include "distributed/remote_commands.h" #include "distributed/pg_dist_node.h" #include "distributed/pg_dist_transaction.h" +#include "distributed/remote_commands.h" +#include "distributed/resource_lock.h" #include "distributed/transaction_recovery.h" #include "distributed/worker_manager.h" #include "distributed/worker_transaction.h" -#include "distributed/jsonbutils.h" -#include "utils/memutils.h" -#include "utils/builtins.h" static void SendCommandToRemoteMetadataNodesParams(const char *command, const char *user, int parameterCount, diff --git a/src/backend/distributed/utils/acquire_lock.c b/src/backend/distributed/utils/acquire_lock.c index f414167b3..d0f6193c2 100644 --- a/src/backend/distributed/utils/acquire_lock.c +++ b/src/backend/distributed/utils/acquire_lock.c @@ -22,12 +22,12 @@ #include "postgres.h" +#include "miscadmin.h" +#include "pgstat.h" #include "access/xact.h" #include "catalog/pg_type.h" #include "executor/spi.h" -#include "miscadmin.h" -#include "pgstat.h" #include "portability/instr_time.h" #include "storage/ipc.h" #include "storage/latch.h" diff --git a/src/backend/distributed/utils/aggregate_utils.c b/src/backend/distributed/utils/aggregate_utils.c index 773e0aa25..3fd584df9 100644 --- a/src/backend/distributed/utils/aggregate_utils.c +++ b/src/backend/distributed/utils/aggregate_utils.c @@ -16,11 +16,14 @@ #include "postgres.h" +#include "fmgr.h" +#include "miscadmin.h" +#include "pg_config_manual.h" + #include "access/htup_details.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "distributed/version_compat.h" #include "nodes/nodeFuncs.h" #include "utils/acl.h" #include "utils/builtins.h" @@ -28,9 +31,8 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" #include "utils/typcache.h" -#include "fmgr.h" -#include "miscadmin.h" -#include "pg_config_manual.h" + +#include "distributed/version_compat.h" PG_FUNCTION_INFO_V1(worker_partial_agg_sfunc); PG_FUNCTION_INFO_V1(worker_partial_agg_ffunc); diff --git a/src/backend/distributed/utils/array_type.c b/src/backend/distributed/utils/array_type.c index 70c7dde14..1c3663d43 100644 --- a/src/backend/distributed/utils/array_type.c +++ b/src/backend/distributed/utils/array_type.c @@ -10,16 +10,19 @@ */ #include "postgres.h" + #include "miscadmin.h" -#include "pg_version_compat.h" #include "catalog/pg_type.h" #include "nodes/pg_list.h" -#include "distributed/utils/array_type.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/lsyscache.h" +#include "pg_version_compat.h" + +#include "distributed/utils/array_type.h" + /* * DeconstructArrayObject takes in a single dimensional array, and deserializes diff --git a/src/backend/distributed/utils/background_jobs.c b/src/backend/distributed/utils/background_jobs.c index 2b5ce2dca..a7a124c74 100644 --- a/src/backend/distributed/utils/background_jobs.c +++ b/src/backend/distributed/utils/background_jobs.c @@ -27,17 +27,17 @@ #include "postgres.h" +#include "libpq-fe.h" +#include "pgstat.h" #include "safe_mem_lib.h" #include "access/xact.h" #include "commands/dbcommands.h" #include "common/hashfn.h" -#include "libpq-fe.h" #include "libpq/pqformat.h" #include "libpq/pqmq.h" #include "libpq/pqsignal.h" #include "parser/analyze.h" -#include "pgstat.h" #include "storage/dsm.h" #include "storage/ipc.h" #include "storage/procarray.h" @@ -62,9 +62,9 @@ #include "distributed/maintenanced.h" #include "distributed/metadata_cache.h" #include "distributed/metadata_utility.h" +#include "distributed/resource_lock.h" #include "distributed/shard_cleaner.h" #include "distributed/shard_rebalancer.h" -#include "distributed/resource_lock.h" /* Table-of-contents constants for our dynamic shared memory segment. */ #define CITUS_BACKGROUND_TASK_MAGIC 0x51028081 diff --git a/src/backend/distributed/utils/cancel_utils.c b/src/backend/distributed/utils/cancel_utils.c index 17383c034..f135212e4 100644 --- a/src/backend/distributed/utils/cancel_utils.c +++ b/src/backend/distributed/utils/cancel_utils.c @@ -8,7 +8,9 @@ #include "postgres.h" + #include "miscadmin.h" + #include "distributed/cancel_utils.h" diff --git a/src/backend/distributed/utils/citus_clauses.c b/src/backend/distributed/utils/citus_clauses.c index 82900ea1a..f88b173af 100644 --- a/src/backend/distributed/utils/citus_clauses.c +++ b/src/backend/distributed/utils/citus_clauses.c @@ -8,12 +8,6 @@ #include "postgres.h" -#include "distributed/citus_clauses.h" -#include "distributed/insert_select_planner.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_router_planner.h" -#include "distributed/version_compat.h" - #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "executor/executor.h" @@ -28,6 +22,12 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" +#include "distributed/citus_clauses.h" +#include "distributed/insert_select_planner.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_router_planner.h" +#include "distributed/version_compat.h" + /* private function declarations */ static bool IsVariableExpression(Node *node); diff --git a/src/backend/distributed/utils/citus_copyfuncs.c b/src/backend/distributed/utils/citus_copyfuncs.c index fe4429f04..e283a3034 100644 --- a/src/backend/distributed/utils/citus_copyfuncs.c +++ b/src/backend/distributed/utils/citus_copyfuncs.c @@ -11,11 +11,11 @@ */ #include "postgres.h" +#include "utils/datum.h" #include "distributed/citus_nodefuncs.h" -#include "distributed/multi_server_executor.h" #include "distributed/listutils.h" -#include "utils/datum.h" +#include "distributed/multi_server_executor.h" /* diff --git a/src/backend/distributed/utils/citus_depended_object.c b/src/backend/distributed/utils/citus_depended_object.c index 3b5a34b54..a160fcd56 100644 --- a/src/backend/distributed/utils/citus_depended_object.c +++ b/src/backend/distributed/utils/citus_depended_object.c @@ -7,6 +7,7 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "catalog/namespace.h" @@ -14,17 +15,17 @@ #include "catalog/pg_am.h" #include "catalog/pg_amop.h" #include "catalog/pg_amproc.h" -#include "catalog/pg_attribute.h" #include "catalog/pg_attrdef.h" -#include "catalog/pg_constraint.h" +#include "catalog/pg_attribute.h" #include "catalog/pg_class.h" +#include "catalog/pg_constraint.h" #include "catalog/pg_depend.h" #include "catalog/pg_enum.h" #include "catalog/pg_event_trigger.h" #include "catalog/pg_language.h" #include "catalog/pg_namespace.h" -#include "catalog/pg_operator.h" #include "catalog/pg_opclass.h" +#include "catalog/pg_operator.h" #include "catalog/pg_opfamily.h" #include "catalog/pg_proc.h" #include "catalog/pg_rewrite.h" @@ -35,12 +36,6 @@ #include "catalog/pg_ts_dict.h" #include "catalog/pg_ts_template.h" #include "catalog/pg_type.h" -#include "distributed/citus_depended_object.h" -#include "distributed/metadata_cache.h" -#include "distributed/commands.h" -#include "distributed/listutils.h" -#include "distributed/log_utils.h" -#include "distributed/shared_library_init.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/parsenodes.h" @@ -49,6 +44,13 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" +#include "distributed/citus_depended_object.h" +#include "distributed/commands.h" +#include "distributed/listutils.h" +#include "distributed/log_utils.h" +#include "distributed/metadata_cache.h" +#include "distributed/shared_library_init.h" + /* * GUC hides any objects, which depends on citus extension, from pg meta class queries, * it is intended to be used in vanilla tests to not break postgres test logs diff --git a/src/backend/distributed/utils/citus_nodefuncs.c b/src/backend/distributed/utils/citus_nodefuncs.c index 0998560fe..55b83e6c5 100644 --- a/src/backend/distributed/utils/citus_nodefuncs.c +++ b/src/backend/distributed/utils/citus_nodefuncs.c @@ -10,16 +10,17 @@ #include "postgres.h" +#include "catalog/pg_type.h" + #include "pg_version_constants.h" -#include "catalog/pg_type.h" -#include "distributed/citus_nodes.h" #include "distributed/citus_nodefuncs.h" +#include "distributed/citus_nodes.h" #include "distributed/coordinator_protocol.h" +#include "distributed/distributed_planner.h" #include "distributed/errormessage.h" #include "distributed/log_utils.h" #include "distributed/metadata_cache.h" -#include "distributed/distributed_planner.h" #include "distributed/multi_router_planner.h" #include "distributed/multi_server_executor.h" diff --git a/src/backend/distributed/utils/citus_safe_lib.c b/src/backend/distributed/utils/citus_safe_lib.c index cbd06fc50..2d504a644 100644 --- a/src/backend/distributed/utils/citus_safe_lib.c +++ b/src/backend/distributed/utils/citus_safe_lib.c @@ -12,16 +12,17 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" +#include -#include "pg_version_constants.h" +#include "postgres.h" #include "safe_lib.h" -#include +#include "lib/stringinfo.h" + +#include "pg_version_constants.h" #include "distributed/citus_safe_lib.h" -#include "lib/stringinfo.h" /* diff --git a/src/backend/distributed/utils/citus_stat_tenants.c b/src/backend/distributed/utils/citus_stat_tenants.c index aa813e152..6af5c0d58 100644 --- a/src/backend/distributed/utils/citus_stat_tenants.c +++ b/src/backend/distributed/utils/citus_stat_tenants.c @@ -8,21 +8,13 @@ *------------------------------------------------------------------------- */ +#include + #include "postgres.h" + #include "unistd.h" #include "access/hash.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/colocation_utils.h" -#include "distributed/distributed_planner.h" -#include "distributed/jsonbutils.h" -#include "distributed/log_utils.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_executor.h" -#include "distributed/tenant_schema_metadata.h" -#include "distributed/tuplestore.h" -#include "distributed/utils/citus_stat_tenants.h" #include "executor/execdesc.h" #include "storage/ipc.h" #include "storage/lwlock.h" @@ -34,7 +26,17 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" -#include +#include "distributed/citus_safe_lib.h" +#include "distributed/colocation_utils.h" +#include "distributed/distributed_planner.h" +#include "distributed/jsonbutils.h" +#include "distributed/listutils.h" +#include "distributed/log_utils.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_executor.h" +#include "distributed/tenant_schema_metadata.h" +#include "distributed/tuplestore.h" +#include "distributed/utils/citus_stat_tenants.h" #if (PG_VERSION_NUM >= PG_VERSION_15) #include "common/pg_prng.h" diff --git a/src/backend/distributed/utils/citus_version.c b/src/backend/distributed/utils/citus_version.c index 95945a30f..edae4f927 100644 --- a/src/backend/distributed/utils/citus_version.c +++ b/src/backend/distributed/utils/citus_version.c @@ -11,9 +11,10 @@ #include "postgres.h" -#include "citus_version.h" #include "utils/builtins.h" +#include "citus_version.h" + /* exports for SQL callable functions */ PG_FUNCTION_INFO_V1(citus_version); diff --git a/src/backend/distributed/utils/colocation_utils.c b/src/backend/distributed/utils/colocation_utils.c index e7007874b..b8db3c80f 100644 --- a/src/backend/distributed/utils/colocation_utils.c +++ b/src/backend/distributed/utils/colocation_utils.c @@ -10,6 +10,7 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "access/genam.h" @@ -19,28 +20,29 @@ #include "catalog/indexing.h" #include "catalog/pg_type.h" #include "commands/sequence.h" +#include "storage/lmgr.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" + #include "distributed/colocation_utils.h" #include "distributed/commands.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" #include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" #include "distributed/metadata_cache.h" #include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" #include "distributed/multi_logical_planner.h" #include "distributed/multi_partitioning_utils.h" #include "distributed/pg_dist_colocation.h" #include "distributed/resource_lock.h" #include "distributed/shardinterval_utils.h" #include "distributed/tenant_schema_metadata.h" -#include "distributed/version_compat.h" #include "distributed/utils/array_type.h" +#include "distributed/version_compat.h" #include "distributed/worker_protocol.h" #include "distributed/worker_transaction.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" /* local function forward declarations */ diff --git a/src/backend/distributed/utils/directory.c b/src/backend/distributed/utils/directory.c index b749b9cd6..bad585809 100644 --- a/src/backend/distributed/utils/directory.c +++ b/src/backend/distributed/utils/directory.c @@ -12,6 +12,7 @@ #include #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" diff --git a/src/backend/distributed/utils/distribution_column.c b/src/backend/distributed/utils/distribution_column.c index 474133f73..5927be612 100644 --- a/src/backend/distributed/utils/distribution_column.c +++ b/src/backend/distributed/utils/distribution_column.c @@ -12,19 +12,14 @@ #include "postgres.h" - #include "access/attnum.h" #include "access/heapam.h" #include "access/htup_details.h" -#include "distributed/distribution_column.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/version_compat.h" #include "nodes/makefuncs.h" #include "nodes/nodes.h" #include "nodes/primnodes.h" -#include "parser/scansup.h" #include "parser/parse_relation.h" +#include "parser/scansup.h" #include "utils/builtins.h" #include "utils/elog.h" #include "utils/errcodes.h" @@ -33,6 +28,11 @@ #include "utils/relcache.h" #include "utils/syscache.h" +#include "distributed/distribution_column.h" +#include "distributed/metadata_cache.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/version_compat.h" + /* exports for SQL callable functions */ PG_FUNCTION_INFO_V1(column_name_to_column); diff --git a/src/backend/distributed/utils/distribution_column_map.c b/src/backend/distributed/utils/distribution_column_map.c index c3c0db01f..43f9939b1 100644 --- a/src/backend/distributed/utils/distribution_column_map.c +++ b/src/backend/distributed/utils/distribution_column_map.c @@ -11,12 +11,13 @@ #include "postgres.h" #include "common/hashfn.h" +#include "nodes/primnodes.h" + #include "distributed/distribution_column.h" #include "distributed/listutils.h" #include "distributed/multi_join_order.h" #include "distributed/multi_partitioning_utils.h" #include "distributed/utils/distribution_column_map.h" -#include "nodes/primnodes.h" /* diff --git a/src/backend/distributed/utils/enable_ssl.c b/src/backend/distributed/utils/enable_ssl.c index 35b1e0f1a..261225450 100644 --- a/src/backend/distributed/utils/enable_ssl.c +++ b/src/backend/distributed/utils/enable_ssl.c @@ -18,16 +18,18 @@ * it otherwise we get warnings about redefining this value. This needs to be * done before including libpq.h. */ +#include "miscadmin.h" + +#include "libpq/libpq.h" +#include "nodes/parsenodes.h" +#include "postmaster/postmaster.h" +#include "utils/guc.h" + #include "pg_version_constants.h" #include "distributed/connection_management.h" #include "distributed/memutils.h" #include "distributed/worker_protocol.h" -#include "libpq/libpq.h" -#include "miscadmin.h" -#include "nodes/parsenodes.h" -#include "postmaster/postmaster.h" -#include "utils/guc.h" #ifdef USE_OPENSSL #include "openssl/dsa.h" diff --git a/src/backend/distributed/utils/errormessage.c b/src/backend/distributed/utils/errormessage.c index 72758f9ca..dbc55019d 100644 --- a/src/backend/distributed/utils/errormessage.c +++ b/src/backend/distributed/utils/errormessage.c @@ -6,13 +6,14 @@ */ #include "postgres.h" -#include "utils/memutils.h" #include "common/sha2.h" +#include "utils/builtins.h" +#include "utils/memutils.h" + #include "distributed/citus_nodes.h" #include "distributed/errormessage.h" #include "distributed/log_utils.h" -#include "utils/builtins.h" /* diff --git a/src/backend/distributed/utils/foreign_key_relationship.c b/src/backend/distributed/utils/foreign_key_relationship.c index d69d9044d..1abb7ae07 100644 --- a/src/backend/distributed/utils/foreign_key_relationship.c +++ b/src/backend/distributed/utils/foreign_key_relationship.c @@ -12,29 +12,29 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "access/genam.h" #include "access/htup_details.h" #include "access/stratnum.h" #include "access/table.h" #include "catalog/pg_constraint.h" -#include "distributed/commands.h" -#include "distributed/hash_helpers.h" -#include "distributed/foreign_key_relationship.h" -#include "distributed/hash_helpers.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/version_compat.h" +#include "common/hashfn.h" #include "nodes/pg_list.h" #include "storage/lockdefs.h" #include "utils/catcache.h" #include "utils/fmgroids.h" #include "utils/hsearch.h" -#include "common/hashfn.h" #include "utils/inval.h" #include "utils/memutils.h" +#include "pg_version_constants.h" + +#include "distributed/commands.h" +#include "distributed/foreign_key_relationship.h" +#include "distributed/hash_helpers.h" +#include "distributed/listutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/version_compat.h" + /* * ForeignConstraintRelationshipGraph holds the graph data structure for foreign constraint relationship diff --git a/src/backend/distributed/utils/function.c b/src/backend/distributed/utils/function.c index bfb59181c..dcfcff6fe 100644 --- a/src/backend/distributed/utils/function.c +++ b/src/backend/distributed/utils/function.c @@ -10,13 +10,15 @@ */ #include "postgres.h" + #include "fmgr.h" #include "miscadmin.h" #include "commands/defrem.h" -#include "distributed/utils/function.h" #include "utils/lsyscache.h" +#include "distributed/utils/function.h" + /* * GetFunctionInfo first resolves the operator for the given data type, access diff --git a/src/backend/distributed/utils/function_utils.c b/src/backend/distributed/utils/function_utils.c index 48f878e13..0770b8cb9 100644 --- a/src/backend/distributed/utils/function_utils.c +++ b/src/backend/distributed/utils/function_utils.c @@ -10,12 +10,13 @@ #include "postgres.h" #include "catalog/namespace.h" -#include "distributed/function_utils.h" -#include "distributed/version_compat.h" #include "executor/executor.h" #include "utils/builtins.h" #include "utils/regproc.h" +#include "distributed/function_utils.h" +#include "distributed/version_compat.h" + /* * FunctionOid searches for a function that has the given name and the given diff --git a/src/backend/distributed/utils/hash_helpers.c b/src/backend/distributed/utils/hash_helpers.c index d2bfe38fa..2aaaaef12 100644 --- a/src/backend/distributed/utils/hash_helpers.c +++ b/src/backend/distributed/utils/hash_helpers.c @@ -11,9 +11,10 @@ #include "postgres.h" #include "common/hashfn.h" +#include "utils/hsearch.h" + #include "distributed/citus_safe_lib.h" #include "distributed/hash_helpers.h" -#include "utils/hsearch.h" /* diff --git a/src/backend/distributed/utils/jsonbutils.c b/src/backend/distributed/utils/jsonbutils.c index 4855ee004..47e6aa2c7 100644 --- a/src/backend/distributed/utils/jsonbutils.c +++ b/src/backend/distributed/utils/jsonbutils.c @@ -1,21 +1,21 @@ #include "postgres.h" -#include "pg_version_compat.h" +#include "fmgr.h" #include "catalog/namespace.h" #include "catalog/pg_class.h" #include "catalog/pg_collation.h" #include "catalog/pg_type.h" - #include "utils/array.h" +#include "utils/builtins.h" #include "utils/json.h" +#include "utils/lsyscache.h" + +#include "pg_version_compat.h" + #include "distributed/jsonbutils.h" #include "distributed/metadata_cache.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "fmgr.h" - /* * ExtractFieldJsonb gets value of fieldName from jsonbDoc and puts it diff --git a/src/backend/distributed/utils/listutils.c b/src/backend/distributed/utils/listutils.c index dd54443c4..eddef1fea 100644 --- a/src/backend/distributed/utils/listutils.c +++ b/src/backend/distributed/utils/listutils.c @@ -10,15 +10,17 @@ */ #include "postgres.h" + #include "c.h" #include "port.h" -#include "utils/lsyscache.h" #include "lib/stringinfo.h" +#include "nodes/pg_list.h" +#include "utils/lsyscache.h" +#include "utils/memutils.h" + #include "distributed/citus_safe_lib.h" #include "distributed/listutils.h" -#include "nodes/pg_list.h" -#include "utils/memutils.h" /* diff --git a/src/backend/distributed/utils/log_utils.c b/src/backend/distributed/utils/log_utils.c index 7d808591b..2e9d94c44 100644 --- a/src/backend/distributed/utils/log_utils.c +++ b/src/backend/distributed/utils/log_utils.c @@ -9,16 +9,15 @@ #include "postgres.h" +#include "common/cryptohash.h" +#include "common/sha2.h" +#include "utils/builtins.h" +#include "utils/guc.h" + #include "pg_version_constants.h" -#include "utils/guc.h" -#include "distributed/log_utils.h" #include "distributed/errormessage.h" -#include "common/sha2.h" - -#include "utils/builtins.h" - -#include "common/cryptohash.h" +#include "distributed/log_utils.h" /* diff --git a/src/backend/distributed/utils/maintenanced.c b/src/backend/distributed/utils/maintenanced.c index 851335abe..9cef13539 100644 --- a/src/backend/distributed/utils/maintenanced.c +++ b/src/backend/distributed/utils/maintenanced.c @@ -14,52 +14,52 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - -#include "pg_version_constants.h" - #include +#include "postgres.h" + #include "miscadmin.h" #include "pgstat.h" #include "access/xact.h" #include "access/xlog.h" -#include "catalog/pg_extension.h" -#include "citus_version.h" +#include "catalog/namespace.h" #include "catalog/pg_authid.h" +#include "catalog/pg_extension.h" #include "catalog/pg_namespace.h" #include "commands/async.h" #include "commands/extension.h" +#include "common/hashfn.h" #include "libpq/pqsignal.h" -#include "catalog/namespace.h" -#include "distributed/background_jobs.h" -#include "distributed/citus_safe_lib.h" -#include "distributed/distributed_deadlock_detection.h" -#include "distributed/maintenanced.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/shard_cleaner.h" -#include "distributed/metadata_sync.h" -#include "distributed/query_stats.h" -#include "distributed/statistics_collection.h" -#include "distributed/transaction_recovery.h" -#include "distributed/version_compat.h" #include "nodes/makefuncs.h" #include "postmaster/bgworker.h" #include "postmaster/postmaster.h" -#include "nodes/makefuncs.h" #include "storage/ipc.h" -#include "storage/proc.h" #include "storage/latch.h" #include "storage/lmgr.h" #include "storage/lwlock.h" +#include "storage/proc.h" #include "tcop/tcopprot.h" -#include "common/hashfn.h" #include "utils/builtins.h" -#include "utils/memutils.h" #include "utils/lsyscache.h" +#include "utils/memutils.h" + +#include "citus_version.h" +#include "pg_version_constants.h" + +#include "distributed/background_jobs.h" +#include "distributed/citus_safe_lib.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distributed_deadlock_detection.h" +#include "distributed/maintenanced.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/query_stats.h" #include "distributed/resource_lock.h" +#include "distributed/shard_cleaner.h" +#include "distributed/statistics_collection.h" +#include "distributed/transaction_recovery.h" +#include "distributed/version_compat.h" /* * Shared memory data for all maintenance workers. diff --git a/src/backend/distributed/utils/multi_partitioning_utils.c b/src/backend/distributed/utils/multi_partitioning_utils.c index 404d792f9..ede2008ca 100644 --- a/src/backend/distributed/utils/multi_partitioning_utils.c +++ b/src/backend/distributed/utils/multi_partitioning_utils.c @@ -6,7 +6,7 @@ */ #include "postgres.h" -#include "pg_version_constants.h" +#include "pgstat.h" #include "access/genam.h" #include "access/heapam.h" @@ -19,8 +19,21 @@ #include "catalog/pg_inherits.h" #include "commands/tablecmds.h" #include "common/string.h" -#include "distributed/citus_nodes.h" +#include "lib/stringinfo.h" +#include "nodes/makefuncs.h" +#include "nodes/pg_list.h" +#include "partitioning/partdesc.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" +#include "utils/syscache.h" +#include "utils/varlena.h" + +#include "pg_version_constants.h" + #include "distributed/adaptive_executor.h" +#include "distributed/citus_nodes.h" #include "distributed/citus_ruleutils.h" #include "distributed/colocation_utils.h" #include "distributed/commands.h" @@ -36,17 +49,6 @@ #include "distributed/shardinterval_utils.h" #include "distributed/version_compat.h" #include "distributed/worker_protocol.h" -#include "lib/stringinfo.h" -#include "nodes/makefuncs.h" -#include "nodes/pg_list.h" -#include "pgstat.h" -#include "partitioning/partdesc.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" -#include "utils/syscache.h" -#include "utils/varlena.h" static char * PartitionBound(Oid partitionId); static Relation try_relation_open_nolock(Oid relationId); diff --git a/src/backend/distributed/utils/namespace_utils.c b/src/backend/distributed/utils/namespace_utils.c index 4f822b7d2..a5401b00c 100644 --- a/src/backend/distributed/utils/namespace_utils.c +++ b/src/backend/distributed/utils/namespace_utils.c @@ -11,10 +11,11 @@ #include "postgres.h" -#include "distributed/namespace_utils.h" #include "utils/guc.h" #include "utils/regproc.h" +#include "distributed/namespace_utils.h" + /* * We use the equivalent of a function SET option to allow the setting to * persist for the exact duration of the transaction, guc.c takes care of diff --git a/src/backend/distributed/utils/param_utils.c b/src/backend/distributed/utils/param_utils.c index 8aefecb7d..a500b5b65 100644 --- a/src/backend/distributed/utils/param_utils.c +++ b/src/backend/distributed/utils/param_utils.c @@ -9,12 +9,13 @@ #include "postgres.h" -#include -#include -#include -#include -#include -#include +#include "nodes/bitmapset.h" +#include "nodes/nodeFuncs.h" +#include "nodes/nodes.h" +#include "nodes/params.h" +#include "nodes/parsenodes.h" +#include "nodes/primnodes.h" + #include "distributed/param_utils.h" /* diff --git a/src/backend/distributed/utils/priority.c b/src/backend/distributed/utils/priority.c index 2e7972d2d..ceb75ac26 100644 --- a/src/backend/distributed/utils/priority.c +++ b/src/backend/distributed/utils/priority.c @@ -7,13 +7,13 @@ *------------------------------------------------------------------------- */ -#include "postgres.h" - -#include #include #include #include #include +#include + +#include "postgres.h" #include "distributed/priority.h" diff --git a/src/backend/distributed/utils/query_utils.c b/src/backend/distributed/utils/query_utils.c index 4ae49ed81..ac33bdd52 100644 --- a/src/backend/distributed/utils/query_utils.c +++ b/src/backend/distributed/utils/query_utils.c @@ -11,13 +11,14 @@ */ #include "postgres.h" -#include "nodes/primnodes.h" #include "catalog/pg_class.h" +#include "nodes/nodeFuncs.h" +#include "nodes/primnodes.h" + +#include "distributed/listutils.h" #include "distributed/query_utils.h" #include "distributed/version_compat.h" -#include "distributed/listutils.h" -#include "nodes/nodeFuncs.h" static bool CitusQueryableRangeTableRelation(RangeTblEntry *rangeTableEntry); diff --git a/src/backend/distributed/utils/reference_table_utils.c b/src/backend/distributed/utils/reference_table_utils.c index 314044ab5..b1710c1d6 100644 --- a/src/backend/distributed/utils/reference_table_utils.c +++ b/src/backend/distributed/utils/reference_table_utils.c @@ -10,19 +10,27 @@ */ #include "postgres.h" + #include "miscadmin.h" +#include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" -#include "access/genam.h" +#include "postmaster/postmaster.h" +#include "storage/lmgr.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" + #include "distributed/backend_data.h" #include "distributed/colocation_utils.h" #include "distributed/commands.h" -#include "distributed/listutils.h" #include "distributed/coordinator_protocol.h" -#include "distributed/metadata_utility.h" +#include "distributed/listutils.h" #include "distributed/metadata_cache.h" #include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" #include "distributed/multi_executor.h" #include "distributed/multi_logical_planner.h" #include "distributed/reference_table_utils.h" @@ -33,12 +41,6 @@ #include "distributed/transaction_management.h" #include "distributed/worker_manager.h" #include "distributed/worker_transaction.h" -#include "postmaster/postmaster.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" /* local function forward declarations */ static List * WorkersWithoutReferenceTablePlacement(uint64 shardId, LOCKMODE lockMode); diff --git a/src/backend/distributed/utils/replication_origin_session_utils.c b/src/backend/distributed/utils/replication_origin_session_utils.c index 800d82ef7..370b061be 100644 --- a/src/backend/distributed/utils/replication_origin_session_utils.c +++ b/src/backend/distributed/utils/replication_origin_session_utils.c @@ -7,13 +7,16 @@ * *------------------------------------------------------------------------- */ +#include "postgres.h" -#include "distributed/replication_origin_session_utils.h" -#include "distributed/remote_commands.h" -#include "distributed/metadata_cache.h" -#include "utils/builtins.h" #include "miscadmin.h" +#include "utils/builtins.h" + +#include "distributed/metadata_cache.h" +#include "distributed/remote_commands.h" +#include "distributed/replication_origin_session_utils.h" + static bool IsRemoteReplicationOriginSessionSetup(MultiConnection *connection); static void SetupMemoryContextResetReplicationOriginHandler(void); diff --git a/src/backend/distributed/utils/resource_lock.c b/src/backend/distributed/utils/resource_lock.c index c76830c1d..13e88a16e 100644 --- a/src/backend/distributed/utils/resource_lock.c +++ b/src/backend/distributed/utils/resource_lock.c @@ -14,39 +14,41 @@ */ #include "postgres.h" + #include "c.h" #include "miscadmin.h" #include "access/xact.h" #include "catalog/namespace.h" #include "commands/tablecmds.h" -#include "distributed/colocation_utils.h" -#include "distributed/commands.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" -#include "distributed/multi_executor.h" -#include "distributed/multi_join_order.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/distributed_planner.h" -#include "distributed/relay_utility.h" -#include "distributed/reference_table_utils.h" -#include "distributed/remote_commands.h" -#include "distributed/resource_lock.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/worker_protocol.h" -#include "distributed/worker_transaction.h" -#include "distributed/utils/array_type.h" -#include "distributed/version_compat.h" -#include "distributed/local_executor.h" -#include "distributed/worker_shard_visibility.h" #include "storage/lmgr.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/varlena.h" +#include "distributed/colocation_utils.h" +#include "distributed/commands.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distributed_planner.h" +#include "distributed/listutils.h" +#include "distributed/local_executor.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_executor.h" +#include "distributed/multi_join_order.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/reference_table_utils.h" +#include "distributed/relay_utility.h" +#include "distributed/remote_commands.h" +#include "distributed/resource_lock.h" +#include "distributed/shardinterval_utils.h" +#include "distributed/utils/array_type.h" +#include "distributed/version_compat.h" +#include "distributed/worker_protocol.h" +#include "distributed/worker_shard_visibility.h" +#include "distributed/worker_transaction.h" + #define LOCK_RELATION_IF_EXISTS \ "SELECT pg_catalog.lock_relation_if_exists(%s, %s);" diff --git a/src/backend/distributed/utils/role.c b/src/backend/distributed/utils/role.c index 3a9a90f9f..9e92a3290 100644 --- a/src/backend/distributed/utils/role.c +++ b/src/backend/distributed/utils/role.c @@ -10,13 +10,15 @@ */ #include "postgres.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/worker_protocol.h" #include "fmgr.h" + #include "tcop/dest.h" #include "tcop/utility.h" #include "utils/builtins.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/worker_protocol.h" + PG_FUNCTION_INFO_V1(alter_role_if_exists); PG_FUNCTION_INFO_V1(worker_create_or_alter_role); diff --git a/src/backend/distributed/utils/shard_utils.c b/src/backend/distributed/utils/shard_utils.c index d6d41f192..cd688b745 100644 --- a/src/backend/distributed/utils/shard_utils.c +++ b/src/backend/distributed/utils/shard_utils.c @@ -12,9 +12,11 @@ #include "postgres.h" #include "miscadmin.h" + #include "utils/builtins.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" + #include "distributed/coordinator_protocol.h" #include "distributed/listutils.h" #include "distributed/log_utils.h" diff --git a/src/backend/distributed/utils/shardinterval_utils.c b/src/backend/distributed/utils/shardinterval_utils.c index 6c18e201e..16d43ffdc 100644 --- a/src/backend/distributed/utils/shardinterval_utils.c +++ b/src/backend/distributed/utils/shardinterval_utils.c @@ -8,23 +8,25 @@ * *------------------------------------------------------------------------- */ -#include "stdint.h" #include "postgres.h" +#include "stdint.h" + #include "access/nbtree.h" #include "catalog/pg_am.h" #include "catalog/pg_collation.h" #include "catalog/pg_type.h" +#include "utils/catcache.h" +#include "utils/memutils.h" + +#include "distributed/distributed_planner.h" #include "distributed/listutils.h" #include "distributed/metadata_cache.h" #include "distributed/multi_join_order.h" -#include "distributed/distributed_planner.h" +#include "distributed/pg_dist_partition.h" #include "distributed/shard_pruning.h" #include "distributed/shardinterval_utils.h" -#include "distributed/pg_dist_partition.h" #include "distributed/worker_protocol.h" -#include "utils/catcache.h" -#include "utils/memutils.h" /* diff --git a/src/backend/distributed/utils/statistics_collection.c b/src/backend/distributed/utils/statistics_collection.c index a442aac95..1cadea968 100644 --- a/src/backend/distributed/utils/statistics_collection.c +++ b/src/backend/distributed/utils/statistics_collection.c @@ -10,10 +10,12 @@ #include "postgres.h" -#include "citus_version.h" #include "fmgr.h" + #include "utils/uuid.h" +#include "citus_version.h" + #if defined(HAVE_LIBCURL) && defined(ENABLE_CITUS_STATISTICS_COLLECTION) bool EnableStatisticsCollection = true; /* send basic usage statistics to Citus */ #else @@ -28,18 +30,19 @@ PG_FUNCTION_INFO_V1(citus_server_id); #include #include "access/xact.h" +#include "lib/stringinfo.h" +#include "utils/builtins.h" +#include "utils/fmgrprotos.h" +#include "utils/json.h" +#include "utils/jsonb.h" + #include "distributed/listutils.h" #include "distributed/metadata_cache.h" #include "distributed/multi_join_order.h" #include "distributed/shardinterval_utils.h" #include "distributed/statistics_collection.h" -#include "distributed/worker_manager.h" #include "distributed/version_compat.h" -#include "lib/stringinfo.h" -#include "utils/builtins.h" -#include "utils/json.h" -#include "utils/jsonb.h" -#include "utils/fmgrprotos.h" +#include "distributed/worker_manager.h" static size_t StatisticsCallback(char *contents, size_t size, size_t count, void *userData); diff --git a/src/backend/distributed/utils/task_execution_utils.c b/src/backend/distributed/utils/task_execution_utils.c index 7251514b5..5a6f74283 100644 --- a/src/backend/distributed/utils/task_execution_utils.c +++ b/src/backend/distributed/utils/task_execution_utils.c @@ -1,16 +1,21 @@ -#include "postgres.h" -#include "miscadmin.h" - +#include #include #include -#include + +#include "postgres.h" + +#include "miscadmin.h" + +#include "commands/dbcommands.h" +#include "common/hashfn.h" +#include "storage/fd.h" +#include "utils/builtins.h" +#include "utils/hsearch.h" +#include "utils/timestamp.h" #include "pg_version_constants.h" -#include "common/hashfn.h" - -#include "commands/dbcommands.h" #include "distributed/citus_custom_scan.h" #include "distributed/citus_nodes.h" #include "distributed/connection_management.h" @@ -27,12 +32,8 @@ #include "distributed/resource_lock.h" #include "distributed/subplan_execution.h" #include "distributed/task_execution_utils.h" -#include "distributed/worker_protocol.h" #include "distributed/version_compat.h" -#include "storage/fd.h" -#include "utils/builtins.h" -#include "utils/hsearch.h" -#include "utils/timestamp.h" +#include "distributed/worker_protocol.h" /* TaskMapKey is used as a key in task hash */ typedef struct TaskMapKey diff --git a/src/backend/distributed/utils/tenant_schema_metadata.c b/src/backend/distributed/utils/tenant_schema_metadata.c index e634795a2..57ae1d151 100644 --- a/src/backend/distributed/utils/tenant_schema_metadata.c +++ b/src/backend/distributed/utils/tenant_schema_metadata.c @@ -14,14 +14,15 @@ #include "access/genam.h" #include "access/htup.h" #include "access/table.h" +#include "storage/lockdefs.h" +#include "utils/fmgroids.h" +#include "utils/relcache.h" + #include "distributed/colocation_utils.h" #include "distributed/metadata_cache.h" #include "distributed/metadata_sync.h" #include "distributed/pg_dist_schema.h" #include "distributed/tenant_schema_metadata.h" -#include "storage/lockdefs.h" -#include "utils/relcache.h" -#include "utils/fmgroids.h" /* diff --git a/src/backend/distributed/utils/tuplestore.c b/src/backend/distributed/utils/tuplestore.c index 4473c1f3e..ea59e7040 100644 --- a/src/backend/distributed/utils/tuplestore.c +++ b/src/backend/distributed/utils/tuplestore.c @@ -10,9 +10,10 @@ #include "postgres.h" -#include "distributed/tuplestore.h" #include "miscadmin.h" +#include "distributed/tuplestore.h" + /* * CheckTuplestoreReturn checks if a tuplestore can be returned in the callsite * of the UDF. diff --git a/src/backend/distributed/utils/type_utils.c b/src/backend/distributed/utils/type_utils.c index 66a924a02..fca331374 100644 --- a/src/backend/distributed/utils/type_utils.c +++ b/src/backend/distributed/utils/type_utils.c @@ -10,13 +10,14 @@ */ #include "postgres.h" + #include "fmgr.h" #include "libpq-fe.h" #include "catalog/pg_type.h" +#include "libpq/pqformat.h" #include "nodes/pg_list.h" #include "utils/syscache.h" -#include "libpq/pqformat.h" #include "distributed/causal_clock.h" diff --git a/src/backend/distributed/worker/task_tracker_protocol.c b/src/backend/distributed/worker/task_tracker_protocol.c index 9b2016f67..abe1f765e 100644 --- a/src/backend/distributed/worker/task_tracker_protocol.c +++ b/src/backend/distributed/worker/task_tracker_protocol.c @@ -12,6 +12,7 @@ */ #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" diff --git a/src/backend/distributed/worker/worker_create_or_replace.c b/src/backend/distributed/worker/worker_create_or_replace.c index 804e71125..2fab84ac6 100644 --- a/src/backend/distributed/worker/worker_create_or_replace.c +++ b/src/backend/distributed/worker/worker_create_or_replace.c @@ -9,23 +9,24 @@ #include "postgres.h" +#include "fmgr.h" +#include "funcapi.h" + #include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/pg_collation.h" #include "catalog/pg_proc.h" #include "catalog/pg_ts_config.h" #include "catalog/pg_type.h" -#include "fmgr.h" -#include "funcapi.h" #include "nodes/makefuncs.h" #include "nodes/nodes.h" #include "parser/parse_type.h" #include "tcop/dest.h" #include "tcop/utility.h" #include "utils/builtins.h" -#include "utils/syscache.h" #include "utils/lsyscache.h" #include "utils/regproc.h" +#include "utils/syscache.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" diff --git a/src/backend/distributed/worker/worker_data_fetch_protocol.c b/src/backend/distributed/worker/worker_data_fetch_protocol.c index 11fdda287..f51d9c80c 100644 --- a/src/backend/distributed/worker/worker_data_fetch_protocol.c +++ b/src/backend/distributed/worker/worker_data_fetch_protocol.c @@ -12,12 +12,14 @@ *------------------------------------------------------------------------- */ +#include +#include + #include "postgres.h" + #include "funcapi.h" #include "libpq-fe.h" #include "miscadmin.h" -#include -#include #include "access/xact.h" #include "catalog/dependency.h" @@ -27,6 +29,17 @@ #include "commands/dbcommands.h" #include "commands/extension.h" #include "commands/sequence.h" +#include "executor/spi.h" +#include "nodes/makefuncs.h" +#include "parser/parse_relation.h" +#include "storage/lmgr.h" +#include "tcop/tcopprot.h" +#include "tcop/utility.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/regproc.h" +#include "utils/varlena.h" + #include "distributed/citus_ruleutils.h" #include "distributed/commands.h" #include "distributed/commands/multi_copy.h" @@ -44,20 +57,9 @@ #include "distributed/relay_utility.h" #include "distributed/remote_commands.h" #include "distributed/resource_lock.h" - +#include "distributed/version_compat.h" #include "distributed/worker_create_or_replace.h" #include "distributed/worker_protocol.h" -#include "distributed/version_compat.h" -#include "executor/spi.h" -#include "nodes/makefuncs.h" -#include "parser/parse_relation.h" -#include "storage/lmgr.h" -#include "tcop/tcopprot.h" -#include "tcop/utility.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "utils/regproc.h" -#include "utils/varlena.h" /* Local functions forward declarations */ diff --git a/src/backend/distributed/worker/worker_drop_protocol.c b/src/backend/distributed/worker/worker_drop_protocol.c index 16b7bb66a..6d7b5326a 100644 --- a/src/backend/distributed/worker/worker_drop_protocol.c +++ b/src/backend/distributed/worker/worker_drop_protocol.c @@ -19,22 +19,23 @@ #include "catalog/dependency.h" #include "catalog/pg_depend.h" #include "catalog/pg_foreign_server.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/distribution_column.h" -#include "distributed/listutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/commands/utility_hook.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata/distobject.h" -#include "distributed/multi_partitioning_utils.h" -#include "distributed/worker_protocol.h" #include "foreign/foreign.h" #include "tcop/utility.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/commands/utility_hook.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/distribution_column.h" +#include "distributed/listutils.h" +#include "distributed/metadata/distobject.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_partitioning_utils.h" +#include "distributed/worker_protocol.h" + PG_FUNCTION_INFO_V1(worker_drop_distributed_table); PG_FUNCTION_INFO_V1(worker_drop_shell_table); PG_FUNCTION_INFO_V1(worker_drop_sequence_dependency); diff --git a/src/backend/distributed/worker/worker_partition_protocol.c b/src/backend/distributed/worker/worker_partition_protocol.c index 2291633d4..cdbda6d3e 100644 --- a/src/backend/distributed/worker/worker_partition_protocol.c +++ b/src/backend/distributed/worker/worker_partition_protocol.c @@ -10,6 +10,7 @@ */ #include "postgres.h" + #include "funcapi.h" #include "miscadmin.h" diff --git a/src/backend/distributed/worker/worker_shard_visibility.c b/src/backend/distributed/worker/worker_shard_visibility.c index 63a9cca34..49131ef6d 100644 --- a/src/backend/distributed/worker/worker_shard_visibility.c +++ b/src/backend/distributed/worker/worker_shard_visibility.c @@ -8,26 +8,28 @@ */ #include "postgres.h" + #include "miscadmin.h" #include "catalog/index.h" #include "catalog/namespace.h" #include "catalog/pg_class.h" #include "catalog/pg_type.h" -#include "distributed/backend_data.h" -#include "distributed/metadata_cache.h" -#include "distributed/coordinator_protocol.h" -#include "distributed/listutils.h" -#include "distributed/local_executor.h" -#include "distributed/query_colocation_checker.h" -#include "distributed/worker_protocol.h" -#include "distributed/worker_shard_visibility.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "utils/lsyscache.h" #include "utils/syscache.h" #include "utils/varlena.h" +#include "distributed/backend_data.h" +#include "distributed/coordinator_protocol.h" +#include "distributed/listutils.h" +#include "distributed/local_executor.h" +#include "distributed/metadata_cache.h" +#include "distributed/query_colocation_checker.h" +#include "distributed/worker_protocol.h" +#include "distributed/worker_shard_visibility.h" + /* HideShardsMode is used to determine whether to hide shards */ typedef enum HideShardsMode diff --git a/src/backend/distributed/worker/worker_sql_task_protocol.c b/src/backend/distributed/worker/worker_sql_task_protocol.c index 38dba5e35..2cf48fc6f 100644 --- a/src/backend/distributed/worker/worker_sql_task_protocol.c +++ b/src/backend/distributed/worker/worker_sql_task_protocol.c @@ -9,20 +9,23 @@ *------------------------------------------------------------------------- */ +/* necessary to get S_IRUSR, S_IWUSR definitions on illumos */ +#include + #include "postgres.h" + #include "funcapi.h" #include "pgstat.h" +#include "utils/builtins.h" +#include "utils/memutils.h" + #include "distributed/commands/multi_copy.h" #include "distributed/multi_executor.h" #include "distributed/transmit.h" #include "distributed/version_compat.h" #include "distributed/worker_protocol.h" -#include "utils/builtins.h" -#include "utils/memutils.h" -/* necessary to get S_IRUSR, S_IWUSR definitions on illumos */ -#include #define COPY_BUFFER_SIZE (4 * 1024 * 1024) diff --git a/src/backend/distributed/worker/worker_truncate_trigger_protocol.c b/src/backend/distributed/worker/worker_truncate_trigger_protocol.c index dc4e7ffd8..3f8f96b2d 100644 --- a/src/backend/distributed/worker/worker_truncate_trigger_protocol.c +++ b/src/backend/distributed/worker/worker_truncate_trigger_protocol.c @@ -12,16 +12,18 @@ */ #include "postgres.h" + #include "fmgr.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/metadata_utility.h" -#include "distributed/metadata_cache.h" -#include "distributed/metadata_sync.h" #include "utils/elog.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_sync.h" +#include "distributed/metadata_utility.h" + PG_FUNCTION_INFO_V1(worker_create_truncate_trigger); diff --git a/src/include/columnar/columnar.h b/src/include/columnar/columnar.h index 64cf745e1..66413dddd 100644 --- a/src/include/columnar/columnar.h +++ b/src/include/columnar/columnar.h @@ -14,21 +14,24 @@ #include "postgres.h" #include "fmgr.h" + #include "lib/stringinfo.h" #include "nodes/parsenodes.h" -#include "pg_version_compat.h" #include "storage/bufpage.h" #include "storage/lockdefs.h" +#include "utils/relcache.h" +#include "utils/snapmgr.h" + +#include "pg_version_compat.h" + +#include "columnar/columnar_compression.h" +#include "columnar/columnar_metadata.h" + #if PG_VERSION_NUM >= PG_VERSION_16 #include "storage/relfilelocator.h" #else #include "storage/relfilenode.h" #endif -#include "utils/relcache.h" -#include "utils/snapmgr.h" - -#include "columnar/columnar_compression.h" -#include "columnar/columnar_metadata.h" #define COLUMNAR_AM_NAME "columnar" #define COLUMNAR_MODULE_NAME "citus_columnar" diff --git a/src/include/columnar/columnar_metadata.h b/src/include/columnar/columnar_metadata.h index 2af4354a0..64867ae2f 100644 --- a/src/include/columnar/columnar_metadata.h +++ b/src/include/columnar/columnar_metadata.h @@ -12,7 +12,17 @@ #ifndef COLUMNAR_METADATA_H #define COLUMNAR_METADATA_H +#include "postgres.h" + #include "pg_version_compat.h" +#include "pg_version_constants.h" + +#if PG_VERSION_NUM >= PG_VERSION_16 +#include "storage/relfilelocator.h" +#else +#include "storage/relfilenode.h" +#endif + /* * StripeMetadata represents information about a stripe. This information is diff --git a/src/include/columnar/columnar_tableam.h b/src/include/columnar/columnar_tableam.h index 657491ef8..18331bd70 100644 --- a/src/include/columnar/columnar_tableam.h +++ b/src/include/columnar/columnar_tableam.h @@ -1,16 +1,18 @@ #ifndef COLUMNAR_TABLEAM_H #define COLUMNAR_TABLEAM_H -#include "citus_version.h" - #include "postgres.h" + #include "fmgr.h" -#include "access/tableam.h" -#include "access/skey.h" -#include "nodes/bitmapset.h" + #include "access/heapam.h" +#include "access/skey.h" +#include "access/tableam.h" #include "catalog/indexing.h" +#include "nodes/bitmapset.h" #include "utils/acl.h" +#include "citus_version.h" + /* * Number of valid ItemPointer Offset's for "row number" <> "ItemPointer" * mapping. diff --git a/src/include/distributed/backend_data.h b/src/include/distributed/backend_data.h index 1fcd31141..8014fe5a6 100644 --- a/src/include/distributed/backend_data.h +++ b/src/include/distributed/backend_data.h @@ -15,12 +15,13 @@ #include "access/twophase.h" #include "datatype/timestamp.h" -#include "distributed/transaction_identifier.h" #include "nodes/pg_list.h" #include "storage/lwlock.h" #include "storage/proc.h" #include "storage/s_lock.h" +#include "distributed/transaction_identifier.h" + /* * Each backend's active distributed transaction information is tracked via diff --git a/src/include/distributed/citus_custom_scan.h b/src/include/distributed/citus_custom_scan.h index a3da4958c..db1f0ce1f 100644 --- a/src/include/distributed/citus_custom_scan.h +++ b/src/include/distributed/citus_custom_scan.h @@ -10,11 +10,12 @@ #ifndef CITUS_CUSTOM_SCAN_H #define CITUS_CUSTOM_SCAN_H -#include "distributed/distributed_planner.h" -#include "distributed/multi_server_executor.h" #include "executor/execdesc.h" #include "nodes/plannodes.h" +#include "distributed/distributed_planner.h" +#include "distributed/multi_server_executor.h" + typedef struct CitusScanState { CustomScanState customScanState; /* underlying custom scan node */ diff --git a/src/include/distributed/citus_depended_object.h b/src/include/distributed/citus_depended_object.h index b52018411..1efbe4e2a 100644 --- a/src/include/distributed/citus_depended_object.h +++ b/src/include/distributed/citus_depended_object.h @@ -12,10 +12,11 @@ #ifndef CITUS_DEPENDED_OBJECT_H #define CITUS_DEPENDED_OBJECT_H -#include "distributed/commands.h" #include "nodes/nodes.h" #include "nodes/parsenodes.h" +#include "distributed/commands.h" + extern bool HideCitusDependentObjects; /* DistOpsValidationState to be used to determine validity of dist ops */ diff --git a/src/include/distributed/citus_nodefuncs.h b/src/include/distributed/citus_nodefuncs.h index caeda3a72..f7c0061b9 100644 --- a/src/include/distributed/citus_nodefuncs.h +++ b/src/include/distributed/citus_nodefuncs.h @@ -11,10 +11,11 @@ #ifndef CITUS_NODEFUNCS_H #define CITUS_NODEFUNCS_H -#include "distributed/multi_physical_planner.h" #include "nodes/nodes.h" #include "nodes/parsenodes.h" +#include "distributed/multi_physical_planner.h" + /* citus_nodefuncs.c */ extern void SetRangeTblExtraData(RangeTblEntry *rte, CitusRTEKind rteKind, char *fragmentSchemaName, char *fragmentTableName, diff --git a/src/include/distributed/citus_ruleutils.h b/src/include/distributed/citus_ruleutils.h index e45ddb269..3a9c36482 100644 --- a/src/include/distributed/citus_ruleutils.h +++ b/src/include/distributed/citus_ruleutils.h @@ -15,11 +15,12 @@ #include "catalog/pg_sequence.h" #include "commands/sequence.h" -#include "distributed/coordinator_protocol.h" #include "lib/stringinfo.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" +#include "distributed/coordinator_protocol.h" + /* Function declarations for version independent Citus ruleutils wrapper functions */ extern char * pg_get_extensiondef_string(Oid tableRelationId); extern Oid get_extension_schema(Oid ext_oid); diff --git a/src/include/distributed/colocation_utils.h b/src/include/distributed/colocation_utils.h index bba78afd1..018f97570 100644 --- a/src/include/distributed/colocation_utils.h +++ b/src/include/distributed/colocation_utils.h @@ -12,9 +12,10 @@ #ifndef COLOCATION_UTILS_H_ #define COLOCATION_UTILS_H_ -#include "distributed/shardinterval_utils.h" #include "nodes/pg_list.h" +#include "distributed/shardinterval_utils.h" + #define INVALID_COLOCATION_ID 0 extern uint32 TableColocationId(Oid distributedTableId); diff --git a/src/include/distributed/combine_query_planner.h b/src/include/distributed/combine_query_planner.h index 710010913..2afc8aa5f 100644 --- a/src/include/distributed/combine_query_planner.h +++ b/src/include/distributed/combine_query_planner.h @@ -14,9 +14,8 @@ #include "lib/stringinfo.h" #include "nodes/parsenodes.h" -#include "nodes/plannodes.h" - #include "nodes/pathnodes.h" +#include "nodes/plannodes.h" /* Function declarations for building local plans on the coordinator node */ diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index eeaa4870e..3c536454c 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -15,12 +15,13 @@ #include "postgres.h" -#include "distributed/metadata_utility.h" -#include "utils/rel.h" #include "nodes/parsenodes.h" #include "tcop/dest.h" #include "tcop/utility.h" #include "utils/acl.h" +#include "utils/rel.h" + +#include "distributed/metadata_utility.h" extern bool AddAllLocalTablesToMetadata; @@ -234,6 +235,18 @@ extern List * PreprocessAlterDatabaseRefreshCollStmt(Node *node, const char *que extern List * PreprocessAlterDatabaseSetStmt(Node *node, const char *queryString, ProcessUtilityContext processUtilityContext); +extern List * PreprocessCreateDatabaseStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PostprocessCreateDatabaseStmt(Node *node, const char *queryString); +extern List * PreprocessDropDatabaseStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * DropDatabaseStmtObjectAddress(Node *node, bool missingOk, + bool isPostprocess); +extern List * CreateDatabaseStmtObjectAddress(Node *node, bool missingOk, + bool isPostprocess); +extern void EnsureSupportedCreateDatabaseCommand(CreatedbStmt *stmt); +extern char * CreateDatabaseDDLCommand(Oid dbId); + /* domain.c - forward declarations */ extern List * CreateDomainStmtObjectAddress(Node *node, bool missing_ok, bool diff --git a/src/include/distributed/commands/multi_copy.h b/src/include/distributed/commands/multi_copy.h index fa59894ad..1fc42df60 100644 --- a/src/include/distributed/commands/multi_copy.h +++ b/src/include/distributed/commands/multi_copy.h @@ -13,14 +13,15 @@ #define MULTI_COPY_H -#include "distributed/metadata_utility.h" -#include "distributed/metadata_cache.h" -#include "distributed/version_compat.h" #include "nodes/execnodes.h" #include "nodes/parsenodes.h" #include "parser/parse_coerce.h" #include "tcop/dest.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" +#include "distributed/version_compat.h" + #define INVALID_PARTITION_COLUMN_INDEX -1 diff --git a/src/include/distributed/commands/utility_hook.h b/src/include/distributed/commands/utility_hook.h index c474dcc43..9046c7309 100644 --- a/src/include/distributed/commands/utility_hook.h +++ b/src/include/distributed/commands/utility_hook.h @@ -10,12 +10,12 @@ #ifndef MULTI_UTILITY_H #define MULTI_UTILITY_H -#include "pg_version_constants.h" - #include "postgres.h" -#include "utils/relcache.h" #include "tcop/utility.h" +#include "utils/relcache.h" + +#include "pg_version_constants.h" #include "distributed/coordinator_protocol.h" #include "distributed/function_call_delegation.h" @@ -40,6 +40,7 @@ typedef enum extern PropSetCmdBehavior PropagateSetCommands; extern bool EnableDDLPropagation; extern int CreateObjectPropagationMode; +extern bool EnableCreateDatabasePropagation; extern bool EnableCreateTypePropagation; extern bool EnableCreateRolePropagation; extern bool EnableAlterRolePropagation; @@ -93,6 +94,7 @@ extern void ProcessUtilityParseTree(Node *node, const char *queryString, extern void MarkInvalidateForeignKeyGraph(void); extern void InvalidateForeignKeyGraphForDDL(void); extern List * DDLTaskList(Oid relationId, const char *commandString); +extern List * NontransactionalNodeDDLTaskList(TargetWorkerSet targets, List *commands); extern List * NodeDDLTaskList(TargetWorkerSet targets, List *commands); extern bool AlterTableInProgress(void); extern bool DropSchemaOrDBInProgress(void); diff --git a/src/include/distributed/connection_management.h b/src/include/distributed/connection_management.h index 158f0b1ce..9eadbde9d 100644 --- a/src/include/distributed/connection_management.h +++ b/src/include/distributed/connection_management.h @@ -13,16 +13,18 @@ #include "postgres.h" -#include "distributed/transaction_management.h" -#include "distributed/remote_transaction.h" -#include "lib/ilist.h" #include "pg_config.h" + +#include "lib/ilist.h" #include "portability/instr_time.h" #include "storage/latch.h" #include "utils/guc.h" #include "utils/hsearch.h" #include "utils/timestamp.h" +#include "distributed/remote_transaction.h" +#include "distributed/transaction_management.h" + /* maximum (textual) lengths of hostname and port */ #define MAX_NODE_LENGTH 255 /* includes 0 byte */ diff --git a/src/include/distributed/coordinator_protocol.h b/src/include/distributed/coordinator_protocol.h index 0dcc66141..b2170fd2e 100644 --- a/src/include/distributed/coordinator_protocol.h +++ b/src/include/distributed/coordinator_protocol.h @@ -13,16 +13,18 @@ #define COORDINATOR_PROTOCOL_H #include "postgres.h" + #include "c.h" #include "fmgr.h" -#include "distributed/connection_management.h" -#include "distributed/shardinterval_utils.h" #include "nodes/pg_list.h" -#include "distributed/metadata_utility.h" #include "columnar/columnar.h" +#include "distributed/connection_management.h" +#include "distributed/metadata_utility.h" +#include "distributed/shardinterval_utils.h" + /* * In our distributed database, we need a mechanism to make remote procedure * calls between clients, the coordinator node, and worker nodes. These remote calls diff --git a/src/include/distributed/deparse_shard_query.h b/src/include/distributed/deparse_shard_query.h index 9370e51e2..8fb012588 100644 --- a/src/include/distributed/deparse_shard_query.h +++ b/src/include/distributed/deparse_shard_query.h @@ -18,6 +18,7 @@ #include "nodes/nodes.h" #include "nodes/parsenodes.h" #include "nodes/pg_list.h" + #include "distributed/citus_custom_scan.h" diff --git a/src/include/distributed/deparser.h b/src/include/distributed/deparser.h index e98084e59..9177eb951 100644 --- a/src/include/distributed/deparser.h +++ b/src/include/distributed/deparser.h @@ -15,10 +15,10 @@ #include "postgres.h" -#include "nodes/nodes.h" -#include "nodes/parsenodes.h" #include "catalog/objectaddress.h" #include "lib/stringinfo.h" +#include "nodes/nodes.h" +#include "nodes/parsenodes.h" /* forward declarations for format_collate.c */ /* Control flags for FormatCollateExtended, compatible with format_type_extended */ @@ -121,6 +121,28 @@ extern void AppendGrantedByInGrant(StringInfo buf, GrantStmt *stmt); extern void AppendGrantSharedPrefix(StringInfo buf, GrantStmt *stmt); extern void AppendGrantSharedSuffix(StringInfo buf, GrantStmt *stmt); +/* Common deparser utils */ + +typedef struct DefElemOptionFormat +{ + char *name; + char *format; + int type; +} DefElemOptionFormat; + +typedef enum OptionFormatType +{ + OPTION_FORMAT_STRING, + OPTION_FORMAT_LITERAL_CSTR, + OPTION_FORMAT_BOOLEAN, + OPTION_FORMAT_INTEGER +} OptionFormatType; + + +extern void DefElemOptionToStatement(StringInfo buf, DefElem *option, + const DefElemOptionFormat *opt_formats, + int opt_formats_len); + /* forward declarations for deparse_statistics_stmts.c */ extern char * DeparseCreateStatisticsStmt(Node *node); @@ -228,6 +250,8 @@ extern char * DeparseGrantOnDatabaseStmt(Node *node); extern char * DeparseAlterDatabaseStmt(Node *node); extern char * DeparseAlterDatabaseRefreshCollStmt(Node *node); extern char * DeparseAlterDatabaseSetStmt(Node *node); +extern char * DeparseCreateDatabaseStmt(Node *node); +extern char * DeparseDropDatabaseStmt(Node *node); /* forward declaration for deparse_publication_stmts.c */ diff --git a/src/include/distributed/distributed_deadlock_detection.h b/src/include/distributed/distributed_deadlock_detection.h index 23f6554ef..5f391cc70 100644 --- a/src/include/distributed/distributed_deadlock_detection.h +++ b/src/include/distributed/distributed_deadlock_detection.h @@ -14,11 +14,12 @@ #include "postgres.h" #include "access/hash.h" +#include "nodes/pg_list.h" + #include "distributed/backend_data.h" #include "distributed/listutils.h" #include "distributed/lock_graph.h" #include "distributed/transaction_identifier.h" -#include "nodes/pg_list.h" typedef struct TransactionNode { diff --git a/src/include/distributed/distributed_execution_locks.h b/src/include/distributed/distributed_execution_locks.h index e789843ae..3ca31b330 100644 --- a/src/include/distributed/distributed_execution_locks.h +++ b/src/include/distributed/distributed_execution_locks.h @@ -14,6 +14,7 @@ #include "nodes/pg_list.h" #include "storage/lockdefs.h" + #include "distributed/multi_physical_planner.h" extern void AcquireExecutorShardLocksForExecution(RowModifyLevel modLevel, diff --git a/src/include/distributed/distributed_planner.h b/src/include/distributed/distributed_planner.h index bc8f5bc94..d7234e4bc 100644 --- a/src/include/distributed/distributed_planner.h +++ b/src/include/distributed/distributed_planner.h @@ -12,11 +12,10 @@ #include "postgres.h" -#include "pg_version_constants.h" - +#include "nodes/pathnodes.h" #include "nodes/plannodes.h" -#include "nodes/pathnodes.h" +#include "pg_version_constants.h" #include "distributed/citus_nodes.h" #include "distributed/errormessage.h" diff --git a/src/include/distributed/enterprise.h b/src/include/distributed/enterprise.h index 26a882bd6..2ba2fa1ff 100644 --- a/src/include/distributed/enterprise.h +++ b/src/include/distributed/enterprise.h @@ -13,6 +13,7 @@ #define CITUS_ENTERPRISE_H #include "postgres.h" + #include "fmgr.h" diff --git a/src/include/distributed/errormessage.h b/src/include/distributed/errormessage.h index 3c19a9c83..7a38d513c 100644 --- a/src/include/distributed/errormessage.h +++ b/src/include/distributed/errormessage.h @@ -11,9 +11,11 @@ #define ERRORMESSAGE_H #include "c.h" -#include "distributed/citus_nodes.h" + #include "pg_version_compat.h" +#include "distributed/citus_nodes.h" + typedef struct DeferredErrorMessage { diff --git a/src/include/distributed/executor_util.h b/src/include/distributed/executor_util.h index 8560c6dfd..b39122d26 100644 --- a/src/include/distributed/executor_util.h +++ b/src/include/distributed/executor_util.h @@ -12,10 +12,11 @@ #include "funcapi.h" #include "access/tupdesc.h" -#include "distributed/multi_physical_planner.h" #include "nodes/params.h" #include "nodes/pg_list.h" +#include "distributed/multi_physical_planner.h" + /* utility functions for dealing with tasks in the executor */ extern bool TaskListModifiesDatabase(RowModifyLevel modLevel, List *taskList); diff --git a/src/include/distributed/foreign_key_relationship.h b/src/include/distributed/foreign_key_relationship.h index fbbee831e..bbaf8be73 100644 --- a/src/include/distributed/foreign_key_relationship.h +++ b/src/include/distributed/foreign_key_relationship.h @@ -10,10 +10,12 @@ #define FOREIGN_KEY_RELATIONSHIP_H #include "postgres.h" + #include "postgres_ext.h" -#include "utils/relcache.h" -#include "utils/hsearch.h" + #include "nodes/primnodes.h" +#include "utils/hsearch.h" +#include "utils/relcache.h" extern List * GetForeignKeyConnectedRelationIdList(Oid relationId); extern bool ShouldUndistributeCitusLocalTable(Oid relationId); diff --git a/src/include/distributed/hash_helpers.h b/src/include/distributed/hash_helpers.h index 168879b4d..b64bfde71 100644 --- a/src/include/distributed/hash_helpers.h +++ b/src/include/distributed/hash_helpers.h @@ -11,10 +11,10 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "utils/hsearch.h" +#include "pg_version_constants.h" + /* * assert_valid_hash_key2 checks if a type that contains 2 fields contains no * padding bytes. This is necessary to use a type as a hash key with tag_hash. diff --git a/src/include/distributed/insert_select_planner.h b/src/include/distributed/insert_select_planner.h index 771d1d60f..a9100b02d 100644 --- a/src/include/distributed/insert_select_planner.h +++ b/src/include/distributed/insert_select_planner.h @@ -16,12 +16,13 @@ #include "postgres.h" -#include "distributed/multi_physical_planner.h" -#include "distributed/distributed_planner.h" #include "nodes/execnodes.h" #include "nodes/parsenodes.h" #include "nodes/plannodes.h" +#include "distributed/distributed_planner.h" +#include "distributed/multi_physical_planner.h" + extern bool InsertSelectIntoCitusTable(Query *query); extern bool CheckInsertSelectQuery(Query *query); diff --git a/src/include/distributed/intermediate_results.h b/src/include/distributed/intermediate_results.h index 63eca5ad1..ca4fa581e 100644 --- a/src/include/distributed/intermediate_results.h +++ b/src/include/distributed/intermediate_results.h @@ -14,13 +14,14 @@ #include "fmgr.h" -#include "distributed/commands/multi_copy.h" #include "nodes/execnodes.h" #include "nodes/pg_list.h" #include "tcop/dest.h" #include "utils/builtins.h" #include "utils/palloc.h" +#include "distributed/commands/multi_copy.h" + /* * DistributedResultFragment represents a fragment of a distributed result. diff --git a/src/include/distributed/listutils.h b/src/include/distributed/listutils.h index 833c77d22..2a52cbc75 100644 --- a/src/include/distributed/listutils.h +++ b/src/include/distributed/listutils.h @@ -13,13 +13,15 @@ #define CITUS_LISTUTILS_H #include "postgres.h" + #include "c.h" #include "nodes/pg_list.h" -#include "pg_version_compat.h" #include "utils/array.h" #include "utils/hsearch.h" +#include "pg_version_compat.h" + /* * ListCellAndListWrapper stores a list and list cell. diff --git a/src/include/distributed/local_distributed_join_planner.h b/src/include/distributed/local_distributed_join_planner.h index dfb45f149..3390ab213 100644 --- a/src/include/distributed/local_distributed_join_planner.h +++ b/src/include/distributed/local_distributed_join_planner.h @@ -14,6 +14,7 @@ #define LOCAL_DISTRIBUTED_JOIN_PLANNER_H #include "postgres.h" + #include "distributed/recursive_planning.h" /* managed via guc.c */ diff --git a/src/include/distributed/lock_graph.h b/src/include/distributed/lock_graph.h index f204ebb03..e14a51580 100644 --- a/src/include/distributed/lock_graph.h +++ b/src/include/distributed/lock_graph.h @@ -14,12 +14,14 @@ #include "postgres.h" + #include "libpq-fe.h" #include "datatype/timestamp.h" -#include "distributed/backend_data.h" #include "storage/lock.h" +#include "distributed/backend_data.h" + /* * Describes an edge in a waiting-for graph of locks. This isn't used for diff --git a/src/include/distributed/merge_planner.h b/src/include/distributed/merge_planner.h index 898292603..b6636687a 100644 --- a/src/include/distributed/merge_planner.h +++ b/src/include/distributed/merge_planner.h @@ -15,6 +15,7 @@ #include "c.h" #include "nodes/parsenodes.h" + #include "distributed/distributed_planner.h" #include "distributed/errormessage.h" #include "distributed/multi_physical_planner.h" diff --git a/src/include/distributed/metadata/dependency.h b/src/include/distributed/metadata/dependency.h index 2d3759e1f..2cfefc87e 100644 --- a/src/include/distributed/metadata/dependency.h +++ b/src/include/distributed/metadata/dependency.h @@ -16,9 +16,10 @@ #include "catalog/objectaddress.h" #include "catalog/pg_depend.h" -#include "distributed/errormessage.h" #include "nodes/pg_list.h" +#include "distributed/errormessage.h" + typedef bool (*AddressPredicate)(const ObjectAddress *); extern List * GetUniqueDependenciesList(List *objectAddressesList); diff --git a/src/include/distributed/metadata/distobject.h b/src/include/distributed/metadata/distobject.h index de56c0e1f..cf24a8c81 100644 --- a/src/include/distributed/metadata/distobject.h +++ b/src/include/distributed/metadata/distobject.h @@ -26,6 +26,7 @@ extern void MarkObjectDistributed(const ObjectAddress *distAddress); extern void MarkObjectDistributedViaSuperUser(const ObjectAddress *distAddress); extern void MarkObjectDistributedLocally(const ObjectAddress *distAddress); extern void UnmarkObjectDistributed(const ObjectAddress *address); +extern void UnmarkNodeWideObjectsDistributed(Node *node); extern bool IsTableOwnedByExtension(Oid relationId); extern bool ObjectAddressDependsOnExtension(const ObjectAddress *target); extern bool IsAnyObjectAddressOwnedByExtension(const List *targets, diff --git a/src/include/distributed/metadata_cache.h b/src/include/distributed/metadata_cache.h index 34b95b859..f1120497b 100644 --- a/src/include/distributed/metadata_cache.h +++ b/src/include/distributed/metadata_cache.h @@ -14,10 +14,12 @@ #include "postgres.h" #include "fmgr.h" + +#include "utils/hsearch.h" + #include "distributed/metadata_utility.h" #include "distributed/pg_dist_partition.h" #include "distributed/worker_manager.h" -#include "utils/hsearch.h" extern bool EnableVersionChecks; diff --git a/src/include/distributed/metadata_sync.h b/src/include/distributed/metadata_sync.h index 237df363a..e20c44535 100644 --- a/src/include/distributed/metadata_sync.h +++ b/src/include/distributed/metadata_sync.h @@ -13,10 +13,11 @@ #define METADATA_SYNC_H +#include "nodes/pg_list.h" + #include "distributed/commands/utility_hook.h" #include "distributed/coordinator_protocol.h" #include "distributed/metadata_cache.h" -#include "nodes/pg_list.h" /* managed via guc.c */ typedef enum @@ -107,6 +108,7 @@ extern char * ColocationIdUpdateCommand(Oid relationId, uint32 colocationId); extern char * CreateSchemaDDLCommand(Oid schemaId); extern List * GrantOnSchemaDDLCommands(Oid schemaId); extern List * GrantOnFunctionDDLCommands(Oid functionOid); +extern List * GrantOnDatabaseDDLCommands(Oid databaseOid); extern List * GrantOnForeignServerDDLCommands(Oid serverId); extern List * GenerateGrantOnForeignServerQueriesFromAclItem(Oid serverId, AclItem *aclItem); diff --git a/src/include/distributed/metadata_utility.h b/src/include/distributed/metadata_utility.h index e5fc1eea5..737e1283b 100644 --- a/src/include/distributed/metadata_utility.h +++ b/src/include/distributed/metadata_utility.h @@ -21,13 +21,14 @@ #include "access/tupdesc.h" #include "catalog/indexing.h" #include "catalog/objectaddress.h" +#include "utils/acl.h" +#include "utils/relcache.h" + #include "distributed/citus_nodes.h" #include "distributed/connection_management.h" #include "distributed/errormessage.h" #include "distributed/relay_utility.h" #include "distributed/worker_manager.h" -#include "utils/acl.h" -#include "utils/relcache.h" /* total number of hash tokens (2^32) */ diff --git a/src/include/distributed/multi_executor.h b/src/include/distributed/multi_executor.h index 5ae010d87..6708d9a64 100644 --- a/src/include/distributed/multi_executor.h +++ b/src/include/distributed/multi_executor.h @@ -11,8 +11,8 @@ #define MULTI_EXECUTOR_H #include "executor/execdesc.h" -#include "nodes/parsenodes.h" #include "nodes/execnodes.h" +#include "nodes/parsenodes.h" #include "distributed/citus_custom_scan.h" #include "distributed/multi_physical_planner.h" diff --git a/src/include/distributed/multi_explain.h b/src/include/distributed/multi_explain.h index 296634905..f6dad83c2 100644 --- a/src/include/distributed/multi_explain.h +++ b/src/include/distributed/multi_explain.h @@ -10,9 +10,10 @@ #ifndef MULTI_EXPLAIN_H #define MULTI_EXPLAIN_H -#include "executor/executor.h" #include "tuple_destination.h" +#include "executor/executor.h" + typedef enum { EXPLAIN_ANALYZE_SORT_BY_TIME = 0, diff --git a/src/include/distributed/multi_logical_planner.h b/src/include/distributed/multi_logical_planner.h index de4901ea2..f68fd3ed5 100644 --- a/src/include/distributed/multi_logical_planner.h +++ b/src/include/distributed/multi_logical_planner.h @@ -14,15 +14,16 @@ #ifndef MULTI_LOGICAL_PLANNER_H #define MULTI_LOGICAL_PLANNER_H +#include "nodes/nodes.h" +#include "nodes/parsenodes.h" +#include "nodes/pg_list.h" +#include "nodes/primnodes.h" + #include "distributed/citus_nodes.h" #include "distributed/errormessage.h" #include "distributed/log_utils.h" #include "distributed/multi_join_order.h" #include "distributed/relation_restriction_equivalence.h" -#include "nodes/nodes.h" -#include "nodes/primnodes.h" -#include "nodes/parsenodes.h" -#include "nodes/pg_list.h" #define SUBQUERY_RANGE_TABLE_ID -1 diff --git a/src/include/distributed/multi_logical_replication.h b/src/include/distributed/multi_logical_replication.h index f5a9dc342..2a57c0224 100644 --- a/src/include/distributed/multi_logical_replication.h +++ b/src/include/distributed/multi_logical_replication.h @@ -15,6 +15,7 @@ #include "c.h" #include "nodes/pg_list.h" + #include "distributed/connection_management.h" #include "distributed/hash_helpers.h" #include "distributed/shard_cleaner.h" diff --git a/src/include/distributed/multi_partitioning_utils.h b/src/include/distributed/multi_partitioning_utils.h index b8cfe38c0..7d76b9aa3 100644 --- a/src/include/distributed/multi_partitioning_utils.h +++ b/src/include/distributed/multi_partitioning_utils.h @@ -8,9 +8,10 @@ #define MULTI_PARTITIONING_UTILS_H_ -#include "distributed/metadata_utility.h" #include "nodes/pg_list.h" +#include "distributed/metadata_utility.h" + extern bool PartitionedTable(Oid relationId); extern bool PartitionedTableNoLock(Oid relationId); diff --git a/src/include/distributed/multi_physical_planner.h b/src/include/distributed/multi_physical_planner.h index 6bdc95cb3..60c5c9783 100644 --- a/src/include/distributed/multi_physical_planner.h +++ b/src/include/distributed/multi_physical_planner.h @@ -16,22 +16,23 @@ #include "postgres.h" -#include "pg_version_constants.h" - #include "c.h" #include "datatype/timestamp.h" -#include "distributed/citus_nodes.h" -#include "distributed/errormessage.h" -#include "distributed/log_utils.h" -#include "distributed/metadata_utility.h" -#include "distributed/worker_manager.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/distributed_planner.h" #include "lib/stringinfo.h" #include "nodes/parsenodes.h" #include "utils/array.h" +#include "pg_version_constants.h" + +#include "distributed/citus_nodes.h" +#include "distributed/distributed_planner.h" +#include "distributed/errormessage.h" +#include "distributed/log_utils.h" +#include "distributed/metadata_utility.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/worker_manager.h" + /* Definitions local to the physical planner */ #define NON_PRUNABLE_JOIN -1 diff --git a/src/include/distributed/multi_progress.h b/src/include/distributed/multi_progress.h index 64bad527f..2a9cf1cbb 100644 --- a/src/include/distributed/multi_progress.h +++ b/src/include/distributed/multi_progress.h @@ -16,6 +16,7 @@ #include "postgres.h" #include "fmgr.h" + #include "nodes/pg_list.h" #include "storage/dsm.h" diff --git a/src/include/distributed/multi_router_planner.h b/src/include/distributed/multi_router_planner.h index 160cf6605..ae75ee631 100644 --- a/src/include/distributed/multi_router_planner.h +++ b/src/include/distributed/multi_router_planner.h @@ -14,12 +14,13 @@ #include "c.h" +#include "nodes/parsenodes.h" + +#include "distributed/distributed_planner.h" #include "distributed/errormessage.h" #include "distributed/log_utils.h" #include "distributed/multi_logical_planner.h" #include "distributed/multi_physical_planner.h" -#include "distributed/distributed_planner.h" -#include "nodes/parsenodes.h" /* reserved alias name for UPSERTs */ diff --git a/src/include/distributed/placement_access.h b/src/include/distributed/placement_access.h index 28b05baae..0eafa678a 100644 --- a/src/include/distributed/placement_access.h +++ b/src/include/distributed/placement_access.h @@ -11,7 +11,9 @@ #define PLACEMENT_ACCESS_H #include "postgres.h" + #include "nodes/pg_list.h" + #include "distributed/multi_physical_planner.h" /* forward declare, to avoid dependency on ShardPlacement definition */ diff --git a/src/include/distributed/query_colocation_checker.h b/src/include/distributed/query_colocation_checker.h index 562869a92..2a46d364c 100644 --- a/src/include/distributed/query_colocation_checker.h +++ b/src/include/distributed/query_colocation_checker.h @@ -11,10 +11,11 @@ #define QUERY_COLOCATION_CHECKER_H -#include "distributed/distributed_planner.h" #include "nodes/parsenodes.h" #include "nodes/primnodes.h" +#include "distributed/distributed_planner.h" + /* * ColocatedJoinChecker is a helper structure that is used to decide diff --git a/src/include/distributed/query_pushdown_planning.h b/src/include/distributed/query_pushdown_planning.h index 061a4a730..e0d4f25dd 100644 --- a/src/include/distributed/query_pushdown_planning.h +++ b/src/include/distributed/query_pushdown_planning.h @@ -13,10 +13,10 @@ #include "postgres.h" #include "distributed/distributed_planner.h" -#include "distributed/multi_logical_planner.h" -#include "distributed/multi_physical_planner.h" #include "distributed/errormessage.h" #include "distributed/log_utils.h" +#include "distributed/multi_logical_planner.h" +#include "distributed/multi_physical_planner.h" /* Config variables managed via guc.c */ diff --git a/src/include/distributed/query_utils.h b/src/include/distributed/query_utils.h index 7e1ba54e6..0b216d158 100644 --- a/src/include/distributed/query_utils.h +++ b/src/include/distributed/query_utils.h @@ -12,6 +12,7 @@ #define QUERY_UTILS_H #include "postgres.h" + #include "nodes/pg_list.h" #include "nodes/primnodes.h" diff --git a/src/include/distributed/recursive_planning.h b/src/include/distributed/recursive_planning.h index 87df7fba2..c37eba343 100644 --- a/src/include/distributed/recursive_planning.h +++ b/src/include/distributed/recursive_planning.h @@ -10,13 +10,15 @@ #ifndef RECURSIVE_PLANNING_H #define RECURSIVE_PLANNING_H +#include "nodes/pathnodes.h" +#include "nodes/pg_list.h" +#include "nodes/primnodes.h" + #include "pg_version_constants.h" + #include "distributed/errormessage.h" #include "distributed/log_utils.h" #include "distributed/relation_restriction_equivalence.h" -#include "nodes/pg_list.h" -#include "nodes/primnodes.h" -#include "nodes/pathnodes.h" typedef struct RecursivePlanningContextInternal RecursivePlanningContext; diff --git a/src/include/distributed/relay_utility.h b/src/include/distributed/relay_utility.h index f5a37da45..6fa2172e3 100644 --- a/src/include/distributed/relay_utility.h +++ b/src/include/distributed/relay_utility.h @@ -16,6 +16,7 @@ #define RELAY_UTILITY_H #include "fmgr.h" + #include "lib/stringinfo.h" #include "nodes/nodes.h" diff --git a/src/include/distributed/remote_transaction.h b/src/include/distributed/remote_transaction.h index 6136f25c9..1c422da20 100644 --- a/src/include/distributed/remote_transaction.h +++ b/src/include/distributed/remote_transaction.h @@ -12,8 +12,9 @@ #include "libpq-fe.h" -#include "nodes/pg_list.h" + #include "lib/ilist.h" +#include "nodes/pg_list.h" /* forward declare, to avoid recursive includes */ diff --git a/src/include/distributed/replication_origin_session_utils.h b/src/include/distributed/replication_origin_session_utils.h index e90bd8ab8..b11d56ffc 100644 --- a/src/include/distributed/replication_origin_session_utils.h +++ b/src/include/distributed/replication_origin_session_utils.h @@ -12,7 +12,9 @@ #define REPLICATION_ORIGIN_SESSION_UTILS_H #include "postgres.h" + #include "replication/origin.h" + #include "distributed/connection_management.h" extern void InitializeReplicationOriginSessionUtils(void); diff --git a/src/include/distributed/resource_lock.h b/src/include/distributed/resource_lock.h index 9efa1b767..8e0e36735 100644 --- a/src/include/distributed/resource_lock.h +++ b/src/include/distributed/resource_lock.h @@ -11,13 +11,15 @@ #define RESOURCE_LOCK_H #include "postgres.h" /* IWYU pragma: keep */ + #include "c.h" -#include "distributed/worker_transaction.h" #include "nodes/pg_list.h" #include "storage/lock.h" #include "tcop/utility.h" +#include "distributed/worker_transaction.h" + /* * Postgres' advisory locks use 'field4' to discern between different kind of diff --git a/src/include/distributed/shard_pruning.h b/src/include/distributed/shard_pruning.h index 04176314e..1b1ffce8a 100644 --- a/src/include/distributed/shard_pruning.h +++ b/src/include/distributed/shard_pruning.h @@ -11,9 +11,10 @@ #ifndef SHARD_PRUNING_H_ #define SHARD_PRUNING_H_ -#include "distributed/metadata_cache.h" #include "nodes/primnodes.h" +#include "distributed/metadata_cache.h" + #define INVALID_SHARD_INDEX -1 /* Function declarations for shard pruning */ diff --git a/src/include/distributed/shard_rebalancer.h b/src/include/distributed/shard_rebalancer.h index 345748ced..79414eb3c 100644 --- a/src/include/distributed/shard_rebalancer.h +++ b/src/include/distributed/shard_rebalancer.h @@ -17,7 +17,9 @@ #include "postgres.h" #include "fmgr.h" + #include "nodes/pg_list.h" + #include "distributed/coordinator_protocol.h" #include "distributed/worker_manager.h" diff --git a/src/include/distributed/shard_transfer.h b/src/include/distributed/shard_transfer.h index a6d024a2e..c1621879b 100644 --- a/src/include/distributed/shard_transfer.h +++ b/src/include/distributed/shard_transfer.h @@ -9,9 +9,10 @@ #include "postgres.h" -#include "distributed/shard_rebalancer.h" #include "nodes/pg_list.h" +#include "distributed/shard_rebalancer.h" + extern Datum citus_move_shard_placement(PG_FUNCTION_ARGS); extern Datum citus_move_shard_placement_with_nodeid(PG_FUNCTION_ARGS); diff --git a/src/include/distributed/shardinterval_utils.h b/src/include/distributed/shardinterval_utils.h index 4cc99e6d5..ed5600a11 100644 --- a/src/include/distributed/shardinterval_utils.h +++ b/src/include/distributed/shardinterval_utils.h @@ -12,10 +12,11 @@ #ifndef SHARDINTERVAL_UTILS_H_ #define SHARDINTERVAL_UTILS_H_ -#include "distributed/metadata_utility.h" -#include "distributed/metadata_cache.h" #include "nodes/primnodes.h" +#include "distributed/metadata_cache.h" +#include "distributed/metadata_utility.h" + #define INVALID_SHARD_INDEX -1 /* OperatorCacheEntry contains information for each element in OperatorCache */ diff --git a/src/include/distributed/transaction_management.h b/src/include/distributed/transaction_management.h index 9b41b060e..ee3153d10 100644 --- a/src/include/distributed/transaction_management.h +++ b/src/include/distributed/transaction_management.h @@ -14,7 +14,6 @@ #include "lib/ilist.h" #include "lib/stringinfo.h" #include "nodes/pg_list.h" -#include "lib/stringinfo.h" #include "nodes/primnodes.h" #include "utils/hsearch.h" diff --git a/src/include/distributed/tuple_destination.h b/src/include/distributed/tuple_destination.h index 0480ffdc4..5b4f64983 100644 --- a/src/include/distributed/tuple_destination.h +++ b/src/include/distributed/tuple_destination.h @@ -11,10 +11,11 @@ #define TUPLE_DESTINATION_H #include "access/tupdesc.h" -#include "distributed/multi_physical_planner.h" #include "tcop/dest.h" #include "utils/tuplestore.h" +#include "distributed/multi_physical_planner.h" + typedef struct TupleDestination TupleDestination; diff --git a/src/include/distributed/utils/citus_stat_tenants.h b/src/include/distributed/utils/citus_stat_tenants.h index 0a482b241..573502606 100644 --- a/src/include/distributed/utils/citus_stat_tenants.h +++ b/src/include/distributed/utils/citus_stat_tenants.h @@ -11,13 +11,14 @@ #ifndef CITUS_ATTRIBUTE_H #define CITUS_ATTRIBUTE_H -#include "distributed/hash_helpers.h" #include "executor/execdesc.h" #include "executor/executor.h" #include "storage/lwlock.h" #include "utils/datetime.h" #include "utils/hsearch.h" +#include "distributed/hash_helpers.h" + #define MAX_TENANT_ATTRIBUTE_LENGTH 100 /* diff --git a/src/include/distributed/utils/directory.h b/src/include/distributed/utils/directory.h index 7ed8a3f95..76b6cf1df 100644 --- a/src/include/distributed/utils/directory.h +++ b/src/include/distributed/utils/directory.h @@ -12,6 +12,7 @@ #define CITUS_DIRECTORY_H #include "postgres.h" + #include "lib/stringinfo.h" diff --git a/src/include/distributed/utils/function.h b/src/include/distributed/utils/function.h index 91d4ab84b..6f527218c 100644 --- a/src/include/distributed/utils/function.h +++ b/src/include/distributed/utils/function.h @@ -12,6 +12,7 @@ #define CITUS_FUNCTION_H #include "postgres.h" + #include "fmgr.h" diff --git a/src/include/distributed/version_compat.h b/src/include/distributed/version_compat.h index b990b82ef..f450dc1ce 100644 --- a/src/include/distributed/version_compat.h +++ b/src/include/distributed/version_compat.h @@ -13,21 +13,21 @@ #include "postgres.h" -#include "access/sdir.h" #include "access/heapam.h" -#include "commands/explain.h" +#include "access/sdir.h" #include "catalog/namespace.h" -#include "distributed/citus_ruleutils.h" -#include "distributed/citus_safe_lib.h" +#include "commands/explain.h" #include "executor/tuptable.h" #include "nodes/parsenodes.h" -#include "parser/parse_func.h" #include "optimizer/optimizer.h" - +#include "parser/parse_func.h" #include "tcop/tcopprot.h" #include "pg_version_compat.h" +#include "distributed/citus_ruleutils.h" +#include "distributed/citus_safe_lib.h" + typedef struct { File fd; diff --git a/src/include/distributed/worker_manager.h b/src/include/distributed/worker_manager.h index 694d38ccf..02a43fe0b 100644 --- a/src/include/distributed/worker_manager.h +++ b/src/include/distributed/worker_manager.h @@ -16,9 +16,9 @@ #include "postgres.h" +#include "nodes/pg_list.h" #include "storage/lmgr.h" #include "storage/lockdefs.h" -#include "nodes/pg_list.h" /* Worker nodeName's, nodePort's, and nodeCluster's maximum length */ diff --git a/src/include/distributed/worker_protocol.h b/src/include/distributed/worker_protocol.h index 29d364247..21c0c44c8 100644 --- a/src/include/distributed/worker_protocol.h +++ b/src/include/distributed/worker_protocol.h @@ -17,11 +17,13 @@ #include "postgres.h" #include "fmgr.h" -#include "distributed/shardinterval_utils.h" + #include "lib/stringinfo.h" #include "nodes/parsenodes.h" #include "storage/fd.h" #include "utils/array.h" + +#include "distributed/shardinterval_utils.h" #include "distributed/version_compat.h" diff --git a/src/include/distributed/worker_transaction.h b/src/include/distributed/worker_transaction.h index d622fe366..b9a855828 100644 --- a/src/include/distributed/worker_transaction.h +++ b/src/include/distributed/worker_transaction.h @@ -12,9 +12,10 @@ #ifndef WORKER_TRANSACTION_H #define WORKER_TRANSACTION_H +#include "storage/lockdefs.h" + #include "distributed/connection_management.h" #include "distributed/worker_manager.h" -#include "storage/lockdefs.h" /* diff --git a/src/test/cdc/t/016_cdc_wal2json.pl b/src/test/cdc/t/016_cdc_wal2json.pl index 10475ba85..ab384df64 100644 --- a/src/test/cdc/t/016_cdc_wal2json.pl +++ b/src/test/cdc/t/016_cdc_wal2json.pl @@ -9,13 +9,6 @@ use cdctestlib; use threads; -my $pg_major_version = int($ENV{'pg_major_version'}); -print("working with PG major version : $pg_major_version\n"); -if ($pg_major_version >= 16) { - plan skip_all => 'wal2json is not available for PG16 yet'; - exit 0; -} - # Initialize co-ordinator node my $select_stmt = qq(SELECT * FROM data_100008 ORDER BY id;); my $result = 0; diff --git a/src/test/regress/expected/create_drop_database_propagation.out b/src/test/regress/expected/create_drop_database_propagation.out new file mode 100644 index 000000000..e0172f3e8 --- /dev/null +++ b/src/test/regress/expected/create_drop_database_propagation.out @@ -0,0 +1,962 @@ +-- Test for create/drop database propagation. +-- This test is only executes for Postgres versions < 15. +-- For versions >= 15, pg15_create_drop_database_propagation.sql is used. +-- For versions >= 16, pg16_create_drop_database_propagation.sql is used. +-- Test the UDF that we use to issue database command during metadata sync. +SELECT pg_catalog.citus_internal_database_command(null); +ERROR: This is an internal Citus function can only be used in a distributed transaction +CREATE ROLE test_db_commands WITH LOGIN; +ALTER SYSTEM SET citus.enable_manual_metadata_changes_for_user TO 'test_db_commands'; +SELECT pg_reload_conf(); + pg_reload_conf +--------------------------------------------------------------------- + t +(1 row) + +SELECT pg_sleep(0.1); + pg_sleep +--------------------------------------------------------------------- + +(1 row) + +SET ROLE test_db_commands; +-- fails on null input +SELECT pg_catalog.citus_internal_database_command(null); +ERROR: command cannot be NULL +-- fails on non create / drop db command +SELECT pg_catalog.citus_internal_database_command('CREATE TABLE foo_bar(a int)'); +ERROR: citus_internal_database_command() can only be used for CREATE DATABASE command by Citus. +SELECT pg_catalog.citus_internal_database_command('SELECT 1'); +ERROR: citus_internal_database_command() can only be used for CREATE DATABASE command by Citus. +SELECT pg_catalog.citus_internal_database_command('asfsfdsg'); +ERROR: syntax error at or near "asfsfdsg" +SELECT pg_catalog.citus_internal_database_command(''); +ERROR: cannot execute multiple utility events +RESET ROLE; +ALTER ROLE test_db_commands nocreatedb; +SET ROLE test_db_commands; +-- make sure that pg_catalog.citus_internal_database_command doesn't cause privilege escalation +SELECT pg_catalog.citus_internal_database_command('CREATE DATABASE no_permissions'); +ERROR: permission denied to create database +RESET ROLE; +DROP USER test_db_commands; +ALTER SYSTEM RESET citus.enable_manual_metadata_changes_for_user; +SELECT pg_reload_conf(); + pg_reload_conf +--------------------------------------------------------------------- + t +(1 row) + +SELECT pg_sleep(0.1); + pg_sleep +--------------------------------------------------------------------- + +(1 row) + +\set create_drop_db_tablespace :abs_srcdir '/tmp_check/ts3' +CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace'; +\c - - - :worker_1_port +\set create_drop_db_tablespace :abs_srcdir '/tmp_check/ts4' +CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace'; +\c - - - :worker_2_port +\set create_drop_db_tablespace :abs_srcdir '/tmp_check/ts5' +CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace'; +\c - - - :master_port +CREATE DATABASE local_database; +NOTICE: Citus partially supports CREATE DATABASE for distributed databases +DETAIL: Citus does not propagate CREATE DATABASE command to workers +HINT: You can manually create a database and its extensions on workers. +-- check that it's only created for coordinator +SELECT * FROM public.check_database_on_all_nodes('local_database') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "local_database", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +DROP DATABASE local_database; +-- and is dropped +SELECT * FROM public.check_database_on_all_nodes('local_database') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +\c - - - :worker_1_port +CREATE DATABASE local_database; +NOTICE: Citus partially supports CREATE DATABASE for distributed databases +DETAIL: Citus does not propagate CREATE DATABASE command to workers +HINT: You can manually create a database and its extensions on workers. +-- check that it's only created for coordinator +SELECT * FROM public.check_database_on_all_nodes('local_database') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (local) | {"database_properties": {"datacl": null, "datname": "local_database", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +DROP DATABASE local_database; +-- and is dropped +SELECT * FROM public.check_database_on_all_nodes('local_database') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (local) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +\c - - - :master_port +create user create_drop_db_test_user; +set citus.enable_create_database_propagation=on; +-- Tests for create database propagation with template0 which should fail +CREATE DATABASE mydatabase + WITH OWNER = create_drop_db_test_user + TEMPLATE = 'template0' + ENCODING = 'UTF8' + CONNECTION LIMIT = 10 + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = true + IS_TEMPLATE = false; +ERROR: Only template1 is supported as template parameter for CREATE DATABASE +CREATE DATABASE mydatabase_1 + WITH template=template1 + OWNER = create_drop_db_test_user + ENCODING = 'UTF8' + CONNECTION LIMIT = 10 + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = true + IS_TEMPLATE = false; +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "create_drop_db_tablespace", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +-- Test LC / LOCALE settings that don't match the ones provided in template db. +-- All should throw an error on the coordinator. +CREATE DATABASE lc_collate_test LC_COLLATE = 'C.UTF-8'; +ERROR: new collation (C.UTF-8) is incompatible with the collation of the template database (C) +HINT: Use the same collation as in the template database, or use template0 as template. +CREATE DATABASE lc_ctype_test LC_CTYPE = 'C.UTF-8'; +ERROR: new LC_CTYPE (C.UTF-8) is incompatible with the LC_CTYPE of the template database (C) +HINT: Use the same LC_CTYPE as in the template database, or use template0 as template. +CREATE DATABASE locale_test LOCALE = 'C.UTF-8'; +ERROR: new collation (C.UTF-8) is incompatible with the collation of the template database (C) +HINT: Use the same collation as in the template database, or use template0 as template. +CREATE DATABASE lc_collate_lc_ctype_test LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8'; +ERROR: new collation (C.UTF-8) is incompatible with the collation of the template database (C) +HINT: Use the same collation as in the template database, or use template0 as template. +-- Test LC / LOCALE settings that match the ones provided in template db. +CREATE DATABASE lc_collate_test LC_COLLATE = 'C'; +CREATE DATABASE lc_ctype_test LC_CTYPE = 'C'; +CREATE DATABASE locale_test LOCALE = 'C'; +CREATE DATABASE lc_collate_lc_ctype_test LC_COLLATE = 'C' LC_CTYPE = 'C'; +SELECT * FROM public.check_database_on_all_nodes('lc_collate_test') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "lc_collate_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "lc_collate_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "lc_collate_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('lc_ctype_test') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "lc_ctype_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "lc_ctype_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "lc_ctype_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('locale_test') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "locale_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "locale_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "locale_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('lc_collate_lc_ctype_test') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "lc_collate_lc_ctype_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "lc_collate_lc_ctype_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "lc_collate_lc_ctype_test", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +DROP DATABASE lc_collate_test; +DROP DATABASE lc_ctype_test; +DROP DATABASE locale_test; +DROP DATABASE lc_collate_lc_ctype_test; +-- ALTER TABLESPACE .. RENAME TO .. is not supported, so we need to rename it manually. +SELECT result FROM run_command_on_all_nodes( + $$ + ALTER TABLESPACE create_drop_db_tablespace RENAME TO "ts-needs\!escape" + $$ +); + result +--------------------------------------------------------------------- + ALTER TABLESPACE + ALTER TABLESPACE + ALTER TABLESPACE +(3 rows) + +CREATE USER "role-needs\!escape"; +CREATE DATABASE "db-needs\!escape" owner "role-needs\!escape" tablespace "ts-needs\!escape"; +-- Rename it to make check_database_on_all_nodes happy. +-- Today we don't support ALTER DATABASE .. RENAME TO .., so need to propagate it manually. +SELECT result FROM run_command_on_all_nodes( + $$ + ALTER DATABASE "db-needs\!escape" RENAME TO db_needs_escape + $$ +); + result +--------------------------------------------------------------------- + ALTER DATABASE + ALTER DATABASE + ALTER DATABASE +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('db_needs_escape') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +-- test database syncing after node addition +select 1 from citus_remove_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +--test with is_template true and allow connections false +CREATE DATABASE mydatabase + OWNER = create_drop_db_test_user + CONNECTION LIMIT = 10 + ENCODING = 'UTF8' + TABLESPACE = "ts-needs\!escape" + ALLOW_CONNECTIONS = false + IS_TEMPLATE = false; +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(2 rows) + +SET citus.metadata_sync_mode to 'transactional'; +select 1 from citus_add_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('db_needs_escape') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +select 1 from citus_remove_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +SET citus.metadata_sync_mode to 'nontransactional'; +select 1 from citus_add_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +RESET citus.metadata_sync_mode; +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('db_needs_escape') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT citus_disable_node_and_wait('localhost', :worker_1_port, true); + citus_disable_node_and_wait +--------------------------------------------------------------------- + +(1 row) + +CREATE DATABASE test_node_activation; +SELECT 1 FROM citus_activate_node('localhost', :worker_1_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "mydatabase_1", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": 10, "daticulocale": null, "datistemplate": false, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('db_needs_escape') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "db_needs_escape", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "role-needs\\!escape", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('test_node_activation') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "test_node_activation", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "test_node_activation", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "test_node_activation", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database mydatabase; +NOTICE: issuing DROP DATABASE mydatabase +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +NOTICE: issuing DROP DATABASE mydatabase +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +SET citus.log_remote_commands = false; +-- check that we actually drop the database +drop database mydatabase_1; +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +-- create a template database with all options set and allow connections false +CREATE DATABASE my_template_database + WITH OWNER = create_drop_db_test_user + ENCODING = 'UTF8' + TABLESPACE = "ts-needs\!escape" + ALLOW_CONNECTIONS = false + IS_TEMPLATE = true; +SELECT * FROM public.check_database_on_all_nodes('my_template_database') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "my_template_database", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": -1, "daticulocale": null, "datistemplate": true, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "my_template_database", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": -1, "daticulocale": null, "datistemplate": true, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "my_template_database", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "ts-needs\\!escape", "daticurules": null, "datallowconn": false, "datconnlimit": -1, "daticulocale": null, "datistemplate": true, "database_owner": "create_drop_db_test_user", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +--template databases could not be dropped so we need to change the template flag +SELECT result from run_command_on_all_nodes( + $$ + UPDATE pg_database SET datistemplate = false WHERE datname = 'my_template_database' + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + UPDATE 1 + UPDATE 1 + UPDATE 1 +(3 rows) + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database my_template_database; +NOTICE: issuing DROP DATABASE my_template_database +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +NOTICE: issuing DROP DATABASE my_template_database +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +SET citus.log_remote_commands = false; +SELECT * FROM public.check_database_on_all_nodes('my_template_database') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +--tests for special characters in database name +set citus.enable_create_database_propagation=on; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE DATABASE%'; +create database "mydatabase#1'2"; +NOTICE: issuing CREATE DATABASE "mydatabase#1'2" +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +NOTICE: issuing CREATE DATABASE "mydatabase#1'2" +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database if exists "mydatabase#1'2"; +NOTICE: issuing DROP DATABASE IF EXISTS "mydatabase#1'2" +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +NOTICE: issuing DROP DATABASE IF EXISTS "mydatabase#1'2" +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +reset citus.grep_remote_commands; +reset citus.log_remote_commands; +-- it doesn't fail thanks to "if exists" +drop database if exists "mydatabase#1'2"; +NOTICE: database "mydatabase#1'2" does not exist, skipping +-- recreate it to verify that it's actually dropped +create database "mydatabase#1'2"; +drop database "mydatabase#1'2"; +-- second time we try to drop it, it fails due to lack of "if exists" +drop database "mydatabase#1'2"; +ERROR: database "mydatabase#1'2" does not exist +\c - - - :worker_1_port +SET citus.enable_create_database_propagation TO ON; +-- show that dropping the database from workers is not allowed when citus.enable_create_database_propagation is on +DROP DATABASE db_needs_escape; +ERROR: operation is not allowed on this node +HINT: Connect to the coordinator and run it again. +-- and the same applies to create database too +create database error_test; +ERROR: operation is not allowed on this node +HINT: Connect to the coordinator and run it again. +\c - - - :master_port +SET citus.enable_create_database_propagation TO ON; +DROP DATABASE test_node_activation; +DROP DATABASE db_needs_escape; +DROP USER "role-needs\!escape"; +-- drop database with force options test +create database db_force_test; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database db_force_test with (force); +NOTICE: issuing DROP DATABASE db_force_test WITH ( FORCE ) +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +NOTICE: issuing DROP DATABASE db_force_test WITH ( FORCE ) +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +reset citus.log_remote_commands; +reset citus.grep_remote_commands; +SELECT * FROM public.check_database_on_all_nodes('db_force_test') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +-- test that we won't propagate non-distributed databases in citus_add_node +select 1 from citus_remove_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +SET citus.enable_create_database_propagation TO off; +CREATE DATABASE non_distributed_db; +NOTICE: Citus partially supports CREATE DATABASE for distributed databases +DETAIL: Citus does not propagate CREATE DATABASE command to workers +HINT: You can manually create a database and its extensions on workers. +SET citus.enable_create_database_propagation TO on; +create database distributed_db; +select 1 from citus_add_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +--non_distributed_db should not be propagated to worker_2 +SELECT * FROM public.check_database_on_all_nodes('non_distributed_db') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "non_distributed_db", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": null, "pg_dist_object_record_for_db_exists": false, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +--distributed_db should be propagated to worker_2 +SELECT * FROM public.check_database_on_all_nodes('distributed_db') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "distributed_db", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "distributed_db", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "distributed_db", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +--clean up resources created by this test +drop database distributed_db; +set citus.enable_create_database_propagation TO off; +drop database non_distributed_db; +-- test role grants on DATABASE in metadata sync +SELECT result from run_command_on_all_nodes( + $$ + create database db_role_grants_test_non_distributed + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + CREATE DATABASE + CREATE DATABASE + CREATE DATABASE +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + revoke connect,temp,temporary,create on database db_role_grants_test_non_distributed from public + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + ERROR: operation is not allowed on this node + ERROR: operation is not allowed on this node + REVOKE +(3 rows) + +SET citus.enable_create_database_propagation TO on; +CREATE ROLE db_role_grants_test_role_exists_on_node_2; +select 1 from citus_remove_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +CREATE DATABASE db_role_grants_test; +revoke connect,temp,temporary,create on database db_role_grants_test from public; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE ROLE%'; +CREATE ROLE db_role_grants_test_role_missing_on_node_2; +NOTICE: issuing SELECT worker_create_or_alter_role('db_role_grants_test_role_missing_on_node_2', 'CREATE ROLE db_role_grants_test_role_missing_on_node_2', 'ALTER ROLE db_role_grants_test_role_missing_on_node_2') +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +RESET citus.log_remote_commands ; +RESET citus.grep_remote_commands; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%GRANT%'; +grant CONNECT,TEMPORARY,CREATE on DATABASE db_role_grants_test to db_role_grants_test_role_exists_on_node_2; +NOTICE: issuing GRANT connect, temporary, create ON DATABASE db_role_grants_test TO db_role_grants_test_role_exists_on_node_2; +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +grant CONNECT,TEMPORARY,CREATE on DATABASE db_role_grants_test to db_role_grants_test_role_missing_on_node_2; +NOTICE: issuing GRANT connect, temporary, create ON DATABASE db_role_grants_test TO db_role_grants_test_role_missing_on_node_2; +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +grant CONNECT,TEMPORARY,CREATE on DATABASE db_role_grants_test_non_distributed to db_role_grants_test_role_exists_on_node_2; +NOTICE: issuing GRANT connect, temporary, create ON DATABASE db_role_grants_test_non_distributed TO db_role_grants_test_role_exists_on_node_2; +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +grant CONNECT,TEMPORARY,CREATE on DATABASE db_role_grants_test_non_distributed to db_role_grants_test_role_missing_on_node_2; +NOTICE: issuing GRANT connect, temporary, create ON DATABASE db_role_grants_test_non_distributed TO db_role_grants_test_role_missing_on_node_2; +DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx +-- check the privileges before add_node for database db_role_grants_test, +-- role db_role_grants_test_role_exists_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'CREATE') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'TEMPORARY') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'CONNECT') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +-- check the privileges before add_node for database db_role_grants_test, +-- role db_role_grants_test_role_missing_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'CREATE') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'TEMPORARY') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'CONNECT') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +-- check the privileges before add_node for database db_role_grants_test_non_distributed, +-- role db_role_grants_test_role_exists_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'CREATE') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'TEMPORARY') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'CONNECT') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +-- check the privileges before add_node for database db_role_grants_test_non_distributed, +-- role db_role_grants_test_role_missing_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'CREATE') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'TEMPORARY') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'CONNECT') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t +(2 rows) + +RESET citus.log_remote_commands; +RESET citus.grep_remote_commands; +select 1 from citus_add_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +-- check the privileges after add_node for database db_role_grants_test, +-- role db_role_grants_test_role_exists_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'CREATE') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t + t +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'TEMPORARY') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t + t +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'CONNECT') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t + t +(3 rows) + +-- check the privileges after add_node for database db_role_grants_test, +-- role db_role_grants_test_role_missing_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'CREATE') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t + t +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'TEMPORARY') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t + t +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'CONNECT') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + t + t + t +(3 rows) + +-- check the privileges after add_node for database db_role_grants_test_non_distributed, +-- role db_role_grants_test_role_exists_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'CREATE') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + f + t + t +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'TEMPORARY') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + f + t + t +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'CONNECT') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + f + t + t +(3 rows) + +-- check the privileges after add_node for database db_role_grants_test_non_distributed, +-- role db_role_grants_test_role_missing_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'CREATE') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + f + t + t +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'TEMPORARY') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + f + t + t +(3 rows) + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'CONNECT') + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + f + t + t +(3 rows) + +grant connect,temp,temporary,create on database db_role_grants_test to public; +DROP DATABASE db_role_grants_test; +SELECT result from run_command_on_all_nodes( + $$ + drop database db_role_grants_test_non_distributed + $$ +) ORDER BY result; + result +--------------------------------------------------------------------- + DROP DATABASE + DROP DATABASE + DROP DATABASE +(3 rows) + +DROP ROLE db_role_grants_test_role_exists_on_node_2; +DROP ROLE db_role_grants_test_role_missing_on_node_2; +select 1 from citus_remove_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +set citus.enable_create_role_propagation TO off; +create role non_propagated_role; +NOTICE: not propagating CREATE ROLE/USER commands to other nodes +HINT: Connect to other nodes directly to manually create all necessary users and roles. +set citus.enable_create_role_propagation TO on; +set citus.enable_create_database_propagation TO on; +-- Make sure that we propagate non_propagated_role because it's a dependency of test_db. +-- And hence it becomes a distributed object. +create database test_db OWNER non_propagated_role; +create role propagated_role; +grant connect on database test_db to propagated_role; +SELECT 1 FROM citus_add_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT * FROM public.check_database_on_all_nodes('test_db') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": ["=Tc/non_propagated_role", "non_propagated_role=CTc/non_propagated_role", "propagated_role=c/non_propagated_role"], "datname": "test_db", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "non_propagated_role", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": ["=Tc/non_propagated_role", "non_propagated_role=CTc/non_propagated_role", "propagated_role=c/non_propagated_role"], "datname": "test_db", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "non_propagated_role", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": ["=Tc/non_propagated_role", "non_propagated_role=CTc/non_propagated_role", "propagated_role=c/non_propagated_role"], "datname": "test_db", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "non_propagated_role", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +REVOKE CONNECT ON DATABASE test_db FROM propagated_role; +DROP DATABASE test_db; +DROP ROLE propagated_role, non_propagated_role; +--clean up resources created by this test +-- DROP TABLESPACE is not supported, so we need to drop it manually. +SELECT result FROM run_command_on_all_nodes( + $$ + drop tablespace "ts-needs\!escape" + $$ +); + result +--------------------------------------------------------------------- + DROP TABLESPACE + DROP TABLESPACE + DROP TABLESPACE +(3 rows) + +drop user create_drop_db_test_user; +reset citus.enable_create_database_propagation; diff --git a/src/test/regress/expected/create_drop_database_propagation_pg15.out b/src/test/regress/expected/create_drop_database_propagation_pg15.out new file mode 100644 index 000000000..9a501558a --- /dev/null +++ b/src/test/regress/expected/create_drop_database_propagation_pg15.out @@ -0,0 +1,82 @@ +-- +-- PG15 +-- +SHOW server_version \gset +SELECT substring(:'server_version', '\d+')::int >= 15 AS server_version_ge_15 +\gset +\if :server_version_ge_15 +\else +\q +\endif +-- create/drop database for pg >= 15 +set citus.enable_create_database_propagation=on; +CREATE DATABASE mydatabase + WITH OID = 966345; +ERROR: CREATE DATABASE option "oid" is not supported +CREATE DATABASE mydatabase + WITH strategy file_copy; +ERROR: Only wal_log is supported as strategy parameter for CREATE DATABASE +CREATE DATABASE st_wal_log + WITH strategy WaL_LoG; +SELECT * FROM public.check_database_on_all_nodes('st_wal_log') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "st_wal_log", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "st_wal_log", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "st_wal_log", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +drop database st_wal_log; +select 1 from citus_remove_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +-- test COLLATION_VERSION +CREATE DATABASE test_collation_version + WITH ENCODING = 'UTF8' + COLLATION_VERSION = '1.0' + ALLOW_CONNECTIONS = false; +select 1 from citus_add_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT * FROM public.check_database_on_all_nodes('test_collation_version') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "test_collation_version", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": false, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": "1.0", "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "test_collation_version", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": false, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": "1.0", "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "test_collation_version", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": false, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": "1.0", "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +drop database test_collation_version; +SET client_min_messages TO WARNING; +-- test LOCALE_PROVIDER & ICU_LOCALE +CREATE DATABASE test_locale_provider + WITH ENCODING = 'UTF8' + LOCALE_PROVIDER = 'icu' + ICU_LOCALE = 'en_US'; +ERROR: new locale provider (icu) does not match locale provider of the template database (libc) +HINT: Use the same locale provider as in the template database, or use template0 as template. +RESET client_min_messages; +CREATE DATABASE test_locale_provider + WITH ENCODING = 'UTF8' + LOCALE_PROVIDER = 'libc' + ICU_LOCALE = 'en_US'; +ERROR: ICU locale cannot be specified unless locale provider is ICU +CREATE DATABASE test_locale_provider + WITH ENCODING = 'UTF8' + LOCALE_PROVIDER = 'libc'; +SELECT * FROM public.check_database_on_all_nodes('test_locale_provider') ORDER BY node_type; + node_type | result +--------------------------------------------------------------------- + coordinator (local) | {"database_properties": {"datacl": null, "datname": "test_locale_provider", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "test_locale_provider", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} + worker node (remote) | {"database_properties": {"datacl": null, "datname": "test_locale_provider", "datctype": "C", "encoding": "UTF8", "datcollate": "C", "tablespace": "pg_default", "daticurules": null, "datallowconn": true, "datconnlimit": -1, "daticulocale": null, "datistemplate": false, "database_owner": "postgres", "datcollversion": null, "datlocprovider": "c"}, "pg_dist_object_record_for_db_exists": true, "stale_pg_dist_object_record_for_a_db_exists": false} +(3 rows) + +drop database test_locale_provider; +\c - - - :master_port diff --git a/src/test/regress/expected/create_drop_database_propagation_pg15_0.out b/src/test/regress/expected/create_drop_database_propagation_pg15_0.out new file mode 100644 index 000000000..b1ed9cc5b --- /dev/null +++ b/src/test/regress/expected/create_drop_database_propagation_pg15_0.out @@ -0,0 +1,9 @@ +-- +-- PG15 +-- +SHOW server_version \gset +SELECT substring(:'server_version', '\d+')::int >= 15 AS server_version_ge_15 +\gset +\if :server_version_ge_15 +\else +\q diff --git a/src/test/regress/expected/create_drop_database_propagation_pg16.out b/src/test/regress/expected/create_drop_database_propagation_pg16.out new file mode 100644 index 000000000..75cd99e61 --- /dev/null +++ b/src/test/regress/expected/create_drop_database_propagation_pg16.out @@ -0,0 +1,23 @@ +-- +-- PG16 +-- +SHOW server_version \gset +SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16 +\gset +\if :server_version_ge_16 +\else +\q +\endif +-- create/drop database for pg >= 16 +set citus.enable_create_database_propagation=on; +-- test icu_rules +-- +-- practically we don't support it but better to test +CREATE DATABASE citus_icu_rules_test WITH icu_rules='de_DE@collation=phonebook'; +ERROR: ICU rules cannot be specified unless locale provider is ICU +CREATE DATABASE citus_icu_rules_test WITH icu_rules='de_DE@collation=phonebook' locale_provider='icu'; +ERROR: LOCALE or ICU_LOCALE must be specified +CREATE DATABASE citus_icu_rules_test WITH icu_rules='de_DE@collation=phonebook' locale_provider='icu' icu_locale = 'de_DE'; +NOTICE: using standard form "de-DE" for ICU locale "de_DE" +ERROR: new locale provider (icu) does not match locale provider of the template database (libc) +HINT: Use the same locale provider as in the template database, or use template0 as template. diff --git a/src/test/regress/expected/create_drop_database_propagation_pg16_0.out b/src/test/regress/expected/create_drop_database_propagation_pg16_0.out new file mode 100644 index 000000000..730c916ca --- /dev/null +++ b/src/test/regress/expected/create_drop_database_propagation_pg16_0.out @@ -0,0 +1,9 @@ +-- +-- PG16 +-- +SHOW server_version \gset +SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16 +\gset +\if :server_version_ge_16 +\else +\q diff --git a/src/test/regress/expected/failure_create_index_concurrently.out b/src/test/regress/expected/failure_create_index_concurrently.out index a198ddc70..784c91aec 100644 --- a/src/test/regress/expected/failure_create_index_concurrently.out +++ b/src/test/regress/expected/failure_create_index_concurrently.out @@ -26,8 +26,9 @@ SELECT citus.mitmproxy('conn.onQuery(query="CREATE").kill()'); (1 row) CREATE INDEX CONCURRENTLY idx_index_test ON index_test(id, value_1); -WARNING: CONCURRENTLY-enabled index commands can fail partially, leaving behind an INVALID index. -Use DROP INDEX CONCURRENTLY IF EXISTS to remove the invalid index. +WARNING: Commands that are not transaction-safe may result in partial failure, potentially leading to an inconsistent state. +If the problematic command is a CREATE operation, consider using the 'IF EXISTS' syntax to drop the object, +if applicable, and then re-attempt the original command. ERROR: connection to the remote node localhost:xxxxx failed with the following error: connection not open SELECT citus.mitmproxy('conn.allow()'); mitmproxy @@ -59,8 +60,9 @@ SELECT citus.mitmproxy('conn.onQuery(query="CREATE").kill()'); (1 row) CREATE INDEX CONCURRENTLY idx_index_test ON index_test(id, value_1); -WARNING: CONCURRENTLY-enabled index commands can fail partially, leaving behind an INVALID index. -Use DROP INDEX CONCURRENTLY IF EXISTS to remove the invalid index. +WARNING: Commands that are not transaction-safe may result in partial failure, potentially leading to an inconsistent state. +If the problematic command is a CREATE operation, consider using the 'IF EXISTS' syntax to drop the object, +if applicable, and then re-attempt the original command. ERROR: connection to the remote node localhost:xxxxx failed with the following error: connection not open SELECT citus.mitmproxy('conn.allow()'); mitmproxy @@ -86,8 +88,9 @@ SELECT citus.mitmproxy('conn.onQuery(query="CREATE").cancel(' || pg_backend_pid( (1 row) CREATE INDEX CONCURRENTLY idx_index_test ON index_test(id, value_1); -WARNING: CONCURRENTLY-enabled index commands can fail partially, leaving behind an INVALID index. -Use DROP INDEX CONCURRENTLY IF EXISTS to remove the invalid index. +WARNING: Commands that are not transaction-safe may result in partial failure, potentially leading to an inconsistent state. +If the problematic command is a CREATE operation, consider using the 'IF EXISTS' syntax to drop the object, +if applicable, and then re-attempt the original command. ERROR: canceling statement due to user request SELECT citus.mitmproxy('conn.allow()'); mitmproxy @@ -111,8 +114,9 @@ SELECT citus.mitmproxy('conn.onQuery(query="CREATE").cancel(' || pg_backend_pid( (1 row) CREATE INDEX CONCURRENTLY idx_index_test ON index_test(id, value_1); -WARNING: CONCURRENTLY-enabled index commands can fail partially, leaving behind an INVALID index. -Use DROP INDEX CONCURRENTLY IF EXISTS to remove the invalid index. +WARNING: Commands that are not transaction-safe may result in partial failure, potentially leading to an inconsistent state. +If the problematic command is a CREATE operation, consider using the 'IF EXISTS' syntax to drop the object, +if applicable, and then re-attempt the original command. ERROR: canceling statement due to user request SELECT citus.mitmproxy('conn.allow()'); mitmproxy @@ -137,8 +141,9 @@ SELECT citus.mitmproxy('conn.onQuery(query="DROP INDEX CONCURRENTLY").kill()'); (1 row) DROP INDEX CONCURRENTLY IF EXISTS idx_index_test; -WARNING: CONCURRENTLY-enabled index commands can fail partially, leaving behind an INVALID index. -Use DROP INDEX CONCURRENTLY IF EXISTS to remove the invalid index. +WARNING: Commands that are not transaction-safe may result in partial failure, potentially leading to an inconsistent state. +If the problematic command is a CREATE operation, consider using the 'IF EXISTS' syntax to drop the object, +if applicable, and then re-attempt the original command. ERROR: connection to the remote node localhost:xxxxx failed with the following error: connection not open SELECT citus.mitmproxy('conn.allow()'); mitmproxy @@ -164,8 +169,9 @@ SELECT create_distributed_table('index_test_2', 'a'); INSERT INTO index_test_2 VALUES (1, 1), (1, 2); CREATE UNIQUE INDEX CONCURRENTLY index_test_2_a_idx ON index_test_2(a); -WARNING: CONCURRENTLY-enabled index commands can fail partially, leaving behind an INVALID index. -Use DROP INDEX CONCURRENTLY IF EXISTS to remove the invalid index. +WARNING: Commands that are not transaction-safe may result in partial failure, potentially leading to an inconsistent state. +If the problematic command is a CREATE operation, consider using the 'IF EXISTS' syntax to drop the object, +if applicable, and then re-attempt the original command. ERROR: could not create unique index "index_test_2_a_idx_1880019" DETAIL: Key (a)=(1) is duplicated. CONTEXT: while executing command on localhost:xxxxx diff --git a/src/test/regress/expected/failure_split_cleanup.out b/src/test/regress/expected/failure_split_cleanup.out index d81335325..f9eacd47c 100644 --- a/src/test/regress/expected/failure_split_cleanup.out +++ b/src/test/regress/expected/failure_split_cleanup.out @@ -54,7 +54,7 @@ SELECT create_distributed_table('table_to_split', 'id'); ERROR: connection not open CONTEXT: while executing command on localhost:xxxxx SELECT operation_id, object_type, object_name, node_group_id, policy_type - FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name; + FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name, node_group_id; operation_id | object_type | object_name | node_group_id | policy_type --------------------------------------------------------------------- 777 | 1 | citus_failure_split_cleanup_schema.table_to_split_8981000 | 1 | 0 @@ -109,7 +109,7 @@ CONTEXT: while executing command on localhost:xxxxx (1 row) SELECT operation_id, object_type, object_name, node_group_id, policy_type - FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name; + FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name, node_group_id; operation_id | object_type | object_name | node_group_id | policy_type --------------------------------------------------------------------- (0 rows) @@ -163,7 +163,7 @@ CONTEXT: while executing command on localhost:xxxxx ERROR: Failed to run worker_split_shard_replication_setup UDF. It should successfully execute for splitting a shard in a non-blocking way. Please retry. RESET client_min_messages; SELECT operation_id, object_type, object_name, node_group_id, policy_type - FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name; + FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name, node_group_id; operation_id | object_type | object_name | node_group_id | policy_type --------------------------------------------------------------------- 777 | 1 | citus_failure_split_cleanup_schema.table_to_split_8981000 | 1 | 0 @@ -221,7 +221,7 @@ ERROR: Failed to run worker_split_shard_replication_setup UDF. It should succes (1 row) SELECT operation_id, object_type, object_name, node_group_id, policy_type - FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name; + FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name, node_group_id; operation_id | object_type | object_name | node_group_id | policy_type --------------------------------------------------------------------- (0 rows) diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index 295b10c76..43f9c3b98 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -1422,7 +1422,8 @@ ALTER EXTENSION citus UPDATE TO '12.2-1'; SELECT * FROM multi_extension.print_extension_changes(); previous_object | current_object --------------------------------------------------------------------- -(0 rows) + | function citus_internal_database_command(text) void +(1 row) DROP TABLE multi_extension.prev_objects, multi_extension.extension_diff; -- show running version diff --git a/src/test/regress/expected/multi_test_helpers.out b/src/test/regress/expected/multi_test_helpers.out index 4b621b968..70a541d2a 100644 --- a/src/test/regress/expected/multi_test_helpers.out +++ b/src/test/regress/expected/multi_test_helpers.out @@ -556,3 +556,73 @@ BEGIN ORDER BY node_type; END; $func$ LANGUAGE plpgsql; +-- For all nodes, returns database properties of given database, except +-- oid, datfrozenxid and datminmxid. +-- +-- Also returns whether the node has a pg_dist_object record for the database +-- and whether there are any stale pg_dist_object records for a database. +CREATE OR REPLACE FUNCTION check_database_on_all_nodes(p_database_name text) +RETURNS TABLE (node_type text, result text) +AS $func$ +DECLARE + pg_ge_15_options text := ''; + pg_ge_16_options text := ''; +BEGIN + IF EXISTS (SELECT 1 FROM pg_attribute WHERE attrelid = 'pg_database'::regclass AND attname = 'datlocprovider') THEN + pg_ge_15_options := ', daticulocale, datcollversion, datlocprovider'; + ELSE + pg_ge_15_options := $$, null as daticulocale, null as datcollversion, 'c' as datlocprovider$$; + END IF; + + IF EXISTS (SELECT 1 FROM pg_attribute WHERE attrelid = 'pg_database'::regclass AND attname = 'daticurules') THEN + pg_ge_16_options := ', daticurules'; + ELSE + pg_ge_16_options := ', null as daticurules'; + END IF; + + RETURN QUERY + SELECT + CASE WHEN (groupid = 0 AND groupid = (SELECT groupid FROM pg_dist_local_group)) THEN 'coordinator (local)' + WHEN (groupid = 0) THEN 'coordinator (remote)' + WHEN (groupid = (SELECT groupid FROM pg_dist_local_group)) THEN 'worker node (local)' + ELSE 'worker node (remote)' + END AS node_type, + q2.result + FROM run_command_on_all_nodes( + format( + $$ + SELECT to_jsonb(q.*) + FROM ( + SELECT + ( + SELECT to_jsonb(database_properties.*) + FROM ( + SELECT datname, pa.rolname as database_owner, + pg_encoding_to_char(pd.encoding) as encoding, + datistemplate, datallowconn, datconnlimit, datacl, + pt.spcname AS tablespace, datcollate, datctype + %2$s -- >= pg15 options + %3$s -- >= pg16 options + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + JOIN pg_tablespace pt ON pd.dattablespace = pt.oid + WHERE datname = '%1$s' + ) database_properties + ) AS database_properties, + ( + SELECT COUNT(*)=1 + FROM pg_dist_object WHERE objid = (SELECT oid FROM pg_database WHERE datname = '%1$s') + ) AS pg_dist_object_record_for_db_exists, + ( + SELECT COUNT(*) > 0 + FROM pg_dist_object + WHERE classid = 1262 AND objid NOT IN (SELECT oid FROM pg_database) + ) AS stale_pg_dist_object_record_for_a_db_exists + ) q + $$, + p_database_name, pg_ge_15_options, pg_ge_16_options + ) + ) q2 + JOIN pg_dist_node USING (nodeid); +END; +$func$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/src/test/regress/expected/single_node.out b/src/test/regress/expected/single_node.out index f485763c5..522ffb8e8 100644 --- a/src/test/regress/expected/single_node.out +++ b/src/test/regress/expected/single_node.out @@ -88,8 +88,9 @@ SELECT create_distributed_table('failover_to_local', 'a', shard_count=>32); (1 row) CREATE INDEX CONCURRENTLY ON failover_to_local(a); -WARNING: CONCURRENTLY-enabled index commands can fail partially, leaving behind an INVALID index. - Use DROP INDEX CONCURRENTLY IF EXISTS to remove the invalid index. +WARNING: Commands that are not transaction-safe may result in partial failure, potentially leading to an inconsistent state. +If the problematic command is a CREATE operation, consider using the 'IF EXISTS' syntax to drop the object, +if applicable, and then re-attempt the original command. ERROR: the total number of connections on the server is more than max_connections(100) HINT: Consider using a higher value for max_connections -- reset global GUC changes diff --git a/src/test/regress/expected/single_node_0.out b/src/test/regress/expected/single_node_0.out index 321d283f8..12b385e96 100644 --- a/src/test/regress/expected/single_node_0.out +++ b/src/test/regress/expected/single_node_0.out @@ -88,8 +88,9 @@ SELECT create_distributed_table('failover_to_local', 'a', shard_count=>32); (1 row) CREATE INDEX CONCURRENTLY ON failover_to_local(a); -WARNING: CONCURRENTLY-enabled index commands can fail partially, leaving behind an INVALID index. - Use DROP INDEX CONCURRENTLY IF EXISTS to remove the invalid index. +WARNING: Commands that are not transaction-safe may result in partial failure, potentially leading to an inconsistent state. +If the problematic command is a CREATE operation, consider using the 'IF EXISTS' syntax to drop the object, +if applicable, and then re-attempt the original command. ERROR: the total number of connections on the server is more than max_connections(100) HINT: Consider using a higher value for max_connections -- reset global GUC changes diff --git a/src/test/regress/expected/upgrade_list_citus_objects.out b/src/test/regress/expected/upgrade_list_citus_objects.out index 36bd504e8..942e0336f 100644 --- a/src/test/regress/expected/upgrade_list_citus_objects.out +++ b/src/test/regress/expected/upgrade_list_citus_objects.out @@ -71,6 +71,7 @@ ORDER BY 1; function citus_internal_add_shard_metadata(regclass,bigint,"char",text,text) function citus_internal_add_tenant_schema(oid,integer) function citus_internal_adjust_local_clock_to_remote(cluster_clock) + function citus_internal_database_command(text) function citus_internal_delete_colocation_metadata(integer) function citus_internal_delete_partition_metadata(regclass) function citus_internal_delete_placement_metadata(bigint) @@ -343,5 +344,5 @@ ORDER BY 1; view citus_stat_tenants_local view pg_dist_shard_placement view time_partitions -(333 rows) +(334 rows) diff --git a/src/test/regress/multi_1_schedule b/src/test/regress/multi_1_schedule index 4e5e88fa7..2b9fdeb2d 100644 --- a/src/test/regress/multi_1_schedule +++ b/src/test/regress/multi_1_schedule @@ -35,6 +35,9 @@ test: alter_database_owner test: seclabel test: distributed_triggers test: create_single_shard_table +test: create_drop_database_propagation +test: create_drop_database_propagation_pg15 +test: create_drop_database_propagation_pg16 # don't parallelize single_shard_table_udfs to make sure colocation ids are sequential test: single_shard_table_udfs test: schema_based_sharding diff --git a/src/test/regress/pg_regress_multi.pl b/src/test/regress/pg_regress_multi.pl index 3acde4c3c..95330c638 100755 --- a/src/test/regress/pg_regress_multi.pl +++ b/src/test/regress/pg_regress_multi.pl @@ -634,7 +634,7 @@ for my $port (@followerWorkerPorts) } } -for my $tablespace ("ts0", "ts1", "ts2") +for my $tablespace ("ts0", "ts1", "ts2", "ts3", "ts4", "ts5") { if (-e catfile($TMP_CHECKDIR, $tablespace)) { diff --git a/src/test/regress/sql/create_drop_database_propagation.sql b/src/test/regress/sql/create_drop_database_propagation.sql new file mode 100644 index 000000000..c83548d68 --- /dev/null +++ b/src/test/regress/sql/create_drop_database_propagation.sql @@ -0,0 +1,554 @@ + +-- Test for create/drop database propagation. +-- This test is only executes for Postgres versions < 15. +-- For versions >= 15, pg15_create_drop_database_propagation.sql is used. +-- For versions >= 16, pg16_create_drop_database_propagation.sql is used. + +-- Test the UDF that we use to issue database command during metadata sync. +SELECT pg_catalog.citus_internal_database_command(null); + +CREATE ROLE test_db_commands WITH LOGIN; +ALTER SYSTEM SET citus.enable_manual_metadata_changes_for_user TO 'test_db_commands'; +SELECT pg_reload_conf(); +SELECT pg_sleep(0.1); +SET ROLE test_db_commands; + +-- fails on null input +SELECT pg_catalog.citus_internal_database_command(null); + +-- fails on non create / drop db command +SELECT pg_catalog.citus_internal_database_command('CREATE TABLE foo_bar(a int)'); +SELECT pg_catalog.citus_internal_database_command('SELECT 1'); +SELECT pg_catalog.citus_internal_database_command('asfsfdsg'); +SELECT pg_catalog.citus_internal_database_command(''); + +RESET ROLE; +ALTER ROLE test_db_commands nocreatedb; +SET ROLE test_db_commands; + +-- make sure that pg_catalog.citus_internal_database_command doesn't cause privilege escalation +SELECT pg_catalog.citus_internal_database_command('CREATE DATABASE no_permissions'); + +RESET ROLE; +DROP USER test_db_commands; +ALTER SYSTEM RESET citus.enable_manual_metadata_changes_for_user; +SELECT pg_reload_conf(); +SELECT pg_sleep(0.1); + +\set create_drop_db_tablespace :abs_srcdir '/tmp_check/ts3' +CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace'; + +\c - - - :worker_1_port +\set create_drop_db_tablespace :abs_srcdir '/tmp_check/ts4' +CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace'; + +\c - - - :worker_2_port +\set create_drop_db_tablespace :abs_srcdir '/tmp_check/ts5' +CREATE TABLESPACE create_drop_db_tablespace LOCATION :'create_drop_db_tablespace'; + +\c - - - :master_port +CREATE DATABASE local_database; + +-- check that it's only created for coordinator +SELECT * FROM public.check_database_on_all_nodes('local_database') ORDER BY node_type; + +DROP DATABASE local_database; + +-- and is dropped +SELECT * FROM public.check_database_on_all_nodes('local_database') ORDER BY node_type; + +\c - - - :worker_1_port +CREATE DATABASE local_database; + +-- check that it's only created for coordinator +SELECT * FROM public.check_database_on_all_nodes('local_database') ORDER BY node_type; + +DROP DATABASE local_database; + +-- and is dropped +SELECT * FROM public.check_database_on_all_nodes('local_database') ORDER BY node_type; + +\c - - - :master_port +create user create_drop_db_test_user; + +set citus.enable_create_database_propagation=on; + +-- Tests for create database propagation with template0 which should fail +CREATE DATABASE mydatabase + WITH OWNER = create_drop_db_test_user + TEMPLATE = 'template0' + ENCODING = 'UTF8' + CONNECTION LIMIT = 10 + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = true + IS_TEMPLATE = false; + +CREATE DATABASE mydatabase_1 + WITH template=template1 + OWNER = create_drop_db_test_user + ENCODING = 'UTF8' + CONNECTION LIMIT = 10 + TABLESPACE = create_drop_db_tablespace + ALLOW_CONNECTIONS = true + IS_TEMPLATE = false; + +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; + +-- Test LC / LOCALE settings that don't match the ones provided in template db. +-- All should throw an error on the coordinator. +CREATE DATABASE lc_collate_test LC_COLLATE = 'C.UTF-8'; +CREATE DATABASE lc_ctype_test LC_CTYPE = 'C.UTF-8'; +CREATE DATABASE locale_test LOCALE = 'C.UTF-8'; +CREATE DATABASE lc_collate_lc_ctype_test LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8'; + +-- Test LC / LOCALE settings that match the ones provided in template db. +CREATE DATABASE lc_collate_test LC_COLLATE = 'C'; +CREATE DATABASE lc_ctype_test LC_CTYPE = 'C'; +CREATE DATABASE locale_test LOCALE = 'C'; +CREATE DATABASE lc_collate_lc_ctype_test LC_COLLATE = 'C' LC_CTYPE = 'C'; + +SELECT * FROM public.check_database_on_all_nodes('lc_collate_test') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('lc_ctype_test') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('locale_test') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('lc_collate_lc_ctype_test') ORDER BY node_type; + +DROP DATABASE lc_collate_test; +DROP DATABASE lc_ctype_test; +DROP DATABASE locale_test; +DROP DATABASE lc_collate_lc_ctype_test; + +-- ALTER TABLESPACE .. RENAME TO .. is not supported, so we need to rename it manually. +SELECT result FROM run_command_on_all_nodes( + $$ + ALTER TABLESPACE create_drop_db_tablespace RENAME TO "ts-needs\!escape" + $$ +); + +CREATE USER "role-needs\!escape"; + +CREATE DATABASE "db-needs\!escape" owner "role-needs\!escape" tablespace "ts-needs\!escape"; + +-- Rename it to make check_database_on_all_nodes happy. +-- Today we don't support ALTER DATABASE .. RENAME TO .., so need to propagate it manually. +SELECT result FROM run_command_on_all_nodes( + $$ + ALTER DATABASE "db-needs\!escape" RENAME TO db_needs_escape + $$ +); + +SELECT * FROM public.check_database_on_all_nodes('db_needs_escape') ORDER BY node_type; + +-- test database syncing after node addition + +select 1 from citus_remove_node('localhost', :worker_2_port); + +--test with is_template true and allow connections false +CREATE DATABASE mydatabase + OWNER = create_drop_db_test_user + CONNECTION LIMIT = 10 + ENCODING = 'UTF8' + TABLESPACE = "ts-needs\!escape" + ALLOW_CONNECTIONS = false + IS_TEMPLATE = false; + +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; + +SET citus.metadata_sync_mode to 'transactional'; +select 1 from citus_add_node('localhost', :worker_2_port); + +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('db_needs_escape') ORDER BY node_type; + +select 1 from citus_remove_node('localhost', :worker_2_port); + +SET citus.metadata_sync_mode to 'nontransactional'; +select 1 from citus_add_node('localhost', :worker_2_port); + +RESET citus.metadata_sync_mode; + +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('db_needs_escape') ORDER BY node_type; + +SELECT citus_disable_node_and_wait('localhost', :worker_1_port, true); + +CREATE DATABASE test_node_activation; +SELECT 1 FROM citus_activate_node('localhost', :worker_1_port); + +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('db_needs_escape') ORDER BY node_type; +SELECT * FROM public.check_database_on_all_nodes('test_node_activation') ORDER BY node_type; + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database mydatabase; + +SET citus.log_remote_commands = false; + +-- check that we actually drop the database +drop database mydatabase_1; + +SELECT * FROM public.check_database_on_all_nodes('mydatabase_1') ORDER BY node_type; + +SELECT * FROM public.check_database_on_all_nodes('mydatabase') ORDER BY node_type; + +-- create a template database with all options set and allow connections false +CREATE DATABASE my_template_database + WITH OWNER = create_drop_db_test_user + ENCODING = 'UTF8' + TABLESPACE = "ts-needs\!escape" + ALLOW_CONNECTIONS = false + IS_TEMPLATE = true; + +SELECT * FROM public.check_database_on_all_nodes('my_template_database') ORDER BY node_type; + +--template databases could not be dropped so we need to change the template flag +SELECT result from run_command_on_all_nodes( + $$ + UPDATE pg_database SET datistemplate = false WHERE datname = 'my_template_database' + $$ +) ORDER BY result; + +SET citus.log_remote_commands = true; + +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database my_template_database; + +SET citus.log_remote_commands = false; + +SELECT * FROM public.check_database_on_all_nodes('my_template_database') ORDER BY node_type; + +--tests for special characters in database name +set citus.enable_create_database_propagation=on; +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE DATABASE%'; + +create database "mydatabase#1'2"; + +set citus.grep_remote_commands = '%DROP DATABASE%'; +drop database if exists "mydatabase#1'2"; + +reset citus.grep_remote_commands; +reset citus.log_remote_commands; + +-- it doesn't fail thanks to "if exists" +drop database if exists "mydatabase#1'2"; + +-- recreate it to verify that it's actually dropped +create database "mydatabase#1'2"; +drop database "mydatabase#1'2"; + +-- second time we try to drop it, it fails due to lack of "if exists" +drop database "mydatabase#1'2"; + +\c - - - :worker_1_port + +SET citus.enable_create_database_propagation TO ON; + +-- show that dropping the database from workers is not allowed when citus.enable_create_database_propagation is on +DROP DATABASE db_needs_escape; + +-- and the same applies to create database too +create database error_test; + +\c - - - :master_port + +SET citus.enable_create_database_propagation TO ON; + +DROP DATABASE test_node_activation; +DROP DATABASE db_needs_escape; +DROP USER "role-needs\!escape"; + +-- drop database with force options test + +create database db_force_test; + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%DROP DATABASE%'; + +drop database db_force_test with (force); + +reset citus.log_remote_commands; +reset citus.grep_remote_commands; + +SELECT * FROM public.check_database_on_all_nodes('db_force_test') ORDER BY node_type; + +-- test that we won't propagate non-distributed databases in citus_add_node + +select 1 from citus_remove_node('localhost', :worker_2_port); +SET citus.enable_create_database_propagation TO off; +CREATE DATABASE non_distributed_db; +SET citus.enable_create_database_propagation TO on; +create database distributed_db; + +select 1 from citus_add_node('localhost', :worker_2_port); + +--non_distributed_db should not be propagated to worker_2 +SELECT * FROM public.check_database_on_all_nodes('non_distributed_db') ORDER BY node_type; +--distributed_db should be propagated to worker_2 +SELECT * FROM public.check_database_on_all_nodes('distributed_db') ORDER BY node_type; + +--clean up resources created by this test +drop database distributed_db; + +set citus.enable_create_database_propagation TO off; +drop database non_distributed_db; + +-- test role grants on DATABASE in metadata sync + +SELECT result from run_command_on_all_nodes( + $$ + create database db_role_grants_test_non_distributed + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + revoke connect,temp,temporary,create on database db_role_grants_test_non_distributed from public + $$ +) ORDER BY result; + +SET citus.enable_create_database_propagation TO on; + +CREATE ROLE db_role_grants_test_role_exists_on_node_2; + +select 1 from citus_remove_node('localhost', :worker_2_port); + +CREATE DATABASE db_role_grants_test; + +revoke connect,temp,temporary,create on database db_role_grants_test from public; + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%CREATE ROLE%'; +CREATE ROLE db_role_grants_test_role_missing_on_node_2; + +RESET citus.log_remote_commands ; +RESET citus.grep_remote_commands; + +SET citus.log_remote_commands = true; +set citus.grep_remote_commands = '%GRANT%'; +grant CONNECT,TEMPORARY,CREATE on DATABASE db_role_grants_test to db_role_grants_test_role_exists_on_node_2; +grant CONNECT,TEMPORARY,CREATE on DATABASE db_role_grants_test to db_role_grants_test_role_missing_on_node_2; + +grant CONNECT,TEMPORARY,CREATE on DATABASE db_role_grants_test_non_distributed to db_role_grants_test_role_exists_on_node_2; +grant CONNECT,TEMPORARY,CREATE on DATABASE db_role_grants_test_non_distributed to db_role_grants_test_role_missing_on_node_2; + +-- check the privileges before add_node for database db_role_grants_test, +-- role db_role_grants_test_role_exists_on_node_2 + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'CREATE') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'TEMPORARY') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'CONNECT') + $$ +) ORDER BY result; + +-- check the privileges before add_node for database db_role_grants_test, +-- role db_role_grants_test_role_missing_on_node_2 + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'CREATE') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'TEMPORARY') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'CONNECT') + $$ +) ORDER BY result; + +-- check the privileges before add_node for database db_role_grants_test_non_distributed, +-- role db_role_grants_test_role_exists_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'CREATE') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'TEMPORARY') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'CONNECT') + $$ +) ORDER BY result; + +-- check the privileges before add_node for database db_role_grants_test_non_distributed, +-- role db_role_grants_test_role_missing_on_node_2 + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'CREATE') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'TEMPORARY') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'CONNECT') + $$ +) ORDER BY result; + +RESET citus.log_remote_commands; +RESET citus.grep_remote_commands; + +select 1 from citus_add_node('localhost', :worker_2_port); + +-- check the privileges after add_node for database db_role_grants_test, +-- role db_role_grants_test_role_exists_on_node_2 + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'CREATE') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'TEMPORARY') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test', 'CONNECT') + $$ +) ORDER BY result; + +-- check the privileges after add_node for database db_role_grants_test, +-- role db_role_grants_test_role_missing_on_node_2 + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'CREATE') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'TEMPORARY') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test', 'CONNECT') + $$ +) ORDER BY result; + +-- check the privileges after add_node for database db_role_grants_test_non_distributed, +-- role db_role_grants_test_role_exists_on_node_2 +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'CREATE') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'TEMPORARY') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_exists_on_node_2','db_role_grants_test_non_distributed', 'CONNECT') + $$ +) ORDER BY result; + +-- check the privileges after add_node for database db_role_grants_test_non_distributed, +-- role db_role_grants_test_role_missing_on_node_2 + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'CREATE') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'TEMPORARY') + $$ +) ORDER BY result; + +SELECT result from run_command_on_all_nodes( + $$ + select has_database_privilege('db_role_grants_test_role_missing_on_node_2','db_role_grants_test_non_distributed', 'CONNECT') + $$ +) ORDER BY result; + +grant connect,temp,temporary,create on database db_role_grants_test to public; + +DROP DATABASE db_role_grants_test; + +SELECT result from run_command_on_all_nodes( + $$ + drop database db_role_grants_test_non_distributed + $$ +) ORDER BY result; +DROP ROLE db_role_grants_test_role_exists_on_node_2; +DROP ROLE db_role_grants_test_role_missing_on_node_2; + +select 1 from citus_remove_node('localhost', :worker_2_port); + +set citus.enable_create_role_propagation TO off; +create role non_propagated_role; +set citus.enable_create_role_propagation TO on; + +set citus.enable_create_database_propagation TO on; + +-- Make sure that we propagate non_propagated_role because it's a dependency of test_db. +-- And hence it becomes a distributed object. +create database test_db OWNER non_propagated_role; + +create role propagated_role; +grant connect on database test_db to propagated_role; + +SELECT 1 FROM citus_add_node('localhost', :worker_2_port); + +SELECT * FROM public.check_database_on_all_nodes('test_db') ORDER BY node_type; + +REVOKE CONNECT ON DATABASE test_db FROM propagated_role; +DROP DATABASE test_db; +DROP ROLE propagated_role, non_propagated_role; + +--clean up resources created by this test + +-- DROP TABLESPACE is not supported, so we need to drop it manually. +SELECT result FROM run_command_on_all_nodes( + $$ + drop tablespace "ts-needs\!escape" + $$ +); + +drop user create_drop_db_test_user; +reset citus.enable_create_database_propagation; diff --git a/src/test/regress/sql/create_drop_database_propagation_pg15.sql b/src/test/regress/sql/create_drop_database_propagation_pg15.sql new file mode 100644 index 000000000..40d1b9e09 --- /dev/null +++ b/src/test/regress/sql/create_drop_database_propagation_pg15.sql @@ -0,0 +1,65 @@ +-- +-- PG15 +-- +SHOW server_version \gset +SELECT substring(:'server_version', '\d+')::int >= 15 AS server_version_ge_15 +\gset +\if :server_version_ge_15 +\else +\q +\endif + +-- create/drop database for pg >= 15 + +set citus.enable_create_database_propagation=on; + +CREATE DATABASE mydatabase + WITH OID = 966345; + +CREATE DATABASE mydatabase + WITH strategy file_copy; + +CREATE DATABASE st_wal_log + WITH strategy WaL_LoG; + +SELECT * FROM public.check_database_on_all_nodes('st_wal_log') ORDER BY node_type; + +drop database st_wal_log; + +select 1 from citus_remove_node('localhost', :worker_2_port); + +-- test COLLATION_VERSION + +CREATE DATABASE test_collation_version + WITH ENCODING = 'UTF8' + COLLATION_VERSION = '1.0' + ALLOW_CONNECTIONS = false; + +select 1 from citus_add_node('localhost', :worker_2_port); + +SELECT * FROM public.check_database_on_all_nodes('test_collation_version') ORDER BY node_type; + +drop database test_collation_version; + +SET client_min_messages TO WARNING; +-- test LOCALE_PROVIDER & ICU_LOCALE +CREATE DATABASE test_locale_provider + WITH ENCODING = 'UTF8' + LOCALE_PROVIDER = 'icu' + ICU_LOCALE = 'en_US'; +RESET client_min_messages; + +CREATE DATABASE test_locale_provider + WITH ENCODING = 'UTF8' + LOCALE_PROVIDER = 'libc' + ICU_LOCALE = 'en_US'; + +CREATE DATABASE test_locale_provider + WITH ENCODING = 'UTF8' + LOCALE_PROVIDER = 'libc'; + +SELECT * FROM public.check_database_on_all_nodes('test_locale_provider') ORDER BY node_type; + +drop database test_locale_provider; + +\c - - - :master_port diff --git a/src/test/regress/sql/create_drop_database_propagation_pg16.sql b/src/test/regress/sql/create_drop_database_propagation_pg16.sql new file mode 100644 index 000000000..cec553813 --- /dev/null +++ b/src/test/regress/sql/create_drop_database_propagation_pg16.sql @@ -0,0 +1,22 @@ +-- +-- PG16 +-- +SHOW server_version \gset +SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16 +\gset +\if :server_version_ge_16 +\else +\q +\endif + +-- create/drop database for pg >= 16 + +set citus.enable_create_database_propagation=on; + +-- test icu_rules +-- +-- practically we don't support it but better to test + +CREATE DATABASE citus_icu_rules_test WITH icu_rules='de_DE@collation=phonebook'; +CREATE DATABASE citus_icu_rules_test WITH icu_rules='de_DE@collation=phonebook' locale_provider='icu'; +CREATE DATABASE citus_icu_rules_test WITH icu_rules='de_DE@collation=phonebook' locale_provider='icu' icu_locale = 'de_DE'; diff --git a/src/test/regress/sql/failure_split_cleanup.sql b/src/test/regress/sql/failure_split_cleanup.sql index 9dfbb245e..cefeeb05d 100644 --- a/src/test/regress/sql/failure_split_cleanup.sql +++ b/src/test/regress/sql/failure_split_cleanup.sql @@ -38,7 +38,7 @@ SELECT create_distributed_table('table_to_split', 'id'); ARRAY[:worker_1_node, :worker_2_node], 'force_logical'); SELECT operation_id, object_type, object_name, node_group_id, policy_type - FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name; + FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name, node_group_id; -- we need to allow connection so that we can connect to proxy SELECT citus.mitmproxy('conn.allow()'); @@ -58,7 +58,7 @@ SELECT create_distributed_table('table_to_split', 'id'); \c - postgres - :master_port SELECT public.wait_for_resource_cleanup(); SELECT operation_id, object_type, object_name, node_group_id, policy_type - FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name; + FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name, node_group_id; \c - - - :worker_2_proxy_port SET search_path TO "citus_failure_split_cleanup_schema", public, pg_catalog; @@ -90,7 +90,7 @@ SELECT create_distributed_table('table_to_split', 'id'); RESET client_min_messages; SELECT operation_id, object_type, object_name, node_group_id, policy_type - FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name; + FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name, node_group_id; -- we need to allow connection so that we can connect to proxy SELECT citus.mitmproxy('conn.allow()'); @@ -109,7 +109,7 @@ SELECT create_distributed_table('table_to_split', 'id'); \c - postgres - :master_port SELECT public.wait_for_resource_cleanup(); SELECT operation_id, object_type, object_name, node_group_id, policy_type - FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name; + FROM pg_dist_cleanup where operation_id = 777 ORDER BY object_name, node_group_id; \c - - - :worker_2_proxy_port SET search_path TO "citus_failure_split_cleanup_schema", public, pg_catalog; diff --git a/src/test/regress/sql/multi_test_helpers.sql b/src/test/regress/sql/multi_test_helpers.sql index 7f0346d14..e67b782a5 100644 --- a/src/test/regress/sql/multi_test_helpers.sql +++ b/src/test/regress/sql/multi_test_helpers.sql @@ -581,3 +581,74 @@ BEGIN ORDER BY node_type; END; $func$ LANGUAGE plpgsql; + +-- For all nodes, returns database properties of given database, except +-- oid, datfrozenxid and datminmxid. +-- +-- Also returns whether the node has a pg_dist_object record for the database +-- and whether there are any stale pg_dist_object records for a database. +CREATE OR REPLACE FUNCTION check_database_on_all_nodes(p_database_name text) +RETURNS TABLE (node_type text, result text) +AS $func$ +DECLARE + pg_ge_15_options text := ''; + pg_ge_16_options text := ''; +BEGIN + IF EXISTS (SELECT 1 FROM pg_attribute WHERE attrelid = 'pg_database'::regclass AND attname = 'datlocprovider') THEN + pg_ge_15_options := ', daticulocale, datcollversion, datlocprovider'; + ELSE + pg_ge_15_options := $$, null as daticulocale, null as datcollversion, 'c' as datlocprovider$$; + END IF; + + IF EXISTS (SELECT 1 FROM pg_attribute WHERE attrelid = 'pg_database'::regclass AND attname = 'daticurules') THEN + pg_ge_16_options := ', daticurules'; + ELSE + pg_ge_16_options := ', null as daticurules'; + END IF; + + RETURN QUERY + SELECT + CASE WHEN (groupid = 0 AND groupid = (SELECT groupid FROM pg_dist_local_group)) THEN 'coordinator (local)' + WHEN (groupid = 0) THEN 'coordinator (remote)' + WHEN (groupid = (SELECT groupid FROM pg_dist_local_group)) THEN 'worker node (local)' + ELSE 'worker node (remote)' + END AS node_type, + q2.result + FROM run_command_on_all_nodes( + format( + $$ + SELECT to_jsonb(q.*) + FROM ( + SELECT + ( + SELECT to_jsonb(database_properties.*) + FROM ( + SELECT datname, pa.rolname as database_owner, + pg_encoding_to_char(pd.encoding) as encoding, + datistemplate, datallowconn, datconnlimit, datacl, + pt.spcname AS tablespace, datcollate, datctype + %2$s -- >= pg15 options + %3$s -- >= pg16 options + FROM pg_database pd + JOIN pg_authid pa ON pd.datdba = pa.oid + JOIN pg_tablespace pt ON pd.dattablespace = pt.oid + WHERE datname = '%1$s' + ) database_properties + ) AS database_properties, + ( + SELECT COUNT(*)=1 + FROM pg_dist_object WHERE objid = (SELECT oid FROM pg_database WHERE datname = '%1$s') + ) AS pg_dist_object_record_for_db_exists, + ( + SELECT COUNT(*) > 0 + FROM pg_dist_object + WHERE classid = 1262 AND objid NOT IN (SELECT oid FROM pg_database) + ) AS stale_pg_dist_object_record_for_a_db_exists + ) q + $$, + p_database_name, pg_ge_15_options, pg_ge_16_options + ) + ) q2 + JOIN pg_dist_node USING (nodeid); +END; +$func$ LANGUAGE plpgsql;