mirror of https://github.com/citusdata/citus.git
Merge release-13.0 commits to main (#7922)
This is a Merge commit that includes all changes from
release-13.0 branch into main branch.
This Merge commit adds PG17 support and drops PG14 support
from the main branch.
Local steps to open this PR and
include `release-13.0` commits to the `main` branch:
```bash
git checkout release-13.0
git checkout -b naisila/merge_13_0
git rebase main
```
Understandably, the rebase step was a resolve-conflict pain. On top of
resolving some conflicts, I had to add some more commits to this PR such
that the main branch compiles and runs as we want it to. Mainly there
were PG17 additions or PG14 subtractions.
I chose this approach as it cleanly stacks _any new_ `release-13.0`
changes on top of the current main branch. Only new ones, not stuff
there is already on main (we had backported several commits from main to
`release-13.0`, so we ignore those in this PR). The idea is to merge all
these commits in the main branch, not squash and merge.
Note 0: We should remove PG14 tests from required tests as this PR
will drop PG14 support in the main branch as well.
Note 1: `check-style` fails because it considers
`src/backend/distributed/sql/citus--12.1-1--12.2-1.sql` as deleted, and
`src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql` as
renamed. The reason is that the downgrade script actually stayed 98% the
same therefore was considered a rename. I don't think we can fix this.
Note 2:
I tried the following approach as well:
```bash
git checkout main
git checkout -b naisila/merge_13_0
git merge release-13.0
```
However, this approach was a mess as it included several irrelevant
commits that differ between the main and `release-13.0` branch which
just make this PR difficult to understand. For reference, I have pushed
a different branch with that approach.
https://github.com/citusdata/citus/tree/naisila/merge_13_0_first_try As
you can see it's 156 commits ahead of main, with irrelevant commits such
as
1b4d7a51f8
.
The reason is that it's including commits from the very first point of
divergence between `main` and `release-12.1` branch (because we had
cloned `release-13.0` branch from `release-12.1` branch, not `main`).
m3hm3t/issue_7784_main
commit
6b00afac39
|
@ -6,9 +6,12 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
# install build tools
|
# install build tools
|
||||||
RUN apt update && apt install -y \
|
RUN apt update && apt install -y \
|
||||||
|
bison \
|
||||||
bzip2 \
|
bzip2 \
|
||||||
cpanminus \
|
cpanminus \
|
||||||
curl \
|
curl \
|
||||||
|
docbook-xml \
|
||||||
|
docbook-xsl \
|
||||||
flex \
|
flex \
|
||||||
gcc \
|
gcc \
|
||||||
git \
|
git \
|
||||||
|
@ -20,6 +23,7 @@ RUN apt update && apt install -y \
|
||||||
libreadline-dev \
|
libreadline-dev \
|
||||||
libselinux1-dev \
|
libselinux1-dev \
|
||||||
libssl-dev \
|
libssl-dev \
|
||||||
|
libxml2-utils \
|
||||||
libxslt-dev \
|
libxslt-dev \
|
||||||
libzstd-dev \
|
libzstd-dev \
|
||||||
locales \
|
locales \
|
||||||
|
@ -32,6 +36,7 @@ RUN apt update && apt install -y \
|
||||||
sudo \
|
sudo \
|
||||||
uuid-dev \
|
uuid-dev \
|
||||||
valgrind \
|
valgrind \
|
||||||
|
xsltproc \
|
||||||
zlib1g-dev \
|
zlib1g-dev \
|
||||||
&& add-apt-repository ppa:deadsnakes/ppa -y \
|
&& add-apt-repository ppa:deadsnakes/ppa -y \
|
||||||
&& apt install -y \
|
&& apt install -y \
|
||||||
|
@ -67,18 +72,6 @@ ENV PATH="/home/citus/.pgenv/pgsql/bin:${PATH}"
|
||||||
USER citus
|
USER citus
|
||||||
|
|
||||||
# build postgres versions separately for effective parrallelism and caching of already built versions when changing only certain versions
|
# build postgres versions separately for effective parrallelism and caching of already built versions when changing only certain versions
|
||||||
FROM base AS pg14
|
|
||||||
RUN MAKEFLAGS="-j $(nproc)" pgenv build 14.15
|
|
||||||
RUN rm .pgenv/src/*.tar*
|
|
||||||
RUN make -C .pgenv/src/postgresql-*/ clean
|
|
||||||
RUN make -C .pgenv/src/postgresql-*/src/include install
|
|
||||||
|
|
||||||
# create a staging directory with all files we want to copy from our pgenv build
|
|
||||||
# we will copy the contents of the staged folder into the final image at once
|
|
||||||
RUN mkdir .pgenv-staging/
|
|
||||||
RUN cp -r .pgenv/src .pgenv/pgsql-* .pgenv/config .pgenv-staging/
|
|
||||||
RUN rm .pgenv-staging/config/default.conf
|
|
||||||
|
|
||||||
FROM base AS pg15
|
FROM base AS pg15
|
||||||
RUN MAKEFLAGS="-j $(nproc)" pgenv build 15.10
|
RUN MAKEFLAGS="-j $(nproc)" pgenv build 15.10
|
||||||
RUN rm .pgenv/src/*.tar*
|
RUN rm .pgenv/src/*.tar*
|
||||||
|
@ -103,6 +96,18 @@ RUN mkdir .pgenv-staging/
|
||||||
RUN cp -r .pgenv/src .pgenv/pgsql-* .pgenv/config .pgenv-staging/
|
RUN cp -r .pgenv/src .pgenv/pgsql-* .pgenv/config .pgenv-staging/
|
||||||
RUN rm .pgenv-staging/config/default.conf
|
RUN rm .pgenv-staging/config/default.conf
|
||||||
|
|
||||||
|
FROM base AS pg17
|
||||||
|
RUN MAKEFLAGS="-j $(nproc)" pgenv build 17.2
|
||||||
|
RUN rm .pgenv/src/*.tar*
|
||||||
|
RUN make -C .pgenv/src/postgresql-*/ clean
|
||||||
|
RUN make -C .pgenv/src/postgresql-*/src/include install
|
||||||
|
|
||||||
|
# create a staging directory with all files we want to copy from our pgenv build
|
||||||
|
# we will copy the contents of the staged folder into the final image at once
|
||||||
|
RUN mkdir .pgenv-staging/
|
||||||
|
RUN cp -r .pgenv/src .pgenv/pgsql-* .pgenv/config .pgenv-staging/
|
||||||
|
RUN rm .pgenv-staging/config/default.conf
|
||||||
|
|
||||||
FROM base AS uncrustify-builder
|
FROM base AS uncrustify-builder
|
||||||
|
|
||||||
RUN sudo apt update && sudo apt install -y cmake tree
|
RUN sudo apt update && sudo apt install -y cmake tree
|
||||||
|
@ -193,9 +198,9 @@ RUN git clone https://github.com/so-fancy/diff-so-fancy.git \
|
||||||
|
|
||||||
COPY --link --from=uncrustify-builder /uncrustify/usr/ /usr/
|
COPY --link --from=uncrustify-builder /uncrustify/usr/ /usr/
|
||||||
|
|
||||||
COPY --link --from=pg14 /home/citus/.pgenv-staging/ /home/citus/.pgenv/
|
|
||||||
COPY --link --from=pg15 /home/citus/.pgenv-staging/ /home/citus/.pgenv/
|
COPY --link --from=pg15 /home/citus/.pgenv-staging/ /home/citus/.pgenv/
|
||||||
COPY --link --from=pg16 /home/citus/.pgenv-staging/ /home/citus/.pgenv/
|
COPY --link --from=pg16 /home/citus/.pgenv-staging/ /home/citus/.pgenv/
|
||||||
|
COPY --link --from=pg17 /home/citus/.pgenv-staging/ /home/citus/.pgenv/
|
||||||
|
|
||||||
COPY --link --from=pipenv /home/citus/.local/share/virtualenvs/ /home/citus/.local/share/virtualenvs/
|
COPY --link --from=pipenv /home/citus/.local/share/virtualenvs/ /home/citus/.local/share/virtualenvs/
|
||||||
|
|
||||||
|
@ -211,7 +216,7 @@ COPY --chown=citus:citus .psqlrc .
|
||||||
RUN sudo chown --from=root:root citus:citus -R ~
|
RUN sudo chown --from=root:root citus:citus -R ~
|
||||||
|
|
||||||
# sets default pg version
|
# sets default pg version
|
||||||
RUN pgenv switch 16.6
|
RUN pgenv switch 17.2
|
||||||
|
|
||||||
# make connecting to the coordinator easy
|
# make connecting to the coordinator easy
|
||||||
ENV PGPORT=9700
|
ENV PGPORT=9700
|
||||||
|
|
|
@ -25,10 +25,9 @@ configure -whitespace
|
||||||
|
|
||||||
# except these exceptions...
|
# except these exceptions...
|
||||||
src/backend/distributed/utils/citus_outfuncs.c -citus-style
|
src/backend/distributed/utils/citus_outfuncs.c -citus-style
|
||||||
src/backend/distributed/deparser/ruleutils_13.c -citus-style
|
|
||||||
src/backend/distributed/deparser/ruleutils_14.c -citus-style
|
|
||||||
src/backend/distributed/deparser/ruleutils_15.c -citus-style
|
src/backend/distributed/deparser/ruleutils_15.c -citus-style
|
||||||
src/backend/distributed/deparser/ruleutils_16.c -citus-style
|
src/backend/distributed/deparser/ruleutils_16.c -citus-style
|
||||||
|
src/backend/distributed/deparser/ruleutils_17.c -citus-style
|
||||||
src/backend/distributed/commands/index_pg_source.c -citus-style
|
src/backend/distributed/commands/index_pg_source.c -citus-style
|
||||||
|
|
||||||
src/include/distributed/citus_nodes.h -citus-style
|
src/include/distributed/citus_nodes.h -citus-style
|
||||||
|
|
|
@ -31,12 +31,13 @@ jobs:
|
||||||
pgupgrade_image_name: "ghcr.io/citusdata/pgupgradetester"
|
pgupgrade_image_name: "ghcr.io/citusdata/pgupgradetester"
|
||||||
style_checker_image_name: "ghcr.io/citusdata/stylechecker"
|
style_checker_image_name: "ghcr.io/citusdata/stylechecker"
|
||||||
style_checker_tools_version: "0.8.18"
|
style_checker_tools_version: "0.8.18"
|
||||||
sql_snapshot_pg_version: "16.6"
|
sql_snapshot_pg_version: "17.2"
|
||||||
image_suffix: "-v5779674"
|
image_suffix: "-v889e4c1"
|
||||||
pg14_version: '{ "major": "14", "full": "14.15" }'
|
image_suffix_citus_upgrade: "-dev-2ad1f90"
|
||||||
pg15_version: '{ "major": "15", "full": "15.10" }'
|
pg15_version: '{ "major": "15", "full": "15.10" }'
|
||||||
pg16_version: '{ "major": "16", "full": "16.6" }'
|
pg16_version: '{ "major": "16", "full": "16.6" }'
|
||||||
upgrade_pg_versions: "14.15-15.10-16.6"
|
pg17_version: '{ "major": "17", "full": "17.2" }'
|
||||||
|
upgrade_pg_versions: "14.15-15.10-16.6-17.2"
|
||||||
steps:
|
steps:
|
||||||
# Since GHA jobs need at least one step we use a noop step here.
|
# Since GHA jobs need at least one step we use a noop step here.
|
||||||
- name: Set up parameters
|
- name: Set up parameters
|
||||||
|
@ -110,9 +111,9 @@ jobs:
|
||||||
image_suffix:
|
image_suffix:
|
||||||
- ${{ needs.params.outputs.image_suffix}}
|
- ${{ needs.params.outputs.image_suffix}}
|
||||||
pg_version:
|
pg_version:
|
||||||
- ${{ needs.params.outputs.pg14_version }}
|
|
||||||
- ${{ needs.params.outputs.pg15_version }}
|
- ${{ needs.params.outputs.pg15_version }}
|
||||||
- ${{ needs.params.outputs.pg16_version }}
|
- ${{ needs.params.outputs.pg16_version }}
|
||||||
|
- ${{ needs.params.outputs.pg17_version }}
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
image: "${{ matrix.image_name }}:${{ fromJson(matrix.pg_version).full }}${{ matrix.image_suffix }}"
|
image: "${{ matrix.image_name }}:${{ fromJson(matrix.pg_version).full }}${{ matrix.image_suffix }}"
|
||||||
|
@ -141,9 +142,9 @@ jobs:
|
||||||
image_name:
|
image_name:
|
||||||
- ${{ needs.params.outputs.test_image_name }}
|
- ${{ needs.params.outputs.test_image_name }}
|
||||||
pg_version:
|
pg_version:
|
||||||
- ${{ needs.params.outputs.pg14_version }}
|
|
||||||
- ${{ needs.params.outputs.pg15_version }}
|
- ${{ needs.params.outputs.pg15_version }}
|
||||||
- ${{ needs.params.outputs.pg16_version }}
|
- ${{ needs.params.outputs.pg16_version }}
|
||||||
|
- ${{ needs.params.outputs.pg17_version }}
|
||||||
make:
|
make:
|
||||||
- check-split
|
- check-split
|
||||||
- check-multi
|
- check-multi
|
||||||
|
@ -161,10 +162,6 @@ jobs:
|
||||||
- check-enterprise-isolation-logicalrep-2
|
- check-enterprise-isolation-logicalrep-2
|
||||||
- check-enterprise-isolation-logicalrep-3
|
- check-enterprise-isolation-logicalrep-3
|
||||||
include:
|
include:
|
||||||
- make: check-failure
|
|
||||||
pg_version: ${{ needs.params.outputs.pg14_version }}
|
|
||||||
suite: regress
|
|
||||||
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
|
||||||
- make: check-failure
|
- make: check-failure
|
||||||
pg_version: ${{ needs.params.outputs.pg15_version }}
|
pg_version: ${{ needs.params.outputs.pg15_version }}
|
||||||
suite: regress
|
suite: regress
|
||||||
|
@ -173,8 +170,8 @@ jobs:
|
||||||
pg_version: ${{ needs.params.outputs.pg16_version }}
|
pg_version: ${{ needs.params.outputs.pg16_version }}
|
||||||
suite: regress
|
suite: regress
|
||||||
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
- make: check-enterprise-failure
|
- make: check-failure
|
||||||
pg_version: ${{ needs.params.outputs.pg14_version }}
|
pg_version: ${{ needs.params.outputs.pg17_version }}
|
||||||
suite: regress
|
suite: regress
|
||||||
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
- make: check-enterprise-failure
|
- make: check-enterprise-failure
|
||||||
|
@ -185,8 +182,8 @@ jobs:
|
||||||
pg_version: ${{ needs.params.outputs.pg16_version }}
|
pg_version: ${{ needs.params.outputs.pg16_version }}
|
||||||
suite: regress
|
suite: regress
|
||||||
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
- make: check-pytest
|
- make: check-enterprise-failure
|
||||||
pg_version: ${{ needs.params.outputs.pg14_version }}
|
pg_version: ${{ needs.params.outputs.pg17_version }}
|
||||||
suite: regress
|
suite: regress
|
||||||
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
- make: check-pytest
|
- make: check-pytest
|
||||||
|
@ -197,6 +194,10 @@ jobs:
|
||||||
pg_version: ${{ needs.params.outputs.pg16_version }}
|
pg_version: ${{ needs.params.outputs.pg16_version }}
|
||||||
suite: regress
|
suite: regress
|
||||||
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
|
- make: check-pytest
|
||||||
|
pg_version: ${{ needs.params.outputs.pg17_version }}
|
||||||
|
suite: regress
|
||||||
|
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
- make: installcheck
|
- make: installcheck
|
||||||
suite: cdc
|
suite: cdc
|
||||||
image_name: ${{ needs.params.outputs.test_image_name }}
|
image_name: ${{ needs.params.outputs.test_image_name }}
|
||||||
|
@ -205,10 +206,10 @@ jobs:
|
||||||
suite: cdc
|
suite: cdc
|
||||||
image_name: ${{ needs.params.outputs.test_image_name }}
|
image_name: ${{ needs.params.outputs.test_image_name }}
|
||||||
pg_version: ${{ needs.params.outputs.pg16_version }}
|
pg_version: ${{ needs.params.outputs.pg16_version }}
|
||||||
- make: check-query-generator
|
- make: installcheck
|
||||||
pg_version: ${{ needs.params.outputs.pg14_version }}
|
suite: cdc
|
||||||
suite: regress
|
image_name: ${{ needs.params.outputs.test_image_name }}
|
||||||
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
pg_version: ${{ needs.params.outputs.pg17_version }}
|
||||||
- make: check-query-generator
|
- make: check-query-generator
|
||||||
pg_version: ${{ needs.params.outputs.pg15_version }}
|
pg_version: ${{ needs.params.outputs.pg15_version }}
|
||||||
suite: regress
|
suite: regress
|
||||||
|
@ -217,6 +218,10 @@ jobs:
|
||||||
pg_version: ${{ needs.params.outputs.pg16_version }}
|
pg_version: ${{ needs.params.outputs.pg16_version }}
|
||||||
suite: regress
|
suite: regress
|
||||||
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
|
- make: check-query-generator
|
||||||
|
pg_version: ${{ needs.params.outputs.pg17_version }}
|
||||||
|
suite: regress
|
||||||
|
image_name: ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
image: "${{ matrix.image_name }}:${{ fromJson(matrix.pg_version).full }}${{ needs.params.outputs.image_suffix }}"
|
image: "${{ matrix.image_name }}:${{ fromJson(matrix.pg_version).full }}${{ needs.params.outputs.image_suffix }}"
|
||||||
|
@ -257,9 +262,9 @@ jobs:
|
||||||
image_name:
|
image_name:
|
||||||
- ${{ needs.params.outputs.fail_test_image_name }}
|
- ${{ needs.params.outputs.fail_test_image_name }}
|
||||||
pg_version:
|
pg_version:
|
||||||
- ${{ needs.params.outputs.pg14_version }}
|
|
||||||
- ${{ needs.params.outputs.pg15_version }}
|
- ${{ needs.params.outputs.pg15_version }}
|
||||||
- ${{ needs.params.outputs.pg16_version }}
|
- ${{ needs.params.outputs.pg16_version }}
|
||||||
|
- ${{ needs.params.outputs.pg17_version }}
|
||||||
parallel: [0,1,2,3,4,5] # workaround for running 6 parallel jobs
|
parallel: [0,1,2,3,4,5] # workaround for running 6 parallel jobs
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
@ -304,12 +309,12 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- old_pg_major: 14
|
|
||||||
new_pg_major: 15
|
|
||||||
- old_pg_major: 15
|
- old_pg_major: 15
|
||||||
new_pg_major: 16
|
new_pg_major: 16
|
||||||
- old_pg_major: 14
|
- old_pg_major: 16
|
||||||
new_pg_major: 16
|
new_pg_major: 17
|
||||||
|
- old_pg_major: 15
|
||||||
|
new_pg_major: 17
|
||||||
env:
|
env:
|
||||||
old_pg_major: ${{ matrix.old_pg_major }}
|
old_pg_major: ${{ matrix.old_pg_major }}
|
||||||
new_pg_major: ${{ matrix.new_pg_major }}
|
new_pg_major: ${{ matrix.new_pg_major }}
|
||||||
|
@ -345,10 +350,10 @@ jobs:
|
||||||
flags: ${{ env.old_pg_major }}_${{ env.new_pg_major }}_upgrade
|
flags: ${{ env.old_pg_major }}_${{ env.new_pg_major }}_upgrade
|
||||||
codecov_token: ${{ secrets.CODECOV_TOKEN }}
|
codecov_token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
test-citus-upgrade:
|
test-citus-upgrade:
|
||||||
name: PG${{ fromJson(needs.params.outputs.pg14_version).major }} - check-citus-upgrade
|
name: PG${{ fromJson(needs.params.outputs.pg15_version).major }} - check-citus-upgrade
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
image: "${{ needs.params.outputs.citusupgrade_image_name }}:${{ fromJson(needs.params.outputs.pg14_version).full }}${{ needs.params.outputs.image_suffix }}"
|
image: "${{ needs.params.outputs.citusupgrade_image_name }}:${{ fromJson(needs.params.outputs.pg15_version).full }}${{ needs.params.outputs.image_suffix_citus_upgrade }}"
|
||||||
options: --user root
|
options: --user root
|
||||||
needs:
|
needs:
|
||||||
- params
|
- params
|
||||||
|
@ -397,7 +402,7 @@ jobs:
|
||||||
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
image: ${{ needs.params.outputs.test_image_name }}:${{ fromJson(needs.params.outputs.pg16_version).full }}${{ needs.params.outputs.image_suffix }}
|
image: ${{ needs.params.outputs.test_image_name }}:${{ fromJson(needs.params.outputs.pg17_version).full }}${{ needs.params.outputs.image_suffix }}
|
||||||
needs:
|
needs:
|
||||||
- params
|
- params
|
||||||
- test-citus
|
- test-citus
|
||||||
|
@ -509,7 +514,7 @@ jobs:
|
||||||
name: Test flakyness
|
name: Test flakyness
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
image: ${{ needs.params.outputs.fail_test_image_name }}:${{ fromJson(needs.params.outputs.pg16_version).full }}${{ needs.params.outputs.image_suffix }}
|
image: ${{ needs.params.outputs.fail_test_image_name }}:${{ fromJson(needs.params.outputs.pg17_version).full }}${{ needs.params.outputs.image_suffix }}
|
||||||
options: --user root
|
options: --user root
|
||||||
env:
|
env:
|
||||||
runs: 8
|
runs: 8
|
||||||
|
|
|
@ -16,6 +16,11 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
docker:
|
docker:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Docker meta
|
name: Docker meta
|
||||||
|
|
27
CHANGELOG.md
27
CHANGELOG.md
|
@ -1,8 +1,33 @@
|
||||||
|
### citus v13.0.2 (March 12th, 2025) ###
|
||||||
|
|
||||||
|
* Fixes a crash in columnar custom scan that happens when a columnar table is
|
||||||
|
used in a join. (#7647)
|
||||||
|
|
||||||
|
* Fixes a bug that breaks `UPDATE SET (...) = (SELECT some_func(),... )`
|
||||||
|
type of queries on Citus tables (#7914)
|
||||||
|
|
||||||
|
* Fixes a planning error caused by a redundant WHERE clause (#7907)
|
||||||
|
|
||||||
|
* Fixes a crash in left outer joins that can happen when there is an aggregate
|
||||||
|
on a column from the inner side of the join. (#7901)
|
||||||
|
|
||||||
|
* Fixes deadlock with transaction recovery that is possible during Citus
|
||||||
|
upgrades. (#7910)
|
||||||
|
|
||||||
|
* Fixes a bug that prevents inserting into Citus tables that uses
|
||||||
|
a GENERATED ALWAYS AS IDENTITY column. (#7920)
|
||||||
|
|
||||||
|
* Ensures that a MERGE command on a distributed table with a WHEN NOT MATCHED BY
|
||||||
|
SOURCE clause runs against all shards of the distributed table. (#7900)
|
||||||
|
|
||||||
|
* Fixes a bug that breaks router updates on distributed tables
|
||||||
|
when a reference table is used in the subquery (#7897)
|
||||||
|
|
||||||
### citus v13.0.1 (February 4th, 2025) ###
|
### citus v13.0.1 (February 4th, 2025) ###
|
||||||
|
|
||||||
* Drops support for PostgreSQL 14 (#7753)
|
* Drops support for PostgreSQL 14 (#7753)
|
||||||
|
|
||||||
### citus v13.0.0 (January 17, 2025) ###
|
### citus v13.0.0 (January 22, 2025) ###
|
||||||
|
|
||||||
* Adds support for PostgreSQL 17 (#7699, #7661)
|
* Adds support for PostgreSQL 17 (#7699, #7661)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for Citus 12.2devel.
|
# Generated by GNU Autoconf 2.69 for Citus 13.1devel.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
||||||
|
@ -579,8 +579,8 @@ MAKEFLAGS=
|
||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='Citus'
|
PACKAGE_NAME='Citus'
|
||||||
PACKAGE_TARNAME='citus'
|
PACKAGE_TARNAME='citus'
|
||||||
PACKAGE_VERSION='12.2devel'
|
PACKAGE_VERSION='13.1devel'
|
||||||
PACKAGE_STRING='Citus 12.2devel'
|
PACKAGE_STRING='Citus 13.1devel'
|
||||||
PACKAGE_BUGREPORT=''
|
PACKAGE_BUGREPORT=''
|
||||||
PACKAGE_URL=''
|
PACKAGE_URL=''
|
||||||
|
|
||||||
|
@ -1262,7 +1262,7 @@ if test "$ac_init_help" = "long"; then
|
||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures Citus 12.2devel to adapt to many kinds of systems.
|
\`configure' configures Citus 13.1devel to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
|
@ -1324,7 +1324,7 @@ fi
|
||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of Citus 12.2devel:";;
|
short | recursive ) echo "Configuration of Citus 13.1devel:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
|
@ -1429,7 +1429,7 @@ fi
|
||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
Citus configure 12.2devel
|
Citus configure 13.1devel
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
@ -1912,7 +1912,7 @@ cat >config.log <<_ACEOF
|
||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by Citus $as_me 12.2devel, which was
|
It was created by Citus $as_me 13.1devel, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
|
@ -2588,7 +2588,7 @@ fi
|
||||||
if test "$with_pg_version_check" = no; then
|
if test "$with_pg_version_check" = no; then
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: building against PostgreSQL $version_num (skipped compatibility check)" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: building against PostgreSQL $version_num (skipped compatibility check)" >&5
|
||||||
$as_echo "$as_me: building against PostgreSQL $version_num (skipped compatibility check)" >&6;}
|
$as_echo "$as_me: building against PostgreSQL $version_num (skipped compatibility check)" >&6;}
|
||||||
elif test "$version_num" != '14' -a "$version_num" != '15' -a "$version_num" != '16'; then
|
elif test "$version_num" != '15' -a "$version_num" != '16' -a "$version_num" != '17'; then
|
||||||
as_fn_error $? "Citus is not compatible with the detected PostgreSQL version ${version_num}." "$LINENO" 5
|
as_fn_error $? "Citus is not compatible with the detected PostgreSQL version ${version_num}." "$LINENO" 5
|
||||||
else
|
else
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: building against PostgreSQL $version_num" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: building against PostgreSQL $version_num" >&5
|
||||||
|
@ -5393,7 +5393,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by Citus $as_me 12.2devel, which was
|
This file was extended by Citus $as_me 13.1devel, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
|
@ -5455,7 +5455,7 @@ _ACEOF
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
Citus config.status 12.2devel
|
Citus config.status 13.1devel
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
# everyone needing autoconf installed, the resulting files are checked
|
# everyone needing autoconf installed, the resulting files are checked
|
||||||
# into the SCM.
|
# into the SCM.
|
||||||
|
|
||||||
AC_INIT([Citus], [12.2devel])
|
AC_INIT([Citus], [13.1devel])
|
||||||
AC_COPYRIGHT([Copyright (c) Citus Data, Inc.])
|
AC_COPYRIGHT([Copyright (c) Citus Data, Inc.])
|
||||||
|
|
||||||
# we'll need sed and awk for some of the version commands
|
# we'll need sed and awk for some of the version commands
|
||||||
|
@ -80,7 +80,7 @@ AC_SUBST(with_pg_version_check)
|
||||||
|
|
||||||
if test "$with_pg_version_check" = no; then
|
if test "$with_pg_version_check" = no; then
|
||||||
AC_MSG_NOTICE([building against PostgreSQL $version_num (skipped compatibility check)])
|
AC_MSG_NOTICE([building against PostgreSQL $version_num (skipped compatibility check)])
|
||||||
elif test "$version_num" != '14' -a "$version_num" != '15' -a "$version_num" != '16'; then
|
elif test "$version_num" != '15' -a "$version_num" != '16' -a "$version_num" != '17'; then
|
||||||
AC_MSG_ERROR([Citus is not compatible with the detected PostgreSQL version ${version_num}.])
|
AC_MSG_ERROR([Citus is not compatible with the detected PostgreSQL version ${version_num}.])
|
||||||
else
|
else
|
||||||
AC_MSG_NOTICE([building against PostgreSQL $version_num])
|
AC_MSG_NOTICE([building against PostgreSQL $version_num])
|
||||||
|
|
|
@ -363,7 +363,7 @@ ColumnarGetRelationInfoHook(PlannerInfo *root, Oid relationObjectId,
|
||||||
|
|
||||||
/* disable index-only scan */
|
/* disable index-only scan */
|
||||||
IndexOptInfo *indexOptInfo = NULL;
|
IndexOptInfo *indexOptInfo = NULL;
|
||||||
foreach_ptr(indexOptInfo, rel->indexlist)
|
foreach_declared_ptr(indexOptInfo, rel->indexlist)
|
||||||
{
|
{
|
||||||
memset(indexOptInfo->canreturn, false, indexOptInfo->ncolumns * sizeof(bool));
|
memset(indexOptInfo->canreturn, false, indexOptInfo->ncolumns * sizeof(bool));
|
||||||
}
|
}
|
||||||
|
@ -381,7 +381,7 @@ RemovePathsByPredicate(RelOptInfo *rel, PathPredicate removePathPredicate)
|
||||||
List *filteredPathList = NIL;
|
List *filteredPathList = NIL;
|
||||||
|
|
||||||
Path *path = NULL;
|
Path *path = NULL;
|
||||||
foreach_ptr(path, rel->pathlist)
|
foreach_declared_ptr(path, rel->pathlist)
|
||||||
{
|
{
|
||||||
if (!removePathPredicate(path))
|
if (!removePathPredicate(path))
|
||||||
{
|
{
|
||||||
|
@ -428,7 +428,7 @@ static void
|
||||||
CostColumnarPaths(PlannerInfo *root, RelOptInfo *rel, Oid relationId)
|
CostColumnarPaths(PlannerInfo *root, RelOptInfo *rel, Oid relationId)
|
||||||
{
|
{
|
||||||
Path *path = NULL;
|
Path *path = NULL;
|
||||||
foreach_ptr(path, rel->pathlist)
|
foreach_declared_ptr(path, rel->pathlist)
|
||||||
{
|
{
|
||||||
if (IsA(path, IndexPath))
|
if (IsA(path, IndexPath))
|
||||||
{
|
{
|
||||||
|
@ -783,7 +783,7 @@ ExtractPushdownClause(PlannerInfo *root, RelOptInfo *rel, Node *node)
|
||||||
List *pushdownableArgs = NIL;
|
List *pushdownableArgs = NIL;
|
||||||
|
|
||||||
Node *boolExprArg = NULL;
|
Node *boolExprArg = NULL;
|
||||||
foreach_ptr(boolExprArg, boolExpr->args)
|
foreach_declared_ptr(boolExprArg, boolExpr->args)
|
||||||
{
|
{
|
||||||
Expr *pushdownableArg = ExtractPushdownClause(root, rel,
|
Expr *pushdownableArg = ExtractPushdownClause(root, rel,
|
||||||
(Node *) boolExprArg);
|
(Node *) boolExprArg);
|
||||||
|
@ -1051,6 +1051,15 @@ FindCandidateRelids(PlannerInfo *root, RelOptInfo *rel, List *joinClauses)
|
||||||
|
|
||||||
candidateRelids = bms_del_members(candidateRelids, rel->relids);
|
candidateRelids = bms_del_members(candidateRelids, rel->relids);
|
||||||
candidateRelids = bms_del_members(candidateRelids, rel->lateral_relids);
|
candidateRelids = bms_del_members(candidateRelids, rel->lateral_relids);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For the relevant PG16 commit requiring this addition:
|
||||||
|
* postgres/postgres@2489d76
|
||||||
|
*/
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_16
|
||||||
|
candidateRelids = bms_del_members(candidateRelids, root->outer_join_rels);
|
||||||
|
#endif
|
||||||
|
|
||||||
return candidateRelids;
|
return candidateRelids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1312,11 +1321,8 @@ AddColumnarScanPath(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte,
|
||||||
|
|
||||||
cpath->methods = &ColumnarScanPathMethods;
|
cpath->methods = &ColumnarScanPathMethods;
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/* necessary to avoid extra Result node in PG15 */
|
/* necessary to avoid extra Result node in PG15 */
|
||||||
cpath->flags = CUSTOMPATH_SUPPORT_PROJECTION;
|
cpath->flags = CUSTOMPATH_SUPPORT_PROJECTION;
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* populate generic path information
|
* populate generic path information
|
||||||
|
@ -1550,7 +1556,7 @@ ColumnarPerStripeScanCost(RelOptInfo *rel, Oid relationId, int numberOfColumnsRe
|
||||||
uint32 maxColumnCount = 0;
|
uint32 maxColumnCount = 0;
|
||||||
uint64 totalStripeSize = 0;
|
uint64 totalStripeSize = 0;
|
||||||
StripeMetadata *stripeMetadata = NULL;
|
StripeMetadata *stripeMetadata = NULL;
|
||||||
foreach_ptr(stripeMetadata, stripeList)
|
foreach_declared_ptr(stripeMetadata, stripeList)
|
||||||
{
|
{
|
||||||
totalStripeSize += stripeMetadata->dataLength;
|
totalStripeSize += stripeMetadata->dataLength;
|
||||||
maxColumnCount = Max(maxColumnCount, stripeMetadata->columnCount);
|
maxColumnCount = Max(maxColumnCount, stripeMetadata->columnCount);
|
||||||
|
@ -1924,11 +1930,6 @@ ColumnarScan_EndCustomScan(CustomScanState *node)
|
||||||
*/
|
*/
|
||||||
TableScanDesc scanDesc = node->ss.ss_currentScanDesc;
|
TableScanDesc scanDesc = node->ss.ss_currentScanDesc;
|
||||||
|
|
||||||
/*
|
|
||||||
* Free the exprcontext
|
|
||||||
*/
|
|
||||||
ExecFreeExprContext(&node->ss.ps);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* clean out the tuple table
|
* clean out the tuple table
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1685,7 +1685,7 @@ DeleteTupleAndEnforceConstraints(ModifyState *state, HeapTuple heapTuple)
|
||||||
simple_heap_delete(state->rel, tid);
|
simple_heap_delete(state->rel, tid);
|
||||||
|
|
||||||
/* execute AFTER ROW DELETE Triggers to enforce constraints */
|
/* execute AFTER ROW DELETE Triggers to enforce constraints */
|
||||||
ExecARDeleteTriggers_compat(estate, resultRelInfo, tid, NULL, NULL, false);
|
ExecARDeleteTriggers(estate, resultRelInfo, tid, NULL, NULL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2041,7 +2041,7 @@ GetHighestUsedRowNumber(uint64 storageId)
|
||||||
List *stripeMetadataList = ReadDataFileStripeList(storageId,
|
List *stripeMetadataList = ReadDataFileStripeList(storageId,
|
||||||
GetTransactionSnapshot());
|
GetTransactionSnapshot());
|
||||||
StripeMetadata *stripeMetadata = NULL;
|
StripeMetadata *stripeMetadata = NULL;
|
||||||
foreach_ptr(stripeMetadata, stripeMetadataList)
|
foreach_declared_ptr(stripeMetadata, stripeMetadataList)
|
||||||
{
|
{
|
||||||
highestRowNumber = Max(highestRowNumber,
|
highestRowNumber = Max(highestRowNumber,
|
||||||
StripeGetHighestRowNumber(stripeMetadata));
|
StripeGetHighestRowNumber(stripeMetadata));
|
||||||
|
|
|
@ -880,7 +880,7 @@ ReadChunkGroupNextRow(ChunkGroupReadState *chunkGroupReadState, Datum *columnVal
|
||||||
memset(columnNulls, true, sizeof(bool) * chunkGroupReadState->columnCount);
|
memset(columnNulls, true, sizeof(bool) * chunkGroupReadState->columnCount);
|
||||||
|
|
||||||
int attno;
|
int attno;
|
||||||
foreach_int(attno, chunkGroupReadState->projectedColumnList)
|
foreach_declared_int(attno, chunkGroupReadState->projectedColumnList)
|
||||||
{
|
{
|
||||||
const ChunkData *chunkGroupData = chunkGroupReadState->chunkGroupData;
|
const ChunkData *chunkGroupData = chunkGroupReadState->chunkGroupData;
|
||||||
const int rowIndex = chunkGroupReadState->currentRow;
|
const int rowIndex = chunkGroupReadState->currentRow;
|
||||||
|
@ -1489,7 +1489,7 @@ ProjectedColumnMask(uint32 columnCount, List *projectedColumnList)
|
||||||
bool *projectedColumnMask = palloc0(columnCount * sizeof(bool));
|
bool *projectedColumnMask = palloc0(columnCount * sizeof(bool));
|
||||||
int attno;
|
int attno;
|
||||||
|
|
||||||
foreach_int(attno, projectedColumnList)
|
foreach_declared_int(attno, projectedColumnList)
|
||||||
{
|
{
|
||||||
/* attno is 1-indexed; projectedColumnMask is 0-indexed */
|
/* attno is 1-indexed; projectedColumnMask is 0-indexed */
|
||||||
int columnIndex = attno - 1;
|
int columnIndex = attno - 1;
|
||||||
|
|
|
@ -877,7 +877,7 @@ columnar_relation_set_new_filelocator(Relation rel,
|
||||||
|
|
||||||
*freezeXid = RecentXmin;
|
*freezeXid = RecentXmin;
|
||||||
*minmulti = GetOldestMultiXactId();
|
*minmulti = GetOldestMultiXactId();
|
||||||
SMgrRelation srel = RelationCreateStorage_compat(*newrlocator, persistence, true);
|
SMgrRelation srel = RelationCreateStorage(*newrlocator, persistence, true);
|
||||||
|
|
||||||
ColumnarStorageInit(srel, ColumnarMetadataNewStorageId());
|
ColumnarStorageInit(srel, ColumnarMetadataNewStorageId());
|
||||||
InitColumnarOptions(rel->rd_id);
|
InitColumnarOptions(rel->rd_id);
|
||||||
|
@ -1424,15 +1424,32 @@ ConditionalLockRelationWithTimeout(Relation rel, LOCKMODE lockMode, int timeout,
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
columnar_scan_analyze_next_block(TableScanDesc scan, BlockNumber blockno,
|
columnar_scan_analyze_next_block(TableScanDesc scan,
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_17
|
||||||
|
ReadStream *stream)
|
||||||
|
#else
|
||||||
|
BlockNumber blockno,
|
||||||
BufferAccessStrategy bstrategy)
|
BufferAccessStrategy bstrategy)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Our access method is not pages based, i.e. tuples are not confined
|
* Our access method is not pages based, i.e. tuples are not confined
|
||||||
* to pages boundaries. So not much to do here. We return true anyway
|
* to pages boundaries. So not much to do here. We return true anyway
|
||||||
* so acquire_sample_rows() in analyze.c would call our
|
* so acquire_sample_rows() in analyze.c would call our
|
||||||
* columnar_scan_analyze_next_tuple() callback.
|
* columnar_scan_analyze_next_tuple() callback.
|
||||||
|
* In PG17, we return false in case there is no buffer left, since
|
||||||
|
* the outer loop changed in acquire_sample_rows(), and it is
|
||||||
|
* expected for the scan_analyze_next_block function to check whether
|
||||||
|
* there are any blocks left in the block sampler.
|
||||||
*/
|
*/
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_17
|
||||||
|
Buffer buf = read_stream_next_buffer(stream, NULL);
|
||||||
|
if (!BufferIsValid(buf))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ReleaseBuffer(buf);
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2228,7 +2245,6 @@ ColumnarProcessAlterTable(AlterTableStmt *alterTableStmt, List **columnarOptions
|
||||||
columnarRangeVar = alterTableStmt->relation;
|
columnarRangeVar = alterTableStmt->relation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
else if (alterTableCmd->subtype == AT_SetAccessMethod)
|
else if (alterTableCmd->subtype == AT_SetAccessMethod)
|
||||||
{
|
{
|
||||||
if (columnarRangeVar || *columnarOptions)
|
if (columnarRangeVar || *columnarOptions)
|
||||||
|
@ -2239,14 +2255,15 @@ ColumnarProcessAlterTable(AlterTableStmt *alterTableStmt, List **columnarOptions
|
||||||
"Specify SET ACCESS METHOD before storage parameters, or use separate ALTER TABLE commands.")));
|
"Specify SET ACCESS METHOD before storage parameters, or use separate ALTER TABLE commands.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
destIsColumnar = (strcmp(alterTableCmd->name, COLUMNAR_AM_NAME) == 0);
|
destIsColumnar = (strcmp(alterTableCmd->name ? alterTableCmd->name :
|
||||||
|
default_table_access_method,
|
||||||
|
COLUMNAR_AM_NAME) == 0);
|
||||||
|
|
||||||
if (srcIsColumnar && !destIsColumnar)
|
if (srcIsColumnar && !destIsColumnar)
|
||||||
{
|
{
|
||||||
DeleteColumnarTableOptions(RelationGetRelid(rel), true);
|
DeleteColumnarTableOptions(RelationGetRelid(rel), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* PG_VERSION_15 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
relation_close(rel, NoLock);
|
relation_close(rel, NoLock);
|
||||||
|
@ -2630,21 +2647,12 @@ ColumnarCheckLogicalReplication(Relation rel)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
{
|
{
|
||||||
PublicationDesc pubdesc;
|
PublicationDesc pubdesc;
|
||||||
|
|
||||||
RelationBuildPublicationDesc(rel, &pubdesc);
|
RelationBuildPublicationDesc(rel, &pubdesc);
|
||||||
pubActionInsert = pubdesc.pubactions.pubinsert;
|
pubActionInsert = pubdesc.pubactions.pubinsert;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (rel->rd_pubactions == NULL)
|
|
||||||
{
|
|
||||||
GetRelationPublicationActions(rel);
|
|
||||||
Assert(rel->rd_pubactions != NULL);
|
|
||||||
}
|
|
||||||
pubActionInsert = rel->rd_pubactions->pubinsert;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (pubActionInsert)
|
if (pubActionInsert)
|
||||||
{
|
{
|
||||||
|
@ -3085,7 +3093,7 @@ DefElem *
|
||||||
GetExtensionOption(List *extensionOptions, const char *defname)
|
GetExtensionOption(List *extensionOptions, const char *defname)
|
||||||
{
|
{
|
||||||
DefElem *defElement = NULL;
|
DefElem *defElement = NULL;
|
||||||
foreach_ptr(defElement, extensionOptions)
|
foreach_declared_ptr(defElement, extensionOptions)
|
||||||
{
|
{
|
||||||
if (IsA(defElement, DefElem) &&
|
if (IsA(defElement, DefElem) &&
|
||||||
strncmp(defElement->defname, defname, NAMEDATALEN) == 0)
|
strncmp(defElement->defname, defname, NAMEDATALEN) == 0)
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include "utils/rel.h"
|
#include "utils/rel.h"
|
||||||
#include "utils/typcache.h"
|
#include "utils/typcache.h"
|
||||||
|
|
||||||
|
#include "pg_version_constants.h"
|
||||||
|
|
||||||
PG_MODULE_MAGIC;
|
PG_MODULE_MAGIC;
|
||||||
|
|
||||||
extern void _PG_output_plugin_init(OutputPluginCallbacks *cb);
|
extern void _PG_output_plugin_init(OutputPluginCallbacks *cb);
|
||||||
|
@ -435,6 +437,74 @@ TranslateChangesIfSchemaChanged(Relation sourceRelation, Relation targetRelation
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_17
|
||||||
|
|
||||||
|
/* Check the ReorderBufferChange's action type and handle them accordingly.*/
|
||||||
|
switch (change->action)
|
||||||
|
{
|
||||||
|
case REORDER_BUFFER_CHANGE_INSERT:
|
||||||
|
{
|
||||||
|
/* For insert action, only new tuple should always be translated*/
|
||||||
|
HeapTuple sourceRelationNewTuple = change->data.tp.newtuple;
|
||||||
|
HeapTuple targetRelationNewTuple = GetTupleForTargetSchemaForCdc(
|
||||||
|
sourceRelationNewTuple, sourceRelationDesc, targetRelationDesc);
|
||||||
|
change->data.tp.newtuple = targetRelationNewTuple;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For update changes both old and new tuples need to be translated for target relation
|
||||||
|
* if the REPLICA IDENTITY is set to FULL. Otherwise, only the new tuple needs to be
|
||||||
|
* translated for target relation.
|
||||||
|
*/
|
||||||
|
case REORDER_BUFFER_CHANGE_UPDATE:
|
||||||
|
{
|
||||||
|
/* For update action, new tuple should always be translated*/
|
||||||
|
/* Get the new tuple from the ReorderBufferChange, and translate it to target relation. */
|
||||||
|
HeapTuple sourceRelationNewTuple = change->data.tp.newtuple;
|
||||||
|
HeapTuple targetRelationNewTuple = GetTupleForTargetSchemaForCdc(
|
||||||
|
sourceRelationNewTuple, sourceRelationDesc, targetRelationDesc);
|
||||||
|
change->data.tp.newtuple = targetRelationNewTuple;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Format oldtuple according to the target relation. If the column values of replica
|
||||||
|
* identiy change, then the old tuple is non-null and needs to be formatted according
|
||||||
|
* to the target relation schema.
|
||||||
|
*/
|
||||||
|
if (change->data.tp.oldtuple != NULL)
|
||||||
|
{
|
||||||
|
HeapTuple sourceRelationOldTuple = change->data.tp.oldtuple;
|
||||||
|
HeapTuple targetRelationOldTuple = GetTupleForTargetSchemaForCdc(
|
||||||
|
sourceRelationOldTuple,
|
||||||
|
sourceRelationDesc,
|
||||||
|
targetRelationDesc);
|
||||||
|
|
||||||
|
change->data.tp.oldtuple = targetRelationOldTuple;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case REORDER_BUFFER_CHANGE_DELETE:
|
||||||
|
{
|
||||||
|
/* For delete action, only old tuple should be translated*/
|
||||||
|
HeapTuple sourceRelationOldTuple = change->data.tp.oldtuple;
|
||||||
|
HeapTuple targetRelationOldTuple = GetTupleForTargetSchemaForCdc(
|
||||||
|
sourceRelationOldTuple,
|
||||||
|
sourceRelationDesc,
|
||||||
|
targetRelationDesc);
|
||||||
|
|
||||||
|
change->data.tp.oldtuple = targetRelationOldTuple;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
/* Do nothing for other action types. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
/* Check the ReorderBufferChange's action type and handle them accordingly.*/
|
/* Check the ReorderBufferChange's action type and handle them accordingly.*/
|
||||||
switch (change->action)
|
switch (change->action)
|
||||||
{
|
{
|
||||||
|
@ -499,4 +569,5 @@ TranslateChangesIfSchemaChanged(Relation sourceRelation, Relation targetRelation
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Citus extension
|
# Citus extension
|
||||||
comment = 'Citus distributed database'
|
comment = 'Citus distributed database'
|
||||||
default_version = '12.2-1'
|
default_version = '13.1-1'
|
||||||
module_pathname = '$libdir/citus'
|
module_pathname = '$libdir/citus'
|
||||||
relocatable = false
|
relocatable = false
|
||||||
schema = pg_catalog
|
schema = pg_catalog
|
||||||
|
|
|
@ -145,17 +145,6 @@ LogicalClockShmemSize(void)
|
||||||
void
|
void
|
||||||
InitializeClusterClockMem(void)
|
InitializeClusterClockMem(void)
|
||||||
{
|
{
|
||||||
/* On PG 15 and above, we use shmem_request_hook_type */
|
|
||||||
#if PG_VERSION_NUM < PG_VERSION_15
|
|
||||||
|
|
||||||
/* allocate shared memory for pre PG-15 versions */
|
|
||||||
if (!IsUnderPostmaster)
|
|
||||||
{
|
|
||||||
RequestAddinShmemSpace(LogicalClockShmemSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
prev_shmem_startup_hook = shmem_startup_hook;
|
prev_shmem_startup_hook = shmem_startup_hook;
|
||||||
shmem_startup_hook = LogicalClockShmemInit;
|
shmem_startup_hook = LogicalClockShmemInit;
|
||||||
}
|
}
|
||||||
|
@ -328,7 +317,7 @@ GetHighestClockInTransaction(List *nodeConnectionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = NULL;
|
MultiConnection *connection = NULL;
|
||||||
|
|
||||||
foreach_ptr(connection, nodeConnectionList)
|
foreach_declared_ptr(connection, nodeConnectionList)
|
||||||
{
|
{
|
||||||
int querySent =
|
int querySent =
|
||||||
SendRemoteCommand(connection, "SELECT citus_get_node_clock();");
|
SendRemoteCommand(connection, "SELECT citus_get_node_clock();");
|
||||||
|
@ -349,7 +338,7 @@ GetHighestClockInTransaction(List *nodeConnectionList)
|
||||||
globalClockValue->counter)));
|
globalClockValue->counter)));
|
||||||
|
|
||||||
/* fetch the results and pick the highest clock value of all the nodes */
|
/* fetch the results and pick the highest clock value of all the nodes */
|
||||||
foreach_ptr(connection, nodeConnectionList)
|
foreach_declared_ptr(connection, nodeConnectionList)
|
||||||
{
|
{
|
||||||
bool raiseInterrupts = true;
|
bool raiseInterrupts = true;
|
||||||
|
|
||||||
|
|
|
@ -414,7 +414,7 @@ UndistributeTables(List *relationIdList)
|
||||||
*/
|
*/
|
||||||
List *originalForeignKeyRecreationCommands = NIL;
|
List *originalForeignKeyRecreationCommands = NIL;
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
List *fkeyCommandsForRelation =
|
List *fkeyCommandsForRelation =
|
||||||
GetFKeyCreationCommandsRelationInvolvedWithTableType(relationId,
|
GetFKeyCreationCommandsRelationInvolvedWithTableType(relationId,
|
||||||
|
@ -802,7 +802,7 @@ ConvertTableInternal(TableConversionState *con)
|
||||||
List *partitionList = PartitionList(con->relationId);
|
List *partitionList = PartitionList(con->relationId);
|
||||||
|
|
||||||
Oid partitionRelationId = InvalidOid;
|
Oid partitionRelationId = InvalidOid;
|
||||||
foreach_oid(partitionRelationId, partitionList)
|
foreach_declared_oid(partitionRelationId, partitionList)
|
||||||
{
|
{
|
||||||
char *tableQualifiedName = generate_qualified_relation_name(
|
char *tableQualifiedName = generate_qualified_relation_name(
|
||||||
partitionRelationId);
|
partitionRelationId);
|
||||||
|
@ -873,7 +873,7 @@ ConvertTableInternal(TableConversionState *con)
|
||||||
}
|
}
|
||||||
|
|
||||||
TableDDLCommand *tableCreationCommand = NULL;
|
TableDDLCommand *tableCreationCommand = NULL;
|
||||||
foreach_ptr(tableCreationCommand, preLoadCommands)
|
foreach_declared_ptr(tableCreationCommand, preLoadCommands)
|
||||||
{
|
{
|
||||||
Assert(CitusIsA(tableCreationCommand, TableDDLCommand));
|
Assert(CitusIsA(tableCreationCommand, TableDDLCommand));
|
||||||
|
|
||||||
|
@ -947,7 +947,7 @@ ConvertTableInternal(TableConversionState *con)
|
||||||
con->suppressNoticeMessages);
|
con->suppressNoticeMessages);
|
||||||
|
|
||||||
TableDDLCommand *tableConstructionCommand = NULL;
|
TableDDLCommand *tableConstructionCommand = NULL;
|
||||||
foreach_ptr(tableConstructionCommand, postLoadCommands)
|
foreach_declared_ptr(tableConstructionCommand, postLoadCommands)
|
||||||
{
|
{
|
||||||
Assert(CitusIsA(tableConstructionCommand, TableDDLCommand));
|
Assert(CitusIsA(tableConstructionCommand, TableDDLCommand));
|
||||||
char *tableConstructionSQL = GetTableDDLCommand(tableConstructionCommand);
|
char *tableConstructionSQL = GetTableDDLCommand(tableConstructionCommand);
|
||||||
|
@ -965,7 +965,7 @@ ConvertTableInternal(TableConversionState *con)
|
||||||
MemoryContext oldContext = MemoryContextSwitchTo(citusPerPartitionContext);
|
MemoryContext oldContext = MemoryContextSwitchTo(citusPerPartitionContext);
|
||||||
|
|
||||||
char *attachPartitionCommand = NULL;
|
char *attachPartitionCommand = NULL;
|
||||||
foreach_ptr(attachPartitionCommand, attachPartitionCommands)
|
foreach_declared_ptr(attachPartitionCommand, attachPartitionCommands)
|
||||||
{
|
{
|
||||||
MemoryContextReset(citusPerPartitionContext);
|
MemoryContextReset(citusPerPartitionContext);
|
||||||
|
|
||||||
|
@ -990,7 +990,7 @@ ConvertTableInternal(TableConversionState *con)
|
||||||
|
|
||||||
/* For now we only support cascade to colocation for alter_distributed_table UDF */
|
/* For now we only support cascade to colocation for alter_distributed_table UDF */
|
||||||
Assert(con->conversionType == ALTER_DISTRIBUTED_TABLE);
|
Assert(con->conversionType == ALTER_DISTRIBUTED_TABLE);
|
||||||
foreach_oid(colocatedTableId, con->colocatedTableList)
|
foreach_declared_oid(colocatedTableId, con->colocatedTableList)
|
||||||
{
|
{
|
||||||
if (colocatedTableId == con->relationId)
|
if (colocatedTableId == con->relationId)
|
||||||
{
|
{
|
||||||
|
@ -1018,7 +1018,7 @@ ConvertTableInternal(TableConversionState *con)
|
||||||
if (con->cascadeToColocated != CASCADE_TO_COLOCATED_NO_ALREADY_CASCADED)
|
if (con->cascadeToColocated != CASCADE_TO_COLOCATED_NO_ALREADY_CASCADED)
|
||||||
{
|
{
|
||||||
char *foreignKeyCommand = NULL;
|
char *foreignKeyCommand = NULL;
|
||||||
foreach_ptr(foreignKeyCommand, foreignKeyCommands)
|
foreach_declared_ptr(foreignKeyCommand, foreignKeyCommands)
|
||||||
{
|
{
|
||||||
ExecuteQueryViaSPI(foreignKeyCommand, SPI_OK_UTILITY);
|
ExecuteQueryViaSPI(foreignKeyCommand, SPI_OK_UTILITY);
|
||||||
}
|
}
|
||||||
|
@ -1054,7 +1054,7 @@ CopyTableConversionReturnIntoCurrentContext(TableConversionReturn *tableConversi
|
||||||
tableConversionReturnCopy = palloc0(sizeof(TableConversionReturn));
|
tableConversionReturnCopy = palloc0(sizeof(TableConversionReturn));
|
||||||
List *copyForeignKeyCommands = NIL;
|
List *copyForeignKeyCommands = NIL;
|
||||||
char *foreignKeyCommand = NULL;
|
char *foreignKeyCommand = NULL;
|
||||||
foreach_ptr(foreignKeyCommand, tableConversionReturn->foreignKeyCommands)
|
foreach_declared_ptr(foreignKeyCommand, tableConversionReturn->foreignKeyCommands)
|
||||||
{
|
{
|
||||||
char *copyForeignKeyCommand = MemoryContextStrdup(CurrentMemoryContext,
|
char *copyForeignKeyCommand = MemoryContextStrdup(CurrentMemoryContext,
|
||||||
foreignKeyCommand);
|
foreignKeyCommand);
|
||||||
|
@ -1129,7 +1129,7 @@ DropIndexesNotSupportedByColumnar(Oid relationId, bool suppressNoticeMessages)
|
||||||
RelationClose(columnarRelation);
|
RelationClose(columnarRelation);
|
||||||
|
|
||||||
Oid indexId = InvalidOid;
|
Oid indexId = InvalidOid;
|
||||||
foreach_oid(indexId, indexIdList)
|
foreach_declared_oid(indexId, indexIdList)
|
||||||
{
|
{
|
||||||
char *indexAmName = GetIndexAccessMethodName(indexId);
|
char *indexAmName = GetIndexAccessMethodName(indexId);
|
||||||
if (extern_ColumnarSupportsIndexAM(indexAmName))
|
if (extern_ColumnarSupportsIndexAM(indexAmName))
|
||||||
|
@ -1389,7 +1389,7 @@ CreateTableConversion(TableConversionParameters *params)
|
||||||
* since they will be handled separately.
|
* since they will be handled separately.
|
||||||
*/
|
*/
|
||||||
Oid colocatedTableId = InvalidOid;
|
Oid colocatedTableId = InvalidOid;
|
||||||
foreach_oid(colocatedTableId, colocatedTableList)
|
foreach_declared_oid(colocatedTableId, colocatedTableList)
|
||||||
{
|
{
|
||||||
if (PartitionTable(colocatedTableId))
|
if (PartitionTable(colocatedTableId))
|
||||||
{
|
{
|
||||||
|
@ -1605,7 +1605,7 @@ DoesCascadeDropUnsupportedObject(Oid classId, Oid objectId, HTAB *nodeMap)
|
||||||
targetObjectId);
|
targetObjectId);
|
||||||
|
|
||||||
HeapTuple depTup = NULL;
|
HeapTuple depTup = NULL;
|
||||||
foreach_ptr(depTup, dependencyTupleList)
|
foreach_declared_ptr(depTup, dependencyTupleList)
|
||||||
{
|
{
|
||||||
Form_pg_depend pg_depend = (Form_pg_depend) GETSTRUCT(depTup);
|
Form_pg_depend pg_depend = (Form_pg_depend) GETSTRUCT(depTup);
|
||||||
|
|
||||||
|
@ -1645,7 +1645,7 @@ GetViewCreationCommandsOfTable(Oid relationId)
|
||||||
List *commands = NIL;
|
List *commands = NIL;
|
||||||
|
|
||||||
Oid viewOid = InvalidOid;
|
Oid viewOid = InvalidOid;
|
||||||
foreach_oid(viewOid, views)
|
foreach_declared_oid(viewOid, views)
|
||||||
{
|
{
|
||||||
StringInfo query = makeStringInfo();
|
StringInfo query = makeStringInfo();
|
||||||
|
|
||||||
|
@ -1683,7 +1683,7 @@ WrapTableDDLCommands(List *commandStrings)
|
||||||
List *tableDDLCommands = NIL;
|
List *tableDDLCommands = NIL;
|
||||||
|
|
||||||
char *command = NULL;
|
char *command = NULL;
|
||||||
foreach_ptr(command, commandStrings)
|
foreach_declared_ptr(command, commandStrings)
|
||||||
{
|
{
|
||||||
tableDDLCommands = lappend(tableDDLCommands, makeTableDDLCommandString(command));
|
tableDDLCommands = lappend(tableDDLCommands, makeTableDDLCommandString(command));
|
||||||
}
|
}
|
||||||
|
@ -1840,7 +1840,7 @@ ReplaceTable(Oid sourceId, Oid targetId, List *justBeforeDropCommands,
|
||||||
*/
|
*/
|
||||||
List *ownedSequences = getOwnedSequences_internal(sourceId, 0, DEPENDENCY_AUTO);
|
List *ownedSequences = getOwnedSequences_internal(sourceId, 0, DEPENDENCY_AUTO);
|
||||||
Oid sequenceOid = InvalidOid;
|
Oid sequenceOid = InvalidOid;
|
||||||
foreach_oid(sequenceOid, ownedSequences)
|
foreach_declared_oid(sequenceOid, ownedSequences)
|
||||||
{
|
{
|
||||||
changeDependencyFor(RelationRelationId, sequenceOid,
|
changeDependencyFor(RelationRelationId, sequenceOid,
|
||||||
RelationRelationId, sourceId, targetId);
|
RelationRelationId, sourceId, targetId);
|
||||||
|
@ -1873,7 +1873,7 @@ ReplaceTable(Oid sourceId, Oid targetId, List *justBeforeDropCommands,
|
||||||
}
|
}
|
||||||
|
|
||||||
char *justBeforeDropCommand = NULL;
|
char *justBeforeDropCommand = NULL;
|
||||||
foreach_ptr(justBeforeDropCommand, justBeforeDropCommands)
|
foreach_declared_ptr(justBeforeDropCommand, justBeforeDropCommands)
|
||||||
{
|
{
|
||||||
ExecuteQueryViaSPI(justBeforeDropCommand, SPI_OK_UTILITY);
|
ExecuteQueryViaSPI(justBeforeDropCommand, SPI_OK_UTILITY);
|
||||||
}
|
}
|
||||||
|
@ -1987,7 +1987,7 @@ CheckAlterDistributedTableConversionParameters(TableConversionState *con)
|
||||||
Oid colocatedTableOid = InvalidOid;
|
Oid colocatedTableOid = InvalidOid;
|
||||||
text *colocateWithText = cstring_to_text(con->colocateWith);
|
text *colocateWithText = cstring_to_text(con->colocateWith);
|
||||||
Oid colocateWithTableOid = ResolveRelationId(colocateWithText, false);
|
Oid colocateWithTableOid = ResolveRelationId(colocateWithText, false);
|
||||||
foreach_oid(colocatedTableOid, con->colocatedTableList)
|
foreach_declared_oid(colocatedTableOid, con->colocatedTableList)
|
||||||
{
|
{
|
||||||
if (colocateWithTableOid == colocatedTableOid)
|
if (colocateWithTableOid == colocatedTableOid)
|
||||||
{
|
{
|
||||||
|
@ -2214,7 +2214,7 @@ WillRecreateForeignKeyToReferenceTable(Oid relationId,
|
||||||
{
|
{
|
||||||
List *colocatedTableList = ColocatedTableList(relationId);
|
List *colocatedTableList = ColocatedTableList(relationId);
|
||||||
Oid colocatedTableOid = InvalidOid;
|
Oid colocatedTableOid = InvalidOid;
|
||||||
foreach_oid(colocatedTableOid, colocatedTableList)
|
foreach_declared_oid(colocatedTableOid, colocatedTableList)
|
||||||
{
|
{
|
||||||
if (HasForeignKeyToReferenceTable(colocatedTableOid))
|
if (HasForeignKeyToReferenceTable(colocatedTableOid))
|
||||||
{
|
{
|
||||||
|
@ -2242,7 +2242,7 @@ WarningsForDroppingForeignKeysWithDistributedTables(Oid relationId)
|
||||||
List *foreignKeys = list_concat(referencingForeingKeys, referencedForeignKeys);
|
List *foreignKeys = list_concat(referencingForeingKeys, referencedForeignKeys);
|
||||||
|
|
||||||
Oid foreignKeyOid = InvalidOid;
|
Oid foreignKeyOid = InvalidOid;
|
||||||
foreach_oid(foreignKeyOid, foreignKeys)
|
foreach_declared_oid(foreignKeyOid, foreignKeys)
|
||||||
{
|
{
|
||||||
ereport(WARNING, (errmsg("foreign key %s will be dropped",
|
ereport(WARNING, (errmsg("foreign key %s will be dropped",
|
||||||
get_constraint_name(foreignKeyOid))));
|
get_constraint_name(foreignKeyOid))));
|
||||||
|
|
|
@ -33,7 +33,7 @@ SaveBeginCommandProperties(TransactionStmt *transactionStmt)
|
||||||
*
|
*
|
||||||
* While BEGIN can be quite frequent it will rarely have options set.
|
* While BEGIN can be quite frequent it will rarely have options set.
|
||||||
*/
|
*/
|
||||||
foreach_ptr(item, transactionStmt->options)
|
foreach_declared_ptr(item, transactionStmt->options)
|
||||||
{
|
{
|
||||||
A_Const *constant = (A_Const *) item->arg;
|
A_Const *constant = (A_Const *) item->arg;
|
||||||
|
|
||||||
|
|
|
@ -168,7 +168,7 @@ GetPartitionRelationIds(List *relationIdList)
|
||||||
List *partitionRelationIdList = NIL;
|
List *partitionRelationIdList = NIL;
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
if (PartitionTable(relationId))
|
if (PartitionTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -189,7 +189,7 @@ LockRelationsWithLockMode(List *relationIdList, LOCKMODE lockMode)
|
||||||
{
|
{
|
||||||
Oid relationId;
|
Oid relationId;
|
||||||
relationIdList = SortList(relationIdList, CompareOids);
|
relationIdList = SortList(relationIdList, CompareOids);
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
LockRelationOid(relationId, lockMode);
|
LockRelationOid(relationId, lockMode);
|
||||||
}
|
}
|
||||||
|
@ -207,7 +207,7 @@ static void
|
||||||
ErrorIfConvertingMultiLevelPartitionedTable(List *relationIdList)
|
ErrorIfConvertingMultiLevelPartitionedTable(List *relationIdList)
|
||||||
{
|
{
|
||||||
Oid relationId;
|
Oid relationId;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
if (PartitionedTable(relationId) && PartitionTable(relationId))
|
if (PartitionedTable(relationId) && PartitionTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -236,7 +236,7 @@ void
|
||||||
ErrorIfAnyPartitionRelationInvolvedInNonInheritedFKey(List *relationIdList)
|
ErrorIfAnyPartitionRelationInvolvedInNonInheritedFKey(List *relationIdList)
|
||||||
{
|
{
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
if (!PartitionTable(relationId))
|
if (!PartitionTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -300,7 +300,7 @@ bool
|
||||||
RelationIdListHasReferenceTable(List *relationIdList)
|
RelationIdListHasReferenceTable(List *relationIdList)
|
||||||
{
|
{
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
if (IsCitusTableType(relationId, REFERENCE_TABLE))
|
if (IsCitusTableType(relationId, REFERENCE_TABLE))
|
||||||
{
|
{
|
||||||
|
@ -322,7 +322,7 @@ GetFKeyCreationCommandsForRelationIdList(List *relationIdList)
|
||||||
List *fKeyCreationCommands = NIL;
|
List *fKeyCreationCommands = NIL;
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
List *relationFKeyCreationCommands =
|
List *relationFKeyCreationCommands =
|
||||||
GetReferencingForeignConstaintCommands(relationId);
|
GetReferencingForeignConstaintCommands(relationId);
|
||||||
|
@ -342,7 +342,7 @@ static void
|
||||||
DropRelationIdListForeignKeys(List *relationIdList, int fKeyFlags)
|
DropRelationIdListForeignKeys(List *relationIdList, int fKeyFlags)
|
||||||
{
|
{
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
DropRelationForeignKeys(relationId, fKeyFlags);
|
DropRelationForeignKeys(relationId, fKeyFlags);
|
||||||
}
|
}
|
||||||
|
@ -399,7 +399,7 @@ GetRelationDropFkeyCommands(Oid relationId, int fKeyFlags)
|
||||||
List *relationFKeyIdList = GetForeignKeyOids(relationId, fKeyFlags);
|
List *relationFKeyIdList = GetForeignKeyOids(relationId, fKeyFlags);
|
||||||
|
|
||||||
Oid foreignKeyId;
|
Oid foreignKeyId;
|
||||||
foreach_oid(foreignKeyId, relationFKeyIdList)
|
foreach_declared_oid(foreignKeyId, relationFKeyIdList)
|
||||||
{
|
{
|
||||||
char *dropFkeyCascadeCommand = GetDropFkeyCascadeCommand(foreignKeyId);
|
char *dropFkeyCascadeCommand = GetDropFkeyCascadeCommand(foreignKeyId);
|
||||||
dropFkeyCascadeCommandList = lappend(dropFkeyCascadeCommandList,
|
dropFkeyCascadeCommandList = lappend(dropFkeyCascadeCommandList,
|
||||||
|
@ -450,7 +450,7 @@ ExecuteCascadeOperationForRelationIdList(List *relationIdList,
|
||||||
cascadeOperationType)
|
cascadeOperationType)
|
||||||
{
|
{
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* The reason behind skipping certain table types in below loop is
|
* The reason behind skipping certain table types in below loop is
|
||||||
|
@ -531,7 +531,7 @@ ExecuteAndLogUtilityCommandListInTableTypeConversionViaSPI(List *utilityCommandL
|
||||||
PG_TRY();
|
PG_TRY();
|
||||||
{
|
{
|
||||||
char *utilityCommand = NULL;
|
char *utilityCommand = NULL;
|
||||||
foreach_ptr(utilityCommand, utilityCommandList)
|
foreach_declared_ptr(utilityCommand, utilityCommandList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* CREATE MATERIALIZED VIEW commands need to be parsed/transformed,
|
* CREATE MATERIALIZED VIEW commands need to be parsed/transformed,
|
||||||
|
@ -569,7 +569,7 @@ void
|
||||||
ExecuteAndLogUtilityCommandList(List *utilityCommandList)
|
ExecuteAndLogUtilityCommandList(List *utilityCommandList)
|
||||||
{
|
{
|
||||||
char *utilityCommand = NULL;
|
char *utilityCommand = NULL;
|
||||||
foreach_ptr(utilityCommand, utilityCommandList)
|
foreach_declared_ptr(utilityCommand, utilityCommandList)
|
||||||
{
|
{
|
||||||
ExecuteAndLogUtilityCommand(utilityCommand);
|
ExecuteAndLogUtilityCommand(utilityCommand);
|
||||||
}
|
}
|
||||||
|
@ -597,7 +597,7 @@ void
|
||||||
ExecuteForeignKeyCreateCommandList(List *ddlCommandList, bool skip_validation)
|
ExecuteForeignKeyCreateCommandList(List *ddlCommandList, bool skip_validation)
|
||||||
{
|
{
|
||||||
char *ddlCommand = NULL;
|
char *ddlCommand = NULL;
|
||||||
foreach_ptr(ddlCommand, ddlCommandList)
|
foreach_declared_ptr(ddlCommand, ddlCommandList)
|
||||||
{
|
{
|
||||||
ExecuteForeignKeyCreateCommand(ddlCommand, skip_validation);
|
ExecuteForeignKeyCreateCommand(ddlCommand, skip_validation);
|
||||||
}
|
}
|
||||||
|
|
|
@ -588,7 +588,7 @@ ErrorIfOptionListHasNoTableName(List *optionList)
|
||||||
{
|
{
|
||||||
char *table_nameString = "table_name";
|
char *table_nameString = "table_name";
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, optionList)
|
foreach_declared_ptr(option, optionList)
|
||||||
{
|
{
|
||||||
char *optionName = option->defname;
|
char *optionName = option->defname;
|
||||||
if (strcmp(optionName, table_nameString) == 0)
|
if (strcmp(optionName, table_nameString) == 0)
|
||||||
|
@ -613,7 +613,7 @@ ForeignTableDropsTableNameOption(List *optionList)
|
||||||
{
|
{
|
||||||
char *table_nameString = "table_name";
|
char *table_nameString = "table_name";
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, optionList)
|
foreach_declared_ptr(option, optionList)
|
||||||
{
|
{
|
||||||
char *optionName = option->defname;
|
char *optionName = option->defname;
|
||||||
DefElemAction optionAction = option->defaction;
|
DefElemAction optionAction = option->defaction;
|
||||||
|
@ -732,7 +732,7 @@ UpdateAutoConvertedForConnectedRelations(List *relationIds, bool autoConverted)
|
||||||
|
|
||||||
List *relationIdList = NIL;
|
List *relationIdList = NIL;
|
||||||
Oid relid = InvalidOid;
|
Oid relid = InvalidOid;
|
||||||
foreach_oid(relid, relationIds)
|
foreach_declared_oid(relid, relationIds)
|
||||||
{
|
{
|
||||||
List *connectedRelations = GetForeignKeyConnectedRelationIdList(relid);
|
List *connectedRelations = GetForeignKeyConnectedRelationIdList(relid);
|
||||||
relationIdList = list_concat_unique_oid(relationIdList, connectedRelations);
|
relationIdList = list_concat_unique_oid(relationIdList, connectedRelations);
|
||||||
|
@ -740,7 +740,7 @@ UpdateAutoConvertedForConnectedRelations(List *relationIds, bool autoConverted)
|
||||||
|
|
||||||
relationIdList = SortList(relationIdList, CompareOids);
|
relationIdList = SortList(relationIdList, CompareOids);
|
||||||
|
|
||||||
foreach_oid(relid, relationIdList)
|
foreach_declared_oid(relid, relationIdList)
|
||||||
{
|
{
|
||||||
UpdatePgDistPartitionAutoConverted(relid, autoConverted);
|
UpdatePgDistPartitionAutoConverted(relid, autoConverted);
|
||||||
}
|
}
|
||||||
|
@ -776,7 +776,7 @@ GetShellTableDDLEventsForCitusLocalTable(Oid relationId)
|
||||||
|
|
||||||
List *shellTableDDLEvents = NIL;
|
List *shellTableDDLEvents = NIL;
|
||||||
TableDDLCommand *tableDDLCommand = NULL;
|
TableDDLCommand *tableDDLCommand = NULL;
|
||||||
foreach_ptr(tableDDLCommand, tableDDLCommands)
|
foreach_declared_ptr(tableDDLCommand, tableDDLCommands)
|
||||||
{
|
{
|
||||||
Assert(CitusIsA(tableDDLCommand, TableDDLCommand));
|
Assert(CitusIsA(tableDDLCommand, TableDDLCommand));
|
||||||
shellTableDDLEvents = lappend(shellTableDDLEvents,
|
shellTableDDLEvents = lappend(shellTableDDLEvents,
|
||||||
|
@ -863,7 +863,7 @@ RenameShardRelationConstraints(Oid shardRelationId, uint64 shardId)
|
||||||
List *constraintNameList = GetConstraintNameList(shardRelationId);
|
List *constraintNameList = GetConstraintNameList(shardRelationId);
|
||||||
|
|
||||||
char *constraintName = NULL;
|
char *constraintName = NULL;
|
||||||
foreach_ptr(constraintName, constraintNameList)
|
foreach_declared_ptr(constraintName, constraintNameList)
|
||||||
{
|
{
|
||||||
const char *commandString =
|
const char *commandString =
|
||||||
GetRenameShardConstraintCommand(shardRelationId, constraintName, shardId);
|
GetRenameShardConstraintCommand(shardRelationId, constraintName, shardId);
|
||||||
|
@ -958,7 +958,7 @@ RenameShardRelationIndexes(Oid shardRelationId, uint64 shardId)
|
||||||
List *indexOidList = GetExplicitIndexOidList(shardRelationId);
|
List *indexOidList = GetExplicitIndexOidList(shardRelationId);
|
||||||
|
|
||||||
Oid indexOid = InvalidOid;
|
Oid indexOid = InvalidOid;
|
||||||
foreach_oid(indexOid, indexOidList)
|
foreach_declared_oid(indexOid, indexOidList)
|
||||||
{
|
{
|
||||||
const char *commandString = GetRenameShardIndexCommand(indexOid, shardId);
|
const char *commandString = GetRenameShardIndexCommand(indexOid, shardId);
|
||||||
ExecuteAndLogUtilityCommand(commandString);
|
ExecuteAndLogUtilityCommand(commandString);
|
||||||
|
@ -1008,7 +1008,7 @@ RenameShardRelationStatistics(Oid shardRelationId, uint64 shardId)
|
||||||
List *statsCommandList = GetRenameStatsCommandList(statsOidList, shardId);
|
List *statsCommandList = GetRenameStatsCommandList(statsOidList, shardId);
|
||||||
|
|
||||||
char *command = NULL;
|
char *command = NULL;
|
||||||
foreach_ptr(command, statsCommandList)
|
foreach_declared_ptr(command, statsCommandList)
|
||||||
{
|
{
|
||||||
ExecuteAndLogUtilityCommand(command);
|
ExecuteAndLogUtilityCommand(command);
|
||||||
}
|
}
|
||||||
|
@ -1044,7 +1044,7 @@ RenameShardRelationNonTruncateTriggers(Oid shardRelationId, uint64 shardId)
|
||||||
List *triggerIdList = GetExplicitTriggerIdList(shardRelationId);
|
List *triggerIdList = GetExplicitTriggerIdList(shardRelationId);
|
||||||
|
|
||||||
Oid triggerId = InvalidOid;
|
Oid triggerId = InvalidOid;
|
||||||
foreach_oid(triggerId, triggerIdList)
|
foreach_declared_oid(triggerId, triggerIdList)
|
||||||
{
|
{
|
||||||
bool missingOk = false;
|
bool missingOk = false;
|
||||||
HeapTuple triggerTuple = GetTriggerTupleById(triggerId, missingOk);
|
HeapTuple triggerTuple = GetTriggerTupleById(triggerId, missingOk);
|
||||||
|
@ -1097,7 +1097,7 @@ DropRelationTruncateTriggers(Oid relationId)
|
||||||
List *triggerIdList = GetExplicitTriggerIdList(relationId);
|
List *triggerIdList = GetExplicitTriggerIdList(relationId);
|
||||||
|
|
||||||
Oid triggerId = InvalidOid;
|
Oid triggerId = InvalidOid;
|
||||||
foreach_oid(triggerId, triggerIdList)
|
foreach_declared_oid(triggerId, triggerIdList)
|
||||||
{
|
{
|
||||||
bool missingOk = false;
|
bool missingOk = false;
|
||||||
HeapTuple triggerTuple = GetTriggerTupleById(triggerId, missingOk);
|
HeapTuple triggerTuple = GetTriggerTupleById(triggerId, missingOk);
|
||||||
|
@ -1175,7 +1175,7 @@ DropIdentitiesOnTable(Oid relationId)
|
||||||
relation_close(relation, NoLock);
|
relation_close(relation, NoLock);
|
||||||
|
|
||||||
char *dropCommand = NULL;
|
char *dropCommand = NULL;
|
||||||
foreach_ptr(dropCommand, dropCommandList)
|
foreach_declared_ptr(dropCommand, dropCommandList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We need to disable/enable ddl propagation for this command, to prevent
|
* We need to disable/enable ddl propagation for this command, to prevent
|
||||||
|
@ -1218,7 +1218,7 @@ DropViewsOnTable(Oid relationId)
|
||||||
List *reverseOrderedViews = ReversedOidList(views);
|
List *reverseOrderedViews = ReversedOidList(views);
|
||||||
|
|
||||||
Oid viewId = InvalidOid;
|
Oid viewId = InvalidOid;
|
||||||
foreach_oid(viewId, reverseOrderedViews)
|
foreach_declared_oid(viewId, reverseOrderedViews)
|
||||||
{
|
{
|
||||||
char *qualifiedViewName = generate_qualified_relation_name(viewId);
|
char *qualifiedViewName = generate_qualified_relation_name(viewId);
|
||||||
|
|
||||||
|
@ -1241,7 +1241,7 @@ ReversedOidList(List *oidList)
|
||||||
{
|
{
|
||||||
List *reversed = NIL;
|
List *reversed = NIL;
|
||||||
Oid oid = InvalidOid;
|
Oid oid = InvalidOid;
|
||||||
foreach_oid(oid, oidList)
|
foreach_declared_oid(oid, oidList)
|
||||||
{
|
{
|
||||||
reversed = lcons_oid(oid, reversed);
|
reversed = lcons_oid(oid, reversed);
|
||||||
}
|
}
|
||||||
|
@ -1293,7 +1293,7 @@ GetRenameStatsCommandList(List *statsOidList, uint64 shardId)
|
||||||
{
|
{
|
||||||
List *statsCommandList = NIL;
|
List *statsCommandList = NIL;
|
||||||
Oid statsOid;
|
Oid statsOid;
|
||||||
foreach_oid(statsOid, statsOidList)
|
foreach_declared_oid(statsOid, statsOidList)
|
||||||
{
|
{
|
||||||
HeapTuple tup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(statsOid));
|
HeapTuple tup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(statsOid));
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ static bool
|
||||||
IsClusterStmtVerbose_compat(ClusterStmt *clusterStmt)
|
IsClusterStmtVerbose_compat(ClusterStmt *clusterStmt)
|
||||||
{
|
{
|
||||||
DefElem *opt = NULL;
|
DefElem *opt = NULL;
|
||||||
foreach_ptr(opt, clusterStmt->params)
|
foreach_declared_ptr(opt, clusterStmt->params)
|
||||||
{
|
{
|
||||||
if (strcmp(opt->defname, "verbose") == 0)
|
if (strcmp(opt->defname, "verbose") == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,8 +68,6 @@ CreateCollationDDLInternal(Oid collationId, Oid *collowner, char **quotedCollati
|
||||||
char *collcollate;
|
char *collcollate;
|
||||||
char *collctype;
|
char *collctype;
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In PG15, there is an added option to use ICU as global locale provider.
|
* In PG15, there is an added option to use ICU as global locale provider.
|
||||||
* pg_collation has three locale-related fields: collcollate and collctype,
|
* pg_collation has three locale-related fields: collcollate and collctype,
|
||||||
|
@ -77,7 +75,7 @@ CreateCollationDDLInternal(Oid collationId, Oid *collowner, char **quotedCollati
|
||||||
* ICU-related field. Only the libc-related fields or the ICU-related field
|
* ICU-related field. Only the libc-related fields or the ICU-related field
|
||||||
* is set, never both.
|
* is set, never both.
|
||||||
*/
|
*/
|
||||||
char *colliculocale;
|
char *colllocale;
|
||||||
bool isnull;
|
bool isnull;
|
||||||
|
|
||||||
Datum datum = SysCacheGetAttr(COLLOID, heapTuple, Anum_pg_collation_collcollate,
|
Datum datum = SysCacheGetAttr(COLLOID, heapTuple, Anum_pg_collation_collcollate,
|
||||||
|
@ -101,27 +99,17 @@ CreateCollationDDLInternal(Oid collationId, Oid *collowner, char **quotedCollati
|
||||||
collctype = NULL;
|
collctype = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
datum = SysCacheGetAttr(COLLOID, heapTuple, Anum_pg_collation_colliculocale, &isnull);
|
datum = SysCacheGetAttr(COLLOID, heapTuple, Anum_pg_collation_colllocale, &isnull);
|
||||||
if (!isnull)
|
if (!isnull)
|
||||||
{
|
{
|
||||||
colliculocale = TextDatumGetCString(datum);
|
colllocale = TextDatumGetCString(datum);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
colliculocale = NULL;
|
colllocale = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert((collcollate && collctype) || colliculocale);
|
Assert((collcollate && collctype) || colllocale);
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
* In versions before 15, collcollate and collctype were type "name". Use
|
|
||||||
* pstrdup() to match the interface of 15 so that we consistently free the
|
|
||||||
* result later.
|
|
||||||
*/
|
|
||||||
collcollate = pstrdup(NameStr(collationForm->collcollate));
|
|
||||||
collctype = pstrdup(NameStr(collationForm->collctype));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (collowner != NULL)
|
if (collowner != NULL)
|
||||||
{
|
{
|
||||||
|
@ -132,6 +120,7 @@ CreateCollationDDLInternal(Oid collationId, Oid *collowner, char **quotedCollati
|
||||||
char *schemaName = get_namespace_name(collnamespace);
|
char *schemaName = get_namespace_name(collnamespace);
|
||||||
*quotedCollationName = quote_qualified_identifier(schemaName, collname);
|
*quotedCollationName = quote_qualified_identifier(schemaName, collname);
|
||||||
const char *providerString =
|
const char *providerString =
|
||||||
|
collprovider == COLLPROVIDER_BUILTIN ? "builtin" :
|
||||||
collprovider == COLLPROVIDER_DEFAULT ? "default" :
|
collprovider == COLLPROVIDER_DEFAULT ? "default" :
|
||||||
collprovider == COLLPROVIDER_ICU ? "icu" :
|
collprovider == COLLPROVIDER_ICU ? "icu" :
|
||||||
collprovider == COLLPROVIDER_LIBC ? "libc" : NULL;
|
collprovider == COLLPROVIDER_LIBC ? "libc" : NULL;
|
||||||
|
@ -146,13 +135,12 @@ CreateCollationDDLInternal(Oid collationId, Oid *collowner, char **quotedCollati
|
||||||
"CREATE COLLATION %s (provider = '%s'",
|
"CREATE COLLATION %s (provider = '%s'",
|
||||||
*quotedCollationName, providerString);
|
*quotedCollationName, providerString);
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
if (colllocale)
|
||||||
if (colliculocale)
|
|
||||||
{
|
{
|
||||||
appendStringInfo(&collationNameDef,
|
appendStringInfo(&collationNameDef,
|
||||||
", locale = %s",
|
", locale = %s",
|
||||||
quote_literal_cstr(colliculocale));
|
quote_literal_cstr(colllocale));
|
||||||
pfree(colliculocale);
|
pfree(colllocale);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -172,24 +160,7 @@ CreateCollationDDLInternal(Oid collationId, Oid *collowner, char **quotedCollati
|
||||||
pfree(collcollate);
|
pfree(collcollate);
|
||||||
pfree(collctype);
|
pfree(collctype);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (strcmp(collcollate, collctype) == 0)
|
|
||||||
{
|
|
||||||
appendStringInfo(&collationNameDef,
|
|
||||||
", locale = %s",
|
|
||||||
quote_literal_cstr(collcollate));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
appendStringInfo(&collationNameDef,
|
|
||||||
", lc_collate = %s, lc_ctype = %s",
|
|
||||||
quote_literal_cstr(collcollate),
|
|
||||||
quote_literal_cstr(collctype));
|
|
||||||
}
|
|
||||||
|
|
||||||
pfree(collcollate);
|
|
||||||
pfree(collctype);
|
|
||||||
#endif
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_16
|
#if PG_VERSION_NUM >= PG_VERSION_16
|
||||||
char *collicurules = NULL;
|
char *collicurules = NULL;
|
||||||
datum = SysCacheGetAttr(COLLOID, heapTuple, Anum_pg_collation_collicurules, &isnull);
|
datum = SysCacheGetAttr(COLLOID, heapTuple, Anum_pg_collation_collicurules, &isnull);
|
||||||
|
|
|
@ -235,7 +235,7 @@ PreprocessDropDistributedObjectStmt(Node *node, const char *queryString,
|
||||||
List *distributedObjects = NIL;
|
List *distributedObjects = NIL;
|
||||||
List *distributedObjectAddresses = NIL;
|
List *distributedObjectAddresses = NIL;
|
||||||
Node *object = NULL;
|
Node *object = NULL;
|
||||||
foreach_ptr(object, stmt->objects)
|
foreach_declared_ptr(object, stmt->objects)
|
||||||
{
|
{
|
||||||
/* TODO understand if the lock should be sth else */
|
/* TODO understand if the lock should be sth else */
|
||||||
Relation rel = NULL; /* not used, but required to pass to get_object_address */
|
Relation rel = NULL; /* not used, but required to pass to get_object_address */
|
||||||
|
@ -267,7 +267,7 @@ PreprocessDropDistributedObjectStmt(Node *node, const char *queryString,
|
||||||
* remove the entries for the distributed objects on dropping
|
* remove the entries for the distributed objects on dropping
|
||||||
*/
|
*/
|
||||||
ObjectAddress *address = NULL;
|
ObjectAddress *address = NULL;
|
||||||
foreach_ptr(address, distributedObjectAddresses)
|
foreach_declared_ptr(address, distributedObjectAddresses)
|
||||||
{
|
{
|
||||||
UnmarkObjectDistributed(address);
|
UnmarkObjectDistributed(address);
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,7 @@ DropTextSearchDictObjectAddress(Node *node, bool missing_ok, bool isPostprocess)
|
||||||
List *objectAddresses = NIL;
|
List *objectAddresses = NIL;
|
||||||
|
|
||||||
List *objNameList = NIL;
|
List *objNameList = NIL;
|
||||||
foreach_ptr(objNameList, stmt->objects)
|
foreach_declared_ptr(objNameList, stmt->objects)
|
||||||
{
|
{
|
||||||
Oid tsdictOid = get_ts_dict_oid(objNameList, missing_ok);
|
Oid tsdictOid = get_ts_dict_oid(objNameList, missing_ok);
|
||||||
|
|
||||||
|
@ -328,7 +328,7 @@ DropTextSearchConfigObjectAddress(Node *node, bool missing_ok, bool isPostproces
|
||||||
List *objectAddresses = NIL;
|
List *objectAddresses = NIL;
|
||||||
|
|
||||||
List *objNameList = NIL;
|
List *objNameList = NIL;
|
||||||
foreach_ptr(objNameList, stmt->objects)
|
foreach_declared_ptr(objNameList, stmt->objects)
|
||||||
{
|
{
|
||||||
Oid tsconfigOid = get_ts_config_oid(objNameList, missing_ok);
|
Oid tsconfigOid = get_ts_config_oid(objNameList, missing_ok);
|
||||||
|
|
||||||
|
|
|
@ -170,12 +170,10 @@ static void EnsureDistributedSequencesHaveOneType(Oid relationId,
|
||||||
static void CopyLocalDataIntoShards(Oid distributedTableId);
|
static void CopyLocalDataIntoShards(Oid distributedTableId);
|
||||||
static List * TupleDescColumnNameList(TupleDesc tupleDescriptor);
|
static List * TupleDescColumnNameList(TupleDesc tupleDescriptor);
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
static bool DistributionColumnUsesNumericColumnNegativeScale(TupleDesc relationDesc,
|
static bool DistributionColumnUsesNumericColumnNegativeScale(TupleDesc relationDesc,
|
||||||
Var *distributionColumn);
|
Var *distributionColumn);
|
||||||
static int numeric_typmod_scale(int32 typmod);
|
static int numeric_typmod_scale(int32 typmod);
|
||||||
static bool is_valid_numeric_typmod(int32 typmod);
|
static bool is_valid_numeric_typmod(int32 typmod);
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool DistributionColumnUsesGeneratedStoredColumn(TupleDesc relationDesc,
|
static bool DistributionColumnUsesGeneratedStoredColumn(TupleDesc relationDesc,
|
||||||
Var *distributionColumn);
|
Var *distributionColumn);
|
||||||
|
@ -834,7 +832,7 @@ HashSplitPointsForShardList(List *shardList)
|
||||||
List *splitPointList = NIL;
|
List *splitPointList = NIL;
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardList)
|
foreach_declared_ptr(shardInterval, shardList)
|
||||||
{
|
{
|
||||||
int32 shardMaxValue = DatumGetInt32(shardInterval->maxValue);
|
int32 shardMaxValue = DatumGetInt32(shardInterval->maxValue);
|
||||||
|
|
||||||
|
@ -890,7 +888,7 @@ WorkerNodesForShardList(List *shardList)
|
||||||
List *nodeIdList = NIL;
|
List *nodeIdList = NIL;
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardList)
|
foreach_declared_ptr(shardInterval, shardList)
|
||||||
{
|
{
|
||||||
WorkerNode *workerNode = ActiveShardPlacementWorkerNode(shardInterval->shardId);
|
WorkerNode *workerNode = ActiveShardPlacementWorkerNode(shardInterval->shardId);
|
||||||
nodeIdList = lappend_int(nodeIdList, workerNode->nodeId);
|
nodeIdList = lappend_int(nodeIdList, workerNode->nodeId);
|
||||||
|
@ -1337,7 +1335,7 @@ CreateCitusTable(Oid relationId, CitusTableType tableType,
|
||||||
ALLOCSET_DEFAULT_SIZES);
|
ALLOCSET_DEFAULT_SIZES);
|
||||||
MemoryContext oldContext = MemoryContextSwitchTo(citusPartitionContext);
|
MemoryContext oldContext = MemoryContextSwitchTo(citusPartitionContext);
|
||||||
|
|
||||||
foreach_oid(partitionRelationId, partitionList)
|
foreach_declared_oid(partitionRelationId, partitionList)
|
||||||
{
|
{
|
||||||
MemoryContextReset(citusPartitionContext);
|
MemoryContextReset(citusPartitionContext);
|
||||||
|
|
||||||
|
@ -1551,7 +1549,7 @@ ConvertCitusLocalTableToTableType(Oid relationId, CitusTableType tableType,
|
||||||
MemoryContext oldContext = MemoryContextSwitchTo(citusPartitionContext);
|
MemoryContext oldContext = MemoryContextSwitchTo(citusPartitionContext);
|
||||||
|
|
||||||
Oid partitionRelationId = InvalidOid;
|
Oid partitionRelationId = InvalidOid;
|
||||||
foreach_oid(partitionRelationId, partitionList)
|
foreach_declared_oid(partitionRelationId, partitionList)
|
||||||
{
|
{
|
||||||
MemoryContextReset(citusPartitionContext);
|
MemoryContextReset(citusPartitionContext);
|
||||||
|
|
||||||
|
@ -1701,7 +1699,7 @@ EnsureSequenceTypeSupported(Oid seqOid, Oid attributeTypeId, Oid ownerRelationId
|
||||||
Oid attrDefOid;
|
Oid attrDefOid;
|
||||||
List *attrDefOids = GetAttrDefsFromSequence(seqOid);
|
List *attrDefOids = GetAttrDefsFromSequence(seqOid);
|
||||||
|
|
||||||
foreach_oid(attrDefOid, attrDefOids)
|
foreach_declared_oid(attrDefOid, attrDefOids)
|
||||||
{
|
{
|
||||||
ObjectAddress columnAddress = GetAttrDefaultColumnAddress(attrDefOid);
|
ObjectAddress columnAddress = GetAttrDefaultColumnAddress(attrDefOid);
|
||||||
|
|
||||||
|
@ -1783,7 +1781,7 @@ static void
|
||||||
EnsureDistributedSequencesHaveOneType(Oid relationId, List *seqInfoList)
|
EnsureDistributedSequencesHaveOneType(Oid relationId, List *seqInfoList)
|
||||||
{
|
{
|
||||||
SequenceInfo *seqInfo = NULL;
|
SequenceInfo *seqInfo = NULL;
|
||||||
foreach_ptr(seqInfo, seqInfoList)
|
foreach_declared_ptr(seqInfo, seqInfoList)
|
||||||
{
|
{
|
||||||
if (!seqInfo->isNextValDefault)
|
if (!seqInfo->isNextValDefault)
|
||||||
{
|
{
|
||||||
|
@ -2114,8 +2112,6 @@ EnsureRelationCanBeDistributed(Oid relationId, Var *distributionColumn,
|
||||||
"AS (...) STORED.")));
|
"AS (...) STORED.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/* verify target relation is not distributed by a column of type numeric with negative scale */
|
/* verify target relation is not distributed by a column of type numeric with negative scale */
|
||||||
if (distributionMethod != DISTRIBUTE_BY_NONE &&
|
if (distributionMethod != DISTRIBUTE_BY_NONE &&
|
||||||
DistributionColumnUsesNumericColumnNegativeScale(relationDesc,
|
DistributionColumnUsesNumericColumnNegativeScale(relationDesc,
|
||||||
|
@ -2126,7 +2122,6 @@ EnsureRelationCanBeDistributed(Oid relationId, Var *distributionColumn,
|
||||||
errdetail("Distribution column must not use numeric type "
|
errdetail("Distribution column must not use numeric type "
|
||||||
"with negative scale")));
|
"with negative scale")));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check for support function needed by specified partition method */
|
/* check for support function needed by specified partition method */
|
||||||
if (distributionMethod == DISTRIBUTE_BY_HASH)
|
if (distributionMethod == DISTRIBUTE_BY_HASH)
|
||||||
|
@ -2844,8 +2839,6 @@ TupleDescColumnNameList(TupleDesc tupleDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* is_valid_numeric_typmod checks if the typmod value is valid
|
* is_valid_numeric_typmod checks if the typmod value is valid
|
||||||
*
|
*
|
||||||
|
@ -2895,8 +2888,6 @@ DistributionColumnUsesNumericColumnNegativeScale(TupleDesc relationDesc,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DistributionColumnUsesGeneratedStoredColumn returns whether a given relation uses
|
* DistributionColumnUsesGeneratedStoredColumn returns whether a given relation uses
|
||||||
* GENERATED ALWAYS AS (...) STORED on distribution column
|
* GENERATED ALWAYS AS (...) STORED on distribution column
|
||||||
|
|
|
@ -79,11 +79,8 @@ typedef struct DatabaseCollationInfo
|
||||||
{
|
{
|
||||||
char *datcollate;
|
char *datcollate;
|
||||||
char *datctype;
|
char *datctype;
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
char *daticulocale;
|
char *daticulocale;
|
||||||
char *datcollversion;
|
char *datcollversion;
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_16
|
#if PG_VERSION_NUM >= PG_VERSION_16
|
||||||
char *daticurules;
|
char *daticurules;
|
||||||
|
@ -94,9 +91,7 @@ static char * GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database
|
||||||
databaseForm);
|
databaseForm);
|
||||||
static DatabaseCollationInfo GetDatabaseCollation(Oid dbOid);
|
static DatabaseCollationInfo GetDatabaseCollation(Oid dbOid);
|
||||||
static AlterOwnerStmt * RecreateAlterDatabaseOwnerStmt(Oid databaseOid);
|
static AlterOwnerStmt * RecreateAlterDatabaseOwnerStmt(Oid databaseOid);
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
static char * GetLocaleProviderString(char datlocprovider);
|
static char * GetLocaleProviderString(char datlocprovider);
|
||||||
#endif
|
|
||||||
static char * GetTablespaceName(Oid tablespaceOid);
|
static char * GetTablespaceName(Oid tablespaceOid);
|
||||||
static ObjectAddress * GetDatabaseAddressFromDatabaseName(char *databaseName,
|
static ObjectAddress * GetDatabaseAddressFromDatabaseName(char *databaseName,
|
||||||
bool missingOk);
|
bool missingOk);
|
||||||
|
@ -235,7 +230,7 @@ FilterDistributedDatabases(List *databases)
|
||||||
{
|
{
|
||||||
List *distributedDatabases = NIL;
|
List *distributedDatabases = NIL;
|
||||||
String *databaseName = NULL;
|
String *databaseName = NULL;
|
||||||
foreach_ptr(databaseName, databases)
|
foreach_declared_ptr(databaseName, databases)
|
||||||
{
|
{
|
||||||
bool missingOk = true;
|
bool missingOk = true;
|
||||||
ObjectAddress *dbAddress =
|
ObjectAddress *dbAddress =
|
||||||
|
@ -258,7 +253,7 @@ static bool
|
||||||
IsSetTablespaceStatement(AlterDatabaseStmt *stmt)
|
IsSetTablespaceStatement(AlterDatabaseStmt *stmt)
|
||||||
{
|
{
|
||||||
DefElem *def = NULL;
|
DefElem *def = NULL;
|
||||||
foreach_ptr(def, stmt->options)
|
foreach_declared_ptr(def, stmt->options)
|
||||||
{
|
{
|
||||||
if (strcmp(def->defname, "tablespace") == 0)
|
if (strcmp(def->defname, "tablespace") == 0)
|
||||||
{
|
{
|
||||||
|
@ -320,8 +315,6 @@ PreprocessAlterDatabaseStmt(Node *node, const char *queryString,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PreprocessAlterDatabaseRefreshCollStmt is executed before the statement is applied to
|
* PreprocessAlterDatabaseRefreshCollStmt is executed before the statement is applied to
|
||||||
* the local postgres instance.
|
* the local postgres instance.
|
||||||
|
@ -359,9 +352,6 @@ PreprocessAlterDatabaseRefreshCollStmt(Node *node, const char *queryString,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PreprocessAlterDatabaseRenameStmt is executed before the statement is applied to
|
* PreprocessAlterDatabaseRenameStmt is executed before the statement is applied to
|
||||||
* the local postgres instance.
|
* the local postgres instance.
|
||||||
|
@ -510,7 +500,7 @@ PreprocessCreateDatabaseStmt(Node *node, const char *queryString,
|
||||||
|
|
||||||
List *remoteNodes = TargetWorkerSetNodeList(ALL_SHARD_NODES, RowShareLock);
|
List *remoteNodes = TargetWorkerSetNodeList(ALL_SHARD_NODES, RowShareLock);
|
||||||
WorkerNode *remoteNode = NULL;
|
WorkerNode *remoteNode = NULL;
|
||||||
foreach_ptr(remoteNode, remoteNodes)
|
foreach_declared_ptr(remoteNode, remoteNodes)
|
||||||
{
|
{
|
||||||
InsertCleanupRecordOutsideTransaction(
|
InsertCleanupRecordOutsideTransaction(
|
||||||
CLEANUP_OBJECT_DATABASE,
|
CLEANUP_OBJECT_DATABASE,
|
||||||
|
@ -733,7 +723,7 @@ void
|
||||||
EnsureSupportedCreateDatabaseCommand(CreatedbStmt *stmt)
|
EnsureSupportedCreateDatabaseCommand(CreatedbStmt *stmt)
|
||||||
{
|
{
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, stmt->options)
|
foreach_declared_ptr(option, stmt->options)
|
||||||
{
|
{
|
||||||
if (strcmp(option->defname, "oid") == 0)
|
if (strcmp(option->defname, "oid") == 0)
|
||||||
{
|
{
|
||||||
|
@ -849,9 +839,7 @@ GetDatabaseCollation(Oid dbOid)
|
||||||
Datum ctypeDatum = heap_getattr(tup, Anum_pg_database_datctype, tupdesc, &isNull);
|
Datum ctypeDatum = heap_getattr(tup, Anum_pg_database_datctype, tupdesc, &isNull);
|
||||||
info.datctype = TextDatumGetCString(ctypeDatum);
|
info.datctype = TextDatumGetCString(ctypeDatum);
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
Datum icuLocaleDatum = heap_getattr(tup, Anum_pg_database_datlocale, tupdesc,
|
||||||
|
|
||||||
Datum icuLocaleDatum = heap_getattr(tup, Anum_pg_database_daticulocale, tupdesc,
|
|
||||||
&isNull);
|
&isNull);
|
||||||
if (!isNull)
|
if (!isNull)
|
||||||
{
|
{
|
||||||
|
@ -864,7 +852,6 @@ GetDatabaseCollation(Oid dbOid)
|
||||||
{
|
{
|
||||||
info.datcollversion = TextDatumGetCString(collverDatum);
|
info.datcollversion = TextDatumGetCString(collverDatum);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_16
|
#if PG_VERSION_NUM >= PG_VERSION_16
|
||||||
Datum icurulesDatum = heap_getattr(tup, Anum_pg_database_daticurules, tupdesc,
|
Datum icurulesDatum = heap_getattr(tup, Anum_pg_database_daticurules, tupdesc,
|
||||||
|
@ -882,8 +869,6 @@ GetDatabaseCollation(Oid dbOid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GetLocaleProviderString gets the datlocprovider stored in pg_database
|
* GetLocaleProviderString gets the datlocprovider stored in pg_database
|
||||||
* and returns the string representation of the datlocprovider
|
* and returns the string representation of the datlocprovider
|
||||||
|
@ -912,9 +897,6 @@ GetLocaleProviderString(char datlocprovider)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GenerateCreateDatabaseStatementFromPgDatabase gets the pg_database tuple and returns the
|
* GenerateCreateDatabaseStatementFromPgDatabase gets the pg_database tuple and returns the
|
||||||
* CREATE DATABASE statement that can be used to create given database.
|
* CREATE DATABASE statement that can be used to create given database.
|
||||||
|
@ -956,7 +938,6 @@ GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database databaseForm)
|
||||||
appendStringInfo(&str, " ENCODING = %s",
|
appendStringInfo(&str, " ENCODING = %s",
|
||||||
quote_literal_cstr(pg_encoding_to_char(databaseForm->encoding)));
|
quote_literal_cstr(pg_encoding_to_char(databaseForm->encoding)));
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
if (collInfo.datcollversion != NULL)
|
if (collInfo.datcollversion != NULL)
|
||||||
{
|
{
|
||||||
appendStringInfo(&str, " COLLATION_VERSION = %s",
|
appendStringInfo(&str, " COLLATION_VERSION = %s",
|
||||||
|
@ -972,7 +953,6 @@ GenerateCreateDatabaseStatementFromPgDatabase(Form_pg_database databaseForm)
|
||||||
appendStringInfo(&str, " LOCALE_PROVIDER = %s",
|
appendStringInfo(&str, " LOCALE_PROVIDER = %s",
|
||||||
quote_identifier(GetLocaleProviderString(
|
quote_identifier(GetLocaleProviderString(
|
||||||
databaseForm->datlocprovider)));
|
databaseForm->datlocprovider)));
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_16
|
#if PG_VERSION_NUM >= PG_VERSION_16
|
||||||
if (collInfo.daticurules != NULL)
|
if (collInfo.daticurules != NULL)
|
||||||
|
|
|
@ -162,7 +162,7 @@ EnsureRequiredObjectSetExistOnAllNodes(const ObjectAddress *target,
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectAddress *object = NULL;
|
ObjectAddress *object = NULL;
|
||||||
foreach_ptr(object, objectsToBeCreated)
|
foreach_declared_ptr(object, objectsToBeCreated)
|
||||||
{
|
{
|
||||||
List *dependencyCommands = GetDependencyCreateDDLCommands(object);
|
List *dependencyCommands = GetDependencyCreateDDLCommands(object);
|
||||||
ddlCommands = list_concat(ddlCommands, dependencyCommands);
|
ddlCommands = list_concat(ddlCommands, dependencyCommands);
|
||||||
|
@ -201,7 +201,7 @@ EnsureRequiredObjectSetExistOnAllNodes(const ObjectAddress *target,
|
||||||
*/
|
*/
|
||||||
List *addressSortedDependencies = SortList(objectsWithCommands,
|
List *addressSortedDependencies = SortList(objectsWithCommands,
|
||||||
ObjectAddressComparator);
|
ObjectAddressComparator);
|
||||||
foreach_ptr(object, addressSortedDependencies)
|
foreach_declared_ptr(object, addressSortedDependencies)
|
||||||
{
|
{
|
||||||
LockDatabaseObject(object->classId, object->objectId,
|
LockDatabaseObject(object->classId, object->objectId,
|
||||||
object->objectSubId, ExclusiveLock);
|
object->objectSubId, ExclusiveLock);
|
||||||
|
@ -240,7 +240,7 @@ EnsureRequiredObjectSetExistOnAllNodes(const ObjectAddress *target,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, remoteNodeList)
|
foreach_declared_ptr(workerNode, remoteNodeList)
|
||||||
{
|
{
|
||||||
const char *nodeName = workerNode->workerName;
|
const char *nodeName = workerNode->workerName;
|
||||||
uint32 nodePort = workerNode->workerPort;
|
uint32 nodePort = workerNode->workerPort;
|
||||||
|
@ -256,7 +256,7 @@ EnsureRequiredObjectSetExistOnAllNodes(const ObjectAddress *target,
|
||||||
* that objects have been created on remote nodes before marking them
|
* that objects have been created on remote nodes before marking them
|
||||||
* distributed, so MarkObjectDistributed wouldn't fail.
|
* distributed, so MarkObjectDistributed wouldn't fail.
|
||||||
*/
|
*/
|
||||||
foreach_ptr(object, objectsWithCommands)
|
foreach_declared_ptr(object, objectsWithCommands)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* pg_dist_object entries must be propagated with the super user, since
|
* pg_dist_object entries must be propagated with the super user, since
|
||||||
|
@ -279,7 +279,7 @@ void
|
||||||
EnsureAllObjectDependenciesExistOnAllNodes(const List *targets)
|
EnsureAllObjectDependenciesExistOnAllNodes(const List *targets)
|
||||||
{
|
{
|
||||||
ObjectAddress *target = NULL;
|
ObjectAddress *target = NULL;
|
||||||
foreach_ptr(target, targets)
|
foreach_declared_ptr(target, targets)
|
||||||
{
|
{
|
||||||
EnsureDependenciesExistOnAllNodes(target);
|
EnsureDependenciesExistOnAllNodes(target);
|
||||||
}
|
}
|
||||||
|
@ -336,7 +336,7 @@ DeferErrorIfCircularDependencyExists(const ObjectAddress *objectAddress)
|
||||||
List *dependencies = GetAllDependenciesForObject(objectAddress);
|
List *dependencies = GetAllDependenciesForObject(objectAddress);
|
||||||
|
|
||||||
ObjectAddress *dependency = NULL;
|
ObjectAddress *dependency = NULL;
|
||||||
foreach_ptr(dependency, dependencies)
|
foreach_declared_ptr(dependency, dependencies)
|
||||||
{
|
{
|
||||||
if (dependency->classId == objectAddress->classId &&
|
if (dependency->classId == objectAddress->classId &&
|
||||||
dependency->objectId == objectAddress->objectId &&
|
dependency->objectId == objectAddress->objectId &&
|
||||||
|
@ -424,7 +424,7 @@ GetDistributableDependenciesForObject(const ObjectAddress *target)
|
||||||
|
|
||||||
/* filter the ones that can be distributed */
|
/* filter the ones that can be distributed */
|
||||||
ObjectAddress *dependency = NULL;
|
ObjectAddress *dependency = NULL;
|
||||||
foreach_ptr(dependency, dependencies)
|
foreach_declared_ptr(dependency, dependencies)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* TODO: maybe we can optimize the logic applied in below line. Actually we
|
* TODO: maybe we can optimize the logic applied in below line. Actually we
|
||||||
|
@ -508,7 +508,7 @@ GetDependencyCreateDDLCommands(const ObjectAddress *dependency)
|
||||||
INCLUDE_IDENTITY,
|
INCLUDE_IDENTITY,
|
||||||
creatingShellTableOnRemoteNode);
|
creatingShellTableOnRemoteNode);
|
||||||
TableDDLCommand *tableDDLCommand = NULL;
|
TableDDLCommand *tableDDLCommand = NULL;
|
||||||
foreach_ptr(tableDDLCommand, tableDDLCommands)
|
foreach_declared_ptr(tableDDLCommand, tableDDLCommands)
|
||||||
{
|
{
|
||||||
Assert(CitusIsA(tableDDLCommand, TableDDLCommand));
|
Assert(CitusIsA(tableDDLCommand, TableDDLCommand));
|
||||||
commandList = lappend(commandList, GetTableDDLCommand(
|
commandList = lappend(commandList, GetTableDDLCommand(
|
||||||
|
@ -683,7 +683,7 @@ GetAllDependencyCreateDDLCommands(const List *dependencies)
|
||||||
List *commands = NIL;
|
List *commands = NIL;
|
||||||
|
|
||||||
ObjectAddress *dependency = NULL;
|
ObjectAddress *dependency = NULL;
|
||||||
foreach_ptr(dependency, dependencies)
|
foreach_declared_ptr(dependency, dependencies)
|
||||||
{
|
{
|
||||||
commands = list_concat(commands, GetDependencyCreateDDLCommands(dependency));
|
commands = list_concat(commands, GetDependencyCreateDDLCommands(dependency));
|
||||||
}
|
}
|
||||||
|
@ -831,7 +831,7 @@ bool
|
||||||
ShouldPropagateAnyObject(List *addresses)
|
ShouldPropagateAnyObject(List *addresses)
|
||||||
{
|
{
|
||||||
ObjectAddress *address = NULL;
|
ObjectAddress *address = NULL;
|
||||||
foreach_ptr(address, addresses)
|
foreach_declared_ptr(address, addresses)
|
||||||
{
|
{
|
||||||
if (ShouldPropagateObject(address))
|
if (ShouldPropagateObject(address))
|
||||||
{
|
{
|
||||||
|
@ -853,7 +853,7 @@ FilterObjectAddressListByPredicate(List *objectAddressList, AddressPredicate pre
|
||||||
List *result = NIL;
|
List *result = NIL;
|
||||||
|
|
||||||
ObjectAddress *address = NULL;
|
ObjectAddress *address = NULL;
|
||||||
foreach_ptr(address, objectAddressList)
|
foreach_declared_ptr(address, objectAddressList)
|
||||||
{
|
{
|
||||||
if (predicate(address))
|
if (predicate(address))
|
||||||
{
|
{
|
||||||
|
|
|
@ -521,7 +521,6 @@ static DistributeObjectOps Database_Drop = {
|
||||||
.markDistributed = false,
|
.markDistributed = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
static DistributeObjectOps Database_RefreshColl = {
|
static DistributeObjectOps Database_RefreshColl = {
|
||||||
.deparse = DeparseAlterDatabaseRefreshCollStmt,
|
.deparse = DeparseAlterDatabaseRefreshCollStmt,
|
||||||
.qualify = NULL,
|
.qualify = NULL,
|
||||||
|
@ -532,7 +531,6 @@ static DistributeObjectOps Database_RefreshColl = {
|
||||||
.address = NULL,
|
.address = NULL,
|
||||||
.markDistributed = false,
|
.markDistributed = false,
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
static DistributeObjectOps Database_Set = {
|
static DistributeObjectOps Database_Set = {
|
||||||
.deparse = DeparseAlterDatabaseSetStmt,
|
.deparse = DeparseAlterDatabaseSetStmt,
|
||||||
|
@ -926,7 +924,6 @@ static DistributeObjectOps Sequence_AlterOwner = {
|
||||||
.address = AlterSequenceOwnerStmtObjectAddress,
|
.address = AlterSequenceOwnerStmtObjectAddress,
|
||||||
.markDistributed = false,
|
.markDistributed = false,
|
||||||
};
|
};
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
static DistributeObjectOps Sequence_AlterPersistence = {
|
static DistributeObjectOps Sequence_AlterPersistence = {
|
||||||
.deparse = DeparseAlterSequencePersistenceStmt,
|
.deparse = DeparseAlterSequencePersistenceStmt,
|
||||||
.qualify = QualifyAlterSequencePersistenceStmt,
|
.qualify = QualifyAlterSequencePersistenceStmt,
|
||||||
|
@ -936,7 +933,6 @@ static DistributeObjectOps Sequence_AlterPersistence = {
|
||||||
.address = AlterSequencePersistenceStmtObjectAddress,
|
.address = AlterSequencePersistenceStmtObjectAddress,
|
||||||
.markDistributed = false,
|
.markDistributed = false,
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
static DistributeObjectOps Sequence_Drop = {
|
static DistributeObjectOps Sequence_Drop = {
|
||||||
.deparse = DeparseDropSequenceStmt,
|
.deparse = DeparseDropSequenceStmt,
|
||||||
.qualify = QualifyDropSequenceStmt,
|
.qualify = QualifyDropSequenceStmt,
|
||||||
|
@ -1393,7 +1389,7 @@ static DistributeObjectOps View_Rename = {
|
||||||
static DistributeObjectOps Trigger_Rename = {
|
static DistributeObjectOps Trigger_Rename = {
|
||||||
.deparse = NULL,
|
.deparse = NULL,
|
||||||
.qualify = NULL,
|
.qualify = NULL,
|
||||||
.preprocess = PreprocessAlterTriggerRenameStmt,
|
.preprocess = NULL,
|
||||||
.operationType = DIST_OPS_ALTER,
|
.operationType = DIST_OPS_ALTER,
|
||||||
.postprocess = PostprocessAlterTriggerRenameStmt,
|
.postprocess = PostprocessAlterTriggerRenameStmt,
|
||||||
.address = NULL,
|
.address = NULL,
|
||||||
|
@ -1425,14 +1421,11 @@ GetDistributeObjectOps(Node *node)
|
||||||
return &Database_Drop;
|
return &Database_Drop;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
case T_AlterDatabaseRefreshCollStmt:
|
case T_AlterDatabaseRefreshCollStmt:
|
||||||
{
|
{
|
||||||
return &Database_RefreshColl;
|
return &Database_RefreshColl;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case T_AlterDatabaseSetStmt:
|
case T_AlterDatabaseSetStmt:
|
||||||
{
|
{
|
||||||
return &Database_Set;
|
return &Database_Set;
|
||||||
|
@ -1723,7 +1716,6 @@ GetDistributeObjectOps(Node *node)
|
||||||
|
|
||||||
case OBJECT_SEQUENCE:
|
case OBJECT_SEQUENCE:
|
||||||
{
|
{
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
ListCell *cmdCell = NULL;
|
ListCell *cmdCell = NULL;
|
||||||
foreach(cmdCell, stmt->cmds)
|
foreach(cmdCell, stmt->cmds)
|
||||||
{
|
{
|
||||||
|
@ -1751,7 +1743,6 @@ GetDistributeObjectOps(Node *node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prior to PG15, the only Alter Table statement
|
* Prior to PG15, the only Alter Table statement
|
||||||
|
|
|
@ -210,7 +210,7 @@ MakeCollateClauseFromOid(Oid collationOid)
|
||||||
getObjectIdentityParts(&collateAddress, &objName, &objArgs, false);
|
getObjectIdentityParts(&collateAddress, &objName, &objArgs, false);
|
||||||
|
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
foreach_ptr(name, objName)
|
foreach_declared_ptr(name, objName)
|
||||||
{
|
{
|
||||||
collateClause->collname = lappend(collateClause->collname, makeString(name));
|
collateClause->collname = lappend(collateClause->collname, makeString(name));
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,7 +274,7 @@ PreprocessDropExtensionStmt(Node *node, const char *queryString,
|
||||||
|
|
||||||
/* unmark each distributed extension */
|
/* unmark each distributed extension */
|
||||||
ObjectAddress *address = NULL;
|
ObjectAddress *address = NULL;
|
||||||
foreach_ptr(address, distributedExtensionAddresses)
|
foreach_declared_ptr(address, distributedExtensionAddresses)
|
||||||
{
|
{
|
||||||
UnmarkObjectDistributed(address);
|
UnmarkObjectDistributed(address);
|
||||||
}
|
}
|
||||||
|
@ -313,7 +313,7 @@ FilterDistributedExtensions(List *extensionObjectList)
|
||||||
List *extensionNameList = NIL;
|
List *extensionNameList = NIL;
|
||||||
|
|
||||||
String *objectName = NULL;
|
String *objectName = NULL;
|
||||||
foreach_ptr(objectName, extensionObjectList)
|
foreach_declared_ptr(objectName, extensionObjectList)
|
||||||
{
|
{
|
||||||
const char *extensionName = strVal(objectName);
|
const char *extensionName = strVal(objectName);
|
||||||
const bool missingOk = true;
|
const bool missingOk = true;
|
||||||
|
@ -351,7 +351,7 @@ ExtensionNameListToObjectAddressList(List *extensionObjectList)
|
||||||
List *extensionObjectAddressList = NIL;
|
List *extensionObjectAddressList = NIL;
|
||||||
|
|
||||||
String *objectName;
|
String *objectName;
|
||||||
foreach_ptr(objectName, extensionObjectList)
|
foreach_declared_ptr(objectName, extensionObjectList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We set missingOk to false as we assume all the objects in
|
* We set missingOk to false as we assume all the objects in
|
||||||
|
@ -527,7 +527,7 @@ MarkExistingObjectDependenciesDistributedIfSupported()
|
||||||
List *citusTableIdList = CitusTableTypeIdList(ANY_CITUS_TABLE_TYPE);
|
List *citusTableIdList = CitusTableTypeIdList(ANY_CITUS_TABLE_TYPE);
|
||||||
|
|
||||||
Oid citusTableId = InvalidOid;
|
Oid citusTableId = InvalidOid;
|
||||||
foreach_oid(citusTableId, citusTableIdList)
|
foreach_declared_oid(citusTableId, citusTableIdList)
|
||||||
{
|
{
|
||||||
if (!ShouldMarkRelationDistributed(citusTableId))
|
if (!ShouldMarkRelationDistributed(citusTableId))
|
||||||
{
|
{
|
||||||
|
@ -571,7 +571,7 @@ MarkExistingObjectDependenciesDistributedIfSupported()
|
||||||
*/
|
*/
|
||||||
List *viewList = GetAllViews();
|
List *viewList = GetAllViews();
|
||||||
Oid viewOid = InvalidOid;
|
Oid viewOid = InvalidOid;
|
||||||
foreach_oid(viewOid, viewList)
|
foreach_declared_oid(viewOid, viewList)
|
||||||
{
|
{
|
||||||
if (!ShouldMarkRelationDistributed(viewOid))
|
if (!ShouldMarkRelationDistributed(viewOid))
|
||||||
{
|
{
|
||||||
|
@ -605,7 +605,7 @@ MarkExistingObjectDependenciesDistributedIfSupported()
|
||||||
List *distributedObjectAddressList = GetDistributedObjectAddressList();
|
List *distributedObjectAddressList = GetDistributedObjectAddressList();
|
||||||
|
|
||||||
ObjectAddress *distributedObjectAddress = NULL;
|
ObjectAddress *distributedObjectAddress = NULL;
|
||||||
foreach_ptr(distributedObjectAddress, distributedObjectAddressList)
|
foreach_declared_ptr(distributedObjectAddress, distributedObjectAddressList)
|
||||||
{
|
{
|
||||||
List *distributableDependencyObjectAddresses =
|
List *distributableDependencyObjectAddresses =
|
||||||
GetDistributableDependenciesForObject(distributedObjectAddress);
|
GetDistributableDependenciesForObject(distributedObjectAddress);
|
||||||
|
@ -627,7 +627,7 @@ MarkExistingObjectDependenciesDistributedIfSupported()
|
||||||
SetLocalEnableMetadataSync(false);
|
SetLocalEnableMetadataSync(false);
|
||||||
|
|
||||||
ObjectAddress *objectAddress = NULL;
|
ObjectAddress *objectAddress = NULL;
|
||||||
foreach_ptr(objectAddress, uniqueObjectAddresses)
|
foreach_declared_ptr(objectAddress, uniqueObjectAddresses)
|
||||||
{
|
{
|
||||||
MarkObjectDistributed(objectAddress);
|
MarkObjectDistributed(objectAddress);
|
||||||
}
|
}
|
||||||
|
@ -831,7 +831,7 @@ IsDropCitusExtensionStmt(Node *parseTree)
|
||||||
|
|
||||||
/* now that we have a DropStmt, check if citus extension is among the objects to dropped */
|
/* now that we have a DropStmt, check if citus extension is among the objects to dropped */
|
||||||
String *objectName;
|
String *objectName;
|
||||||
foreach_ptr(objectName, dropStmt->objects)
|
foreach_declared_ptr(objectName, dropStmt->objects)
|
||||||
{
|
{
|
||||||
const char *extensionName = strVal(objectName);
|
const char *extensionName = strVal(objectName);
|
||||||
|
|
||||||
|
@ -1061,7 +1061,7 @@ GenerateGrantCommandsOnExtensionDependentFDWs(Oid extensionId)
|
||||||
List *FDWOids = GetDependentFDWsToExtension(extensionId);
|
List *FDWOids = GetDependentFDWsToExtension(extensionId);
|
||||||
|
|
||||||
Oid FDWOid = InvalidOid;
|
Oid FDWOid = InvalidOid;
|
||||||
foreach_oid(FDWOid, FDWOids)
|
foreach_declared_oid(FDWOid, FDWOids)
|
||||||
{
|
{
|
||||||
Acl *aclEntry = GetPrivilegesForFDW(FDWOid);
|
Acl *aclEntry = GetPrivilegesForFDW(FDWOid);
|
||||||
|
|
||||||
|
|
|
@ -202,7 +202,7 @@ ErrorIfUnsupportedForeignConstraintExists(Relation relation, char referencingDis
|
||||||
List *foreignKeyOids = GetForeignKeyOids(referencingTableId, flags);
|
List *foreignKeyOids = GetForeignKeyOids(referencingTableId, flags);
|
||||||
|
|
||||||
Oid foreignKeyOid = InvalidOid;
|
Oid foreignKeyOid = InvalidOid;
|
||||||
foreach_oid(foreignKeyOid, foreignKeyOids)
|
foreach_declared_oid(foreignKeyOid, foreignKeyOids)
|
||||||
{
|
{
|
||||||
HeapTuple heapTuple = SearchSysCache1(CONSTROID, ObjectIdGetDatum(foreignKeyOid));
|
HeapTuple heapTuple = SearchSysCache1(CONSTROID, ObjectIdGetDatum(foreignKeyOid));
|
||||||
|
|
||||||
|
@ -414,7 +414,7 @@ ForeignKeySetsNextValColumnToDefault(HeapTuple pgConstraintTuple)
|
||||||
|
|
||||||
List *setDefaultAttrs = ForeignKeyGetDefaultingAttrs(pgConstraintTuple);
|
List *setDefaultAttrs = ForeignKeyGetDefaultingAttrs(pgConstraintTuple);
|
||||||
AttrNumber setDefaultAttr = InvalidAttrNumber;
|
AttrNumber setDefaultAttr = InvalidAttrNumber;
|
||||||
foreach_int(setDefaultAttr, setDefaultAttrs)
|
foreach_declared_int(setDefaultAttr, setDefaultAttrs)
|
||||||
{
|
{
|
||||||
if (ColumnDefaultsToNextVal(pgConstraintForm->conrelid, setDefaultAttr))
|
if (ColumnDefaultsToNextVal(pgConstraintForm->conrelid, setDefaultAttr))
|
||||||
{
|
{
|
||||||
|
@ -467,7 +467,6 @@ ForeignKeyGetDefaultingAttrs(HeapTuple pgConstraintTuple)
|
||||||
}
|
}
|
||||||
|
|
||||||
List *onDeleteSetDefColumnList = NIL;
|
List *onDeleteSetDefColumnList = NIL;
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
Datum onDeleteSetDefColumnsDatum = SysCacheGetAttr(CONSTROID, pgConstraintTuple,
|
Datum onDeleteSetDefColumnsDatum = SysCacheGetAttr(CONSTROID, pgConstraintTuple,
|
||||||
Anum_pg_constraint_confdelsetcols,
|
Anum_pg_constraint_confdelsetcols,
|
||||||
&isNull);
|
&isNull);
|
||||||
|
@ -482,7 +481,6 @@ ForeignKeyGetDefaultingAttrs(HeapTuple pgConstraintTuple)
|
||||||
onDeleteSetDefColumnList =
|
onDeleteSetDefColumnList =
|
||||||
IntegerArrayTypeToList(DatumGetArrayTypeP(onDeleteSetDefColumnsDatum));
|
IntegerArrayTypeToList(DatumGetArrayTypeP(onDeleteSetDefColumnsDatum));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (list_length(onDeleteSetDefColumnList) == 0)
|
if (list_length(onDeleteSetDefColumnList) == 0)
|
||||||
{
|
{
|
||||||
|
@ -727,7 +725,7 @@ ColumnAppearsInForeignKeyToReferenceTable(char *columnName, Oid relationId)
|
||||||
GetForeignKeyIdsForColumn(columnName, relationId, searchForeignKeyColumnFlags);
|
GetForeignKeyIdsForColumn(columnName, relationId, searchForeignKeyColumnFlags);
|
||||||
|
|
||||||
Oid foreignKeyId = InvalidOid;
|
Oid foreignKeyId = InvalidOid;
|
||||||
foreach_oid(foreignKeyId, foreignKeyIdsColumnAppeared)
|
foreach_declared_oid(foreignKeyId, foreignKeyIdsColumnAppeared)
|
||||||
{
|
{
|
||||||
Oid referencedTableId = GetReferencedTableId(foreignKeyId);
|
Oid referencedTableId = GetReferencedTableId(foreignKeyId);
|
||||||
if (IsCitusTableType(referencedTableId, REFERENCE_TABLE))
|
if (IsCitusTableType(referencedTableId, REFERENCE_TABLE))
|
||||||
|
@ -901,7 +899,7 @@ GetForeignConstraintCommandsInternal(Oid relationId, int flags)
|
||||||
int saveNestLevel = PushEmptySearchPath();
|
int saveNestLevel = PushEmptySearchPath();
|
||||||
|
|
||||||
Oid foreignKeyOid = InvalidOid;
|
Oid foreignKeyOid = InvalidOid;
|
||||||
foreach_oid(foreignKeyOid, foreignKeyOids)
|
foreach_declared_oid(foreignKeyOid, foreignKeyOids)
|
||||||
{
|
{
|
||||||
char *statementDef = pg_get_constraintdef_command(foreignKeyOid);
|
char *statementDef = pg_get_constraintdef_command(foreignKeyOid);
|
||||||
|
|
||||||
|
@ -1157,7 +1155,7 @@ static Oid
|
||||||
FindForeignKeyOidWithName(List *foreignKeyOids, const char *inputConstraintName)
|
FindForeignKeyOidWithName(List *foreignKeyOids, const char *inputConstraintName)
|
||||||
{
|
{
|
||||||
Oid foreignKeyOid = InvalidOid;
|
Oid foreignKeyOid = InvalidOid;
|
||||||
foreach_oid(foreignKeyOid, foreignKeyOids)
|
foreach_declared_oid(foreignKeyOid, foreignKeyOids)
|
||||||
{
|
{
|
||||||
char *constraintName = get_constraint_name(foreignKeyOid);
|
char *constraintName = get_constraint_name(foreignKeyOid);
|
||||||
|
|
||||||
|
@ -1472,7 +1470,7 @@ RelationInvolvedInAnyNonInheritedForeignKeys(Oid relationId)
|
||||||
List *foreignKeysRelationInvolved = list_concat(referencingForeignKeys,
|
List *foreignKeysRelationInvolved = list_concat(referencingForeignKeys,
|
||||||
referencedForeignKeys);
|
referencedForeignKeys);
|
||||||
Oid foreignKeyId = InvalidOid;
|
Oid foreignKeyId = InvalidOid;
|
||||||
foreach_oid(foreignKeyId, foreignKeysRelationInvolved)
|
foreach_declared_oid(foreignKeyId, foreignKeysRelationInvolved)
|
||||||
{
|
{
|
||||||
HeapTuple heapTuple = SearchSysCache1(CONSTROID, ObjectIdGetDatum(foreignKeyId));
|
HeapTuple heapTuple = SearchSysCache1(CONSTROID, ObjectIdGetDatum(foreignKeyId));
|
||||||
if (!HeapTupleIsValid(heapTuple))
|
if (!HeapTupleIsValid(heapTuple))
|
||||||
|
|
|
@ -86,7 +86,7 @@ static bool
|
||||||
NameListHasFDWOwnedByDistributedExtension(List *FDWNames)
|
NameListHasFDWOwnedByDistributedExtension(List *FDWNames)
|
||||||
{
|
{
|
||||||
String *FDWValue = NULL;
|
String *FDWValue = NULL;
|
||||||
foreach_ptr(FDWValue, FDWNames)
|
foreach_declared_ptr(FDWValue, FDWNames)
|
||||||
{
|
{
|
||||||
/* captures the extension address during lookup */
|
/* captures the extension address during lookup */
|
||||||
ObjectAddress *extensionAddress = palloc0(sizeof(ObjectAddress));
|
ObjectAddress *extensionAddress = palloc0(sizeof(ObjectAddress));
|
||||||
|
|
|
@ -229,7 +229,7 @@ RecreateForeignServerStmt(Oid serverId)
|
||||||
|
|
||||||
int location = -1;
|
int location = -1;
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, server->options)
|
foreach_declared_ptr(option, server->options)
|
||||||
{
|
{
|
||||||
DefElem *copyOption = makeDefElem(option->defname, option->arg, location);
|
DefElem *copyOption = makeDefElem(option->defname, option->arg, location);
|
||||||
createStmt->options = lappend(createStmt->options, copyOption);
|
createStmt->options = lappend(createStmt->options, copyOption);
|
||||||
|
@ -247,7 +247,7 @@ static bool
|
||||||
NameListHasDistributedServer(List *serverNames)
|
NameListHasDistributedServer(List *serverNames)
|
||||||
{
|
{
|
||||||
String *serverValue = NULL;
|
String *serverValue = NULL;
|
||||||
foreach_ptr(serverValue, serverNames)
|
foreach_declared_ptr(serverValue, serverNames)
|
||||||
{
|
{
|
||||||
List *addresses = GetObjectAddressByServerName(strVal(serverValue), false);
|
List *addresses = GetObjectAddressByServerName(strVal(serverValue), false);
|
||||||
|
|
||||||
|
|
|
@ -256,7 +256,7 @@ create_distributed_function(PG_FUNCTION_ARGS)
|
||||||
createFunctionSQL, alterFunctionOwnerSQL);
|
createFunctionSQL, alterFunctionOwnerSQL);
|
||||||
List *grantDDLCommands = GrantOnFunctionDDLCommands(funcOid);
|
List *grantDDLCommands = GrantOnFunctionDDLCommands(funcOid);
|
||||||
char *grantOnFunctionSQL = NULL;
|
char *grantOnFunctionSQL = NULL;
|
||||||
foreach_ptr(grantOnFunctionSQL, grantDDLCommands)
|
foreach_declared_ptr(grantOnFunctionSQL, grantDDLCommands)
|
||||||
{
|
{
|
||||||
appendStringInfo(&ddlCommand, ";%s", grantOnFunctionSQL);
|
appendStringInfo(&ddlCommand, ";%s", grantOnFunctionSQL);
|
||||||
}
|
}
|
||||||
|
@ -370,7 +370,7 @@ ErrorIfAnyNodeDoesNotHaveMetadata(void)
|
||||||
ActivePrimaryNonCoordinatorNodeList(ShareLock);
|
ActivePrimaryNonCoordinatorNodeList(ShareLock);
|
||||||
|
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_declared_ptr(workerNode, workerNodeList)
|
||||||
{
|
{
|
||||||
if (!workerNode->hasMetadata)
|
if (!workerNode->hasMetadata)
|
||||||
{
|
{
|
||||||
|
@ -1476,7 +1476,7 @@ CreateFunctionStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess)
|
||||||
objectWithArgs->objname = stmt->funcname;
|
objectWithArgs->objname = stmt->funcname;
|
||||||
|
|
||||||
FunctionParameter *funcParam = NULL;
|
FunctionParameter *funcParam = NULL;
|
||||||
foreach_ptr(funcParam, stmt->parameters)
|
foreach_declared_ptr(funcParam, stmt->parameters)
|
||||||
{
|
{
|
||||||
if (ShouldAddFunctionSignature(funcParam->mode))
|
if (ShouldAddFunctionSignature(funcParam->mode))
|
||||||
{
|
{
|
||||||
|
@ -1519,7 +1519,7 @@ DefineAggregateStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess
|
||||||
if (stmt->args != NIL)
|
if (stmt->args != NIL)
|
||||||
{
|
{
|
||||||
FunctionParameter *funcParam = NULL;
|
FunctionParameter *funcParam = NULL;
|
||||||
foreach_ptr(funcParam, linitial(stmt->args))
|
foreach_declared_ptr(funcParam, linitial(stmt->args))
|
||||||
{
|
{
|
||||||
objectWithArgs->objargs = lappend(objectWithArgs->objargs,
|
objectWithArgs->objargs = lappend(objectWithArgs->objargs,
|
||||||
funcParam->argType);
|
funcParam->argType);
|
||||||
|
@ -1528,7 +1528,7 @@ DefineAggregateStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DefElem *defItem = NULL;
|
DefElem *defItem = NULL;
|
||||||
foreach_ptr(defItem, stmt->definition)
|
foreach_declared_ptr(defItem, stmt->definition)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* If no explicit args are given, pg includes basetype in the signature.
|
* If no explicit args are given, pg includes basetype in the signature.
|
||||||
|
@ -1933,7 +1933,7 @@ static void
|
||||||
ErrorIfUnsupportedAlterFunctionStmt(AlterFunctionStmt *stmt)
|
ErrorIfUnsupportedAlterFunctionStmt(AlterFunctionStmt *stmt)
|
||||||
{
|
{
|
||||||
DefElem *action = NULL;
|
DefElem *action = NULL;
|
||||||
foreach_ptr(action, stmt->actions)
|
foreach_declared_ptr(action, stmt->actions)
|
||||||
{
|
{
|
||||||
if (strcmp(action->defname, "set") == 0)
|
if (strcmp(action->defname, "set") == 0)
|
||||||
{
|
{
|
||||||
|
@ -2040,7 +2040,7 @@ PreprocessGrantOnFunctionStmt(Node *node, const char *queryString,
|
||||||
|
|
||||||
List *grantFunctionList = NIL;
|
List *grantFunctionList = NIL;
|
||||||
ObjectAddress *functionAddress = NULL;
|
ObjectAddress *functionAddress = NULL;
|
||||||
foreach_ptr(functionAddress, distributedFunctions)
|
foreach_declared_ptr(functionAddress, distributedFunctions)
|
||||||
{
|
{
|
||||||
ObjectWithArgs *distFunction = ObjectWithArgsFromOid(
|
ObjectWithArgs *distFunction = ObjectWithArgsFromOid(
|
||||||
functionAddress->objectId);
|
functionAddress->objectId);
|
||||||
|
@ -2083,7 +2083,7 @@ PostprocessGrantOnFunctionStmt(Node *node, const char *queryString)
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectAddress *functionAddress = NULL;
|
ObjectAddress *functionAddress = NULL;
|
||||||
foreach_ptr(functionAddress, distributedFunctions)
|
foreach_declared_ptr(functionAddress, distributedFunctions)
|
||||||
{
|
{
|
||||||
EnsureAllObjectDependenciesExistOnAllNodes(list_make1(functionAddress));
|
EnsureAllObjectDependenciesExistOnAllNodes(list_make1(functionAddress));
|
||||||
}
|
}
|
||||||
|
@ -2120,7 +2120,7 @@ FilterDistributedFunctions(GrantStmt *grantStmt)
|
||||||
|
|
||||||
/* iterate over all namespace names provided to get their oid's */
|
/* iterate over all namespace names provided to get their oid's */
|
||||||
String *namespaceValue = NULL;
|
String *namespaceValue = NULL;
|
||||||
foreach_ptr(namespaceValue, grantStmt->objects)
|
foreach_declared_ptr(namespaceValue, grantStmt->objects)
|
||||||
{
|
{
|
||||||
char *nspname = strVal(namespaceValue);
|
char *nspname = strVal(namespaceValue);
|
||||||
bool missing_ok = false;
|
bool missing_ok = false;
|
||||||
|
@ -2132,7 +2132,7 @@ FilterDistributedFunctions(GrantStmt *grantStmt)
|
||||||
* iterate over all distributed functions to filter the ones
|
* iterate over all distributed functions to filter the ones
|
||||||
* that belong to one of the namespaces from above
|
* that belong to one of the namespaces from above
|
||||||
*/
|
*/
|
||||||
foreach_ptr(distributedFunction, distributedFunctionList)
|
foreach_declared_ptr(distributedFunction, distributedFunctionList)
|
||||||
{
|
{
|
||||||
Oid namespaceOid = get_func_namespace(distributedFunction->objectId);
|
Oid namespaceOid = get_func_namespace(distributedFunction->objectId);
|
||||||
|
|
||||||
|
@ -2151,7 +2151,7 @@ FilterDistributedFunctions(GrantStmt *grantStmt)
|
||||||
{
|
{
|
||||||
bool missingOk = false;
|
bool missingOk = false;
|
||||||
ObjectWithArgs *objectWithArgs = NULL;
|
ObjectWithArgs *objectWithArgs = NULL;
|
||||||
foreach_ptr(objectWithArgs, grantStmt->objects)
|
foreach_declared_ptr(objectWithArgs, grantStmt->objects)
|
||||||
{
|
{
|
||||||
ObjectAddress *functionAddress = palloc0(sizeof(ObjectAddress));
|
ObjectAddress *functionAddress = palloc0(sizeof(ObjectAddress));
|
||||||
functionAddress->classId = ProcedureRelationId;
|
functionAddress->classId = ProcedureRelationId;
|
||||||
|
|
|
@ -337,7 +337,7 @@ ExecuteFunctionOnEachTableIndex(Oid relationId, PGIndexProcessor pgIndexProcesso
|
||||||
|
|
||||||
List *indexIdList = RelationGetIndexList(relation);
|
List *indexIdList = RelationGetIndexList(relation);
|
||||||
Oid indexId = InvalidOid;
|
Oid indexId = InvalidOid;
|
||||||
foreach_oid(indexId, indexIdList)
|
foreach_declared_oid(indexId, indexIdList)
|
||||||
{
|
{
|
||||||
HeapTuple indexTuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexId));
|
HeapTuple indexTuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexId));
|
||||||
if (!HeapTupleIsValid(indexTuple))
|
if (!HeapTupleIsValid(indexTuple))
|
||||||
|
@ -708,7 +708,7 @@ PreprocessDropIndexStmt(Node *node, const char *dropIndexCommand,
|
||||||
|
|
||||||
/* check if any of the indexes being dropped belong to a distributed table */
|
/* check if any of the indexes being dropped belong to a distributed table */
|
||||||
List *objectNameList = NULL;
|
List *objectNameList = NULL;
|
||||||
foreach_ptr(objectNameList, dropIndexStatement->objects)
|
foreach_declared_ptr(objectNameList, dropIndexStatement->objects)
|
||||||
{
|
{
|
||||||
struct DropRelationCallbackState state;
|
struct DropRelationCallbackState state;
|
||||||
uint32 rvrFlags = RVR_MISSING_OK;
|
uint32 rvrFlags = RVR_MISSING_OK;
|
||||||
|
@ -880,7 +880,7 @@ ErrorIfUnsupportedAlterIndexStmt(AlterTableStmt *alterTableStatement)
|
||||||
/* error out if any of the subcommands are unsupported */
|
/* error out if any of the subcommands are unsupported */
|
||||||
List *commandList = alterTableStatement->cmds;
|
List *commandList = alterTableStatement->cmds;
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
|
|
||||||
|
@ -932,7 +932,7 @@ CreateIndexTaskList(IndexStmt *indexStmt)
|
||||||
LockShardListMetadata(shardIntervalList, ShareLock);
|
LockShardListMetadata(shardIntervalList, ShareLock);
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
|
|
||||||
|
@ -977,7 +977,7 @@ CreateReindexTaskList(Oid relationId, ReindexStmt *reindexStmt)
|
||||||
LockShardListMetadata(shardIntervalList, ShareLock);
|
LockShardListMetadata(shardIntervalList, ShareLock);
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
|
|
||||||
|
@ -1115,6 +1115,7 @@ RangeVarCallbackForReindexIndex(const RangeVar *relation, Oid relId, Oid oldRelI
|
||||||
char relkind;
|
char relkind;
|
||||||
struct ReindexIndexCallbackState *state = arg;
|
struct ReindexIndexCallbackState *state = arg;
|
||||||
LOCKMODE table_lockmode;
|
LOCKMODE table_lockmode;
|
||||||
|
Oid table_oid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lock level here should match table lock in reindex_index() for
|
* Lock level here should match table lock in reindex_index() for
|
||||||
|
@ -1152,13 +1153,24 @@ RangeVarCallbackForReindexIndex(const RangeVar *relation, Oid relId, Oid oldRelI
|
||||||
errmsg("\"%s\" is not an index", relation->relname)));
|
errmsg("\"%s\" is not an index", relation->relname)));
|
||||||
|
|
||||||
/* Check permissions */
|
/* Check permissions */
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_17
|
||||||
|
table_oid = IndexGetRelation(relId, true);
|
||||||
|
if (OidIsValid(table_oid))
|
||||||
|
{
|
||||||
|
AclResult aclresult = pg_class_aclcheck(table_oid, GetUserId(), ACL_MAINTAIN);
|
||||||
|
if (aclresult != ACLCHECK_OK)
|
||||||
|
aclcheck_error(aclresult, OBJECT_INDEX, relation->relname);
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (!object_ownercheck(RelationRelationId, relId, GetUserId()))
|
if (!object_ownercheck(RelationRelationId, relId, GetUserId()))
|
||||||
aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_INDEX, relation->relname);
|
aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_INDEX, relation->relname);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Lock heap before index to avoid deadlock. */
|
/* Lock heap before index to avoid deadlock. */
|
||||||
if (relId != oldRelId)
|
if (relId != oldRelId)
|
||||||
{
|
{
|
||||||
Oid table_oid = IndexGetRelation(relId, true);
|
table_oid = IndexGetRelation(relId, true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the OID isn't valid, it means the index was concurrently
|
* If the OID isn't valid, it means the index was concurrently
|
||||||
|
@ -1226,7 +1238,7 @@ ErrorIfUnsupportedIndexStmt(IndexStmt *createIndexStatement)
|
||||||
Var *partitionKey = DistPartitionKeyOrError(relationId);
|
Var *partitionKey = DistPartitionKeyOrError(relationId);
|
||||||
List *indexParameterList = createIndexStatement->indexParams;
|
List *indexParameterList = createIndexStatement->indexParams;
|
||||||
IndexElem *indexElement = NULL;
|
IndexElem *indexElement = NULL;
|
||||||
foreach_ptr(indexElement, indexParameterList)
|
foreach_declared_ptr(indexElement, indexParameterList)
|
||||||
{
|
{
|
||||||
const char *columnName = indexElement->name;
|
const char *columnName = indexElement->name;
|
||||||
|
|
||||||
|
@ -1295,7 +1307,7 @@ DropIndexTaskList(Oid relationId, Oid indexId, DropStmt *dropStmt)
|
||||||
LockShardListMetadata(shardIntervalList, ShareLock);
|
LockShardListMetadata(shardIntervalList, ShareLock);
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
char *shardIndexName = pstrdup(indexName);
|
char *shardIndexName = pstrdup(indexName);
|
||||||
|
|
|
@ -301,6 +301,7 @@ static SelectStmt * CitusCopySelect(CopyStmt *copyStatement);
|
||||||
static void CitusCopyTo(CopyStmt *copyStatement, QueryCompletion *completionTag);
|
static void CitusCopyTo(CopyStmt *copyStatement, QueryCompletion *completionTag);
|
||||||
static int64 ForwardCopyDataFromConnection(CopyOutState copyOutState,
|
static int64 ForwardCopyDataFromConnection(CopyOutState copyOutState,
|
||||||
MultiConnection *connection);
|
MultiConnection *connection);
|
||||||
|
static void ErrorIfCopyHasOnErrorLogVerbosity(CopyStmt *copyStatement);
|
||||||
|
|
||||||
/* Private functions copied and adapted from copy.c in PostgreSQL */
|
/* Private functions copied and adapted from copy.c in PostgreSQL */
|
||||||
static void SendCopyBegin(CopyOutState cstate);
|
static void SendCopyBegin(CopyOutState cstate);
|
||||||
|
@ -346,6 +347,7 @@ static LocalCopyStatus GetLocalCopyStatus(void);
|
||||||
static bool ShardIntervalListHasLocalPlacements(List *shardIntervalList);
|
static bool ShardIntervalListHasLocalPlacements(List *shardIntervalList);
|
||||||
static void LogLocalCopyToRelationExecution(uint64 shardId);
|
static void LogLocalCopyToRelationExecution(uint64 shardId);
|
||||||
static void LogLocalCopyToFileExecution(uint64 shardId);
|
static void LogLocalCopyToFileExecution(uint64 shardId);
|
||||||
|
static void ErrorIfMergeInCopy(CopyStmt *copyStatement);
|
||||||
|
|
||||||
|
|
||||||
/* exports for SQL callable functions */
|
/* exports for SQL callable functions */
|
||||||
|
@ -1957,7 +1959,7 @@ ShardIntervalListHasLocalPlacements(List *shardIntervalList)
|
||||||
{
|
{
|
||||||
int32 localGroupId = GetLocalGroupId();
|
int32 localGroupId = GetLocalGroupId();
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
if (ActiveShardPlacementOnGroup(localGroupId, shardInterval->shardId) != NULL)
|
if (ActiveShardPlacementOnGroup(localGroupId, shardInterval->shardId) != NULL)
|
||||||
{
|
{
|
||||||
|
@ -2452,7 +2454,7 @@ ProcessAppendToShardOption(Oid relationId, CopyStmt *copyStatement)
|
||||||
bool appendToShardSet = false;
|
bool appendToShardSet = false;
|
||||||
|
|
||||||
DefElem *defel = NULL;
|
DefElem *defel = NULL;
|
||||||
foreach_ptr(defel, copyStatement->options)
|
foreach_declared_ptr(defel, copyStatement->options)
|
||||||
{
|
{
|
||||||
if (strncmp(defel->defname, APPEND_TO_SHARD_OPTION, NAMEDATALEN) == 0)
|
if (strncmp(defel->defname, APPEND_TO_SHARD_OPTION, NAMEDATALEN) == 0)
|
||||||
{
|
{
|
||||||
|
@ -2823,6 +2825,70 @@ CopyStatementHasFormat(CopyStmt *copyStatement, char *formatName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ErrorIfCopyHasOnErrorLogVerbosity errors out if the COPY statement
|
||||||
|
* has on_error option or log_verbosity option specified
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
ErrorIfCopyHasOnErrorLogVerbosity(CopyStmt *copyStatement)
|
||||||
|
{
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_17
|
||||||
|
bool log_verbosity = false;
|
||||||
|
foreach_ptr(DefElem, option, copyStatement->options)
|
||||||
|
{
|
||||||
|
if (strcmp(option->defname, "on_error") == 0)
|
||||||
|
{
|
||||||
|
ereport(ERROR, (errmsg(
|
||||||
|
"Citus does not support COPY FROM with ON_ERROR option.")));
|
||||||
|
}
|
||||||
|
else if (strcmp(option->defname, "log_verbosity") == 0)
|
||||||
|
{
|
||||||
|
log_verbosity = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Given that log_verbosity is currently used in COPY FROM
|
||||||
|
* when ON_ERROR option is set to ignore, it makes more
|
||||||
|
* sense to error out for ON_ERROR option first. For this reason,
|
||||||
|
* we don't error out in the previous loop directly.
|
||||||
|
* Relevant PG17 commit: https://github.com/postgres/postgres/commit/f5a227895
|
||||||
|
*/
|
||||||
|
if (log_verbosity)
|
||||||
|
{
|
||||||
|
ereport(ERROR, (errmsg(
|
||||||
|
"Citus does not support COPY FROM with LOG_VERBOSITY option.")));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ErrorIfMergeInCopy Raises an exception if the MERGE is called in the COPY
|
||||||
|
* where Citus tables are involved, as we don't support this yet
|
||||||
|
* Relevant PG17 commit: c649fa24a
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
ErrorIfMergeInCopy(CopyStmt *copyStatement)
|
||||||
|
{
|
||||||
|
#if PG_VERSION_NUM < 170000
|
||||||
|
return;
|
||||||
|
#else
|
||||||
|
if (!copyStatement->relation && (IsA(copyStatement->query, MergeStmt)))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This path is currently not reachable because Merge in COPY can
|
||||||
|
* only work with a RETURNING clause, and a RETURNING check
|
||||||
|
* will error out sooner for Citus
|
||||||
|
*/
|
||||||
|
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
errmsg("MERGE with Citus tables "
|
||||||
|
"is not yet supported in COPY")));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ProcessCopyStmt handles Citus specific concerns for COPY like supporting
|
* ProcessCopyStmt handles Citus specific concerns for COPY like supporting
|
||||||
* COPYing from distributed tables and preventing unsupported actions. The
|
* COPYing from distributed tables and preventing unsupported actions. The
|
||||||
|
@ -2860,6 +2926,8 @@ ProcessCopyStmt(CopyStmt *copyStatement, QueryCompletion *completionTag, const
|
||||||
*/
|
*/
|
||||||
if (copyStatement->relation != NULL)
|
if (copyStatement->relation != NULL)
|
||||||
{
|
{
|
||||||
|
ErrorIfMergeInCopy(copyStatement);
|
||||||
|
|
||||||
bool isFrom = copyStatement->is_from;
|
bool isFrom = copyStatement->is_from;
|
||||||
|
|
||||||
/* consider using RangeVarGetRelidExtended to check perms before locking */
|
/* consider using RangeVarGetRelidExtended to check perms before locking */
|
||||||
|
@ -2897,6 +2965,8 @@ ProcessCopyStmt(CopyStmt *copyStatement, QueryCompletion *completionTag, const
|
||||||
"Citus does not support COPY FROM with WHERE")));
|
"Citus does not support COPY FROM with WHERE")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorIfCopyHasOnErrorLogVerbosity(copyStatement);
|
||||||
|
|
||||||
/* check permissions, we're bypassing postgres' normal checks */
|
/* check permissions, we're bypassing postgres' normal checks */
|
||||||
CheckCopyPermissions(copyStatement);
|
CheckCopyPermissions(copyStatement);
|
||||||
CitusCopyFrom(copyStatement, completionTag);
|
CitusCopyFrom(copyStatement, completionTag);
|
||||||
|
|
|
@ -255,7 +255,7 @@ static void
|
||||||
DropRoleStmtUnmarkDistOnLocalMainDb(DropRoleStmt *dropRoleStmt)
|
DropRoleStmtUnmarkDistOnLocalMainDb(DropRoleStmt *dropRoleStmt)
|
||||||
{
|
{
|
||||||
RoleSpec *roleSpec = NULL;
|
RoleSpec *roleSpec = NULL;
|
||||||
foreach_ptr(roleSpec, dropRoleStmt->roles)
|
foreach_declared_ptr(roleSpec, dropRoleStmt->roles)
|
||||||
{
|
{
|
||||||
Oid roleOid = get_role_oid(roleSpec->rolename,
|
Oid roleOid = get_role_oid(roleSpec->rolename,
|
||||||
dropRoleStmt->missing_ok);
|
dropRoleStmt->missing_ok);
|
||||||
|
|
|
@ -48,7 +48,7 @@ CreatePolicyCommands(Oid relationId)
|
||||||
List *policyList = GetPolicyListForRelation(relationId);
|
List *policyList = GetPolicyListForRelation(relationId);
|
||||||
|
|
||||||
RowSecurityPolicy *policy;
|
RowSecurityPolicy *policy;
|
||||||
foreach_ptr(policy, policyList)
|
foreach_declared_ptr(policy, policyList)
|
||||||
{
|
{
|
||||||
char *createPolicyCommand = CreatePolicyCommandForPolicy(relationId, policy);
|
char *createPolicyCommand = CreatePolicyCommandForPolicy(relationId, policy);
|
||||||
commands = lappend(commands, makeTableDDLCommandString(createPolicyCommand));
|
commands = lappend(commands, makeTableDDLCommandString(createPolicyCommand));
|
||||||
|
@ -88,7 +88,7 @@ GetPolicyListForRelation(Oid relationId)
|
||||||
List *policyList = NIL;
|
List *policyList = NIL;
|
||||||
|
|
||||||
RowSecurityPolicy *policy;
|
RowSecurityPolicy *policy;
|
||||||
foreach_ptr(policy, relation->rd_rsdesc->policies)
|
foreach_declared_ptr(policy, relation->rd_rsdesc->policies)
|
||||||
{
|
{
|
||||||
policyList = lappend(policyList, policy);
|
policyList = lappend(policyList, policy);
|
||||||
}
|
}
|
||||||
|
@ -310,7 +310,7 @@ GetPolicyByName(Oid relationId, const char *policyName)
|
||||||
List *policyList = GetPolicyListForRelation(relationId);
|
List *policyList = GetPolicyListForRelation(relationId);
|
||||||
|
|
||||||
RowSecurityPolicy *policy = NULL;
|
RowSecurityPolicy *policy = NULL;
|
||||||
foreach_ptr(policy, policyList)
|
foreach_declared_ptr(policy, policyList)
|
||||||
{
|
{
|
||||||
if (strncmp(policy->policy_name, policyName, NAMEDATALEN) == 0)
|
if (strncmp(policy->policy_name, policyName, NAMEDATALEN) == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,11 +33,9 @@
|
||||||
|
|
||||||
|
|
||||||
static CreatePublicationStmt * BuildCreatePublicationStmt(Oid publicationId);
|
static CreatePublicationStmt * BuildCreatePublicationStmt(Oid publicationId);
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
static PublicationObjSpec * BuildPublicationRelationObjSpec(Oid relationId,
|
static PublicationObjSpec * BuildPublicationRelationObjSpec(Oid relationId,
|
||||||
Oid publicationId,
|
Oid publicationId,
|
||||||
bool tableOnly);
|
bool tableOnly);
|
||||||
#endif
|
|
||||||
static void AppendPublishOptionList(StringInfo str, List *strings);
|
static void AppendPublishOptionList(StringInfo str, List *strings);
|
||||||
static char * AlterPublicationOwnerCommand(Oid publicationId);
|
static char * AlterPublicationOwnerCommand(Oid publicationId);
|
||||||
static bool ShouldPropagateCreatePublication(CreatePublicationStmt *stmt);
|
static bool ShouldPropagateCreatePublication(CreatePublicationStmt *stmt);
|
||||||
|
@ -154,11 +152,10 @@ BuildCreatePublicationStmt(Oid publicationId)
|
||||||
|
|
||||||
ReleaseSysCache(publicationTuple);
|
ReleaseSysCache(publicationTuple);
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
List *schemaIds = GetPublicationSchemas(publicationId);
|
List *schemaIds = GetPublicationSchemas(publicationId);
|
||||||
Oid schemaId = InvalidOid;
|
Oid schemaId = InvalidOid;
|
||||||
|
|
||||||
foreach_oid(schemaId, schemaIds)
|
foreach_declared_oid(schemaId, schemaIds)
|
||||||
{
|
{
|
||||||
char *schemaName = get_namespace_name(schemaId);
|
char *schemaName = get_namespace_name(schemaId);
|
||||||
|
|
||||||
|
@ -170,7 +167,6 @@ BuildCreatePublicationStmt(Oid publicationId)
|
||||||
|
|
||||||
createPubStmt->pubobjects = lappend(createPubStmt->pubobjects, publicationObject);
|
createPubStmt->pubobjects = lappend(createPubStmt->pubobjects, publicationObject);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
List *relationIds = GetPublicationRelations(publicationId,
|
List *relationIds = GetPublicationRelations(publicationId,
|
||||||
publicationForm->pubviaroot ?
|
publicationForm->pubviaroot ?
|
||||||
|
@ -181,9 +177,8 @@ BuildCreatePublicationStmt(Oid publicationId)
|
||||||
/* mainly for consistent ordering in test output */
|
/* mainly for consistent ordering in test output */
|
||||||
relationIds = SortList(relationIds, CompareOids);
|
relationIds = SortList(relationIds, CompareOids);
|
||||||
|
|
||||||
foreach_oid(relationId, relationIds)
|
foreach_declared_oid(relationId, relationIds)
|
||||||
{
|
{
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
bool tableOnly = false;
|
bool tableOnly = false;
|
||||||
|
|
||||||
/* since postgres 15, tables can have a column list and filter */
|
/* since postgres 15, tables can have a column list and filter */
|
||||||
|
@ -191,15 +186,6 @@ BuildCreatePublicationStmt(Oid publicationId)
|
||||||
BuildPublicationRelationObjSpec(relationId, publicationId, tableOnly);
|
BuildPublicationRelationObjSpec(relationId, publicationId, tableOnly);
|
||||||
|
|
||||||
createPubStmt->pubobjects = lappend(createPubStmt->pubobjects, publicationObject);
|
createPubStmt->pubobjects = lappend(createPubStmt->pubobjects, publicationObject);
|
||||||
#else
|
|
||||||
|
|
||||||
/* before postgres 15, only full tables are supported */
|
|
||||||
char *schemaName = get_namespace_name(get_rel_namespace(relationId));
|
|
||||||
char *tableName = get_rel_name(relationId);
|
|
||||||
RangeVar *rangeVar = makeRangeVar(schemaName, tableName, -1);
|
|
||||||
|
|
||||||
createPubStmt->tables = lappend(createPubStmt->tables, rangeVar);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* WITH (publish_via_partition_root = true) option */
|
/* WITH (publish_via_partition_root = true) option */
|
||||||
|
@ -270,8 +256,6 @@ AppendPublishOptionList(StringInfo str, List *options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BuildPublicationRelationObjSpec returns a PublicationObjSpec that
|
* BuildPublicationRelationObjSpec returns a PublicationObjSpec that
|
||||||
* can be included in a CREATE or ALTER PUBLICATION statement.
|
* can be included in a CREATE or ALTER PUBLICATION statement.
|
||||||
|
@ -351,9 +335,6 @@ BuildPublicationRelationObjSpec(Oid relationId, Oid publicationId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PreprocessAlterPublicationStmt handles ALTER PUBLICATION statements
|
* PreprocessAlterPublicationStmt handles ALTER PUBLICATION statements
|
||||||
* in a way that is mostly similar to PreprocessAlterDistributedObjectStmt,
|
* in a way that is mostly similar to PreprocessAlterDistributedObjectStmt,
|
||||||
|
@ -414,7 +395,7 @@ GetAlterPublicationDDLCommandsForTable(Oid relationId, bool isAdd)
|
||||||
List *publicationIds = GetRelationPublications(relationId);
|
List *publicationIds = GetRelationPublications(relationId);
|
||||||
Oid publicationId = InvalidOid;
|
Oid publicationId = InvalidOid;
|
||||||
|
|
||||||
foreach_oid(publicationId, publicationIds)
|
foreach_declared_oid(publicationId, publicationIds)
|
||||||
{
|
{
|
||||||
char *command = GetAlterPublicationTableDDLCommand(publicationId,
|
char *command = GetAlterPublicationTableDDLCommand(publicationId,
|
||||||
relationId, isAdd);
|
relationId, isAdd);
|
||||||
|
@ -452,7 +433,6 @@ GetAlterPublicationTableDDLCommand(Oid publicationId, Oid relationId,
|
||||||
|
|
||||||
ReleaseSysCache(pubTuple);
|
ReleaseSysCache(pubTuple);
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
bool tableOnly = !isAdd;
|
bool tableOnly = !isAdd;
|
||||||
|
|
||||||
/* since postgres 15, tables can have a column list and filter */
|
/* since postgres 15, tables can have a column list and filter */
|
||||||
|
@ -461,16 +441,6 @@ GetAlterPublicationTableDDLCommand(Oid publicationId, Oid relationId,
|
||||||
|
|
||||||
alterPubStmt->pubobjects = lappend(alterPubStmt->pubobjects, publicationObject);
|
alterPubStmt->pubobjects = lappend(alterPubStmt->pubobjects, publicationObject);
|
||||||
alterPubStmt->action = isAdd ? AP_AddObjects : AP_DropObjects;
|
alterPubStmt->action = isAdd ? AP_AddObjects : AP_DropObjects;
|
||||||
#else
|
|
||||||
|
|
||||||
/* before postgres 15, only full tables are supported */
|
|
||||||
char *schemaName = get_namespace_name(get_rel_namespace(relationId));
|
|
||||||
char *tableName = get_rel_name(relationId);
|
|
||||||
RangeVar *rangeVar = makeRangeVar(schemaName, tableName, -1);
|
|
||||||
|
|
||||||
alterPubStmt->tables = lappend(alterPubStmt->tables, rangeVar);
|
|
||||||
alterPubStmt->tableAction = isAdd ? DEFELEM_ADD : DEFELEM_DROP;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* we take the WHERE clause from the catalog where it is already transformed */
|
/* we take the WHERE clause from the catalog where it is already transformed */
|
||||||
bool whereClauseNeedsTransform = false;
|
bool whereClauseNeedsTransform = false;
|
||||||
|
|
|
@ -74,7 +74,9 @@ static char * GetRoleNameFromDbRoleSetting(HeapTuple tuple,
|
||||||
TupleDesc DbRoleSettingDescription);
|
TupleDesc DbRoleSettingDescription);
|
||||||
static char * GetDatabaseNameFromDbRoleSetting(HeapTuple tuple,
|
static char * GetDatabaseNameFromDbRoleSetting(HeapTuple tuple,
|
||||||
TupleDesc DbRoleSettingDescription);
|
TupleDesc DbRoleSettingDescription);
|
||||||
|
#if PG_VERSION_NUM < PG_VERSION_17
|
||||||
static Node * makeStringConst(char *str, int location);
|
static Node * makeStringConst(char *str, int location);
|
||||||
|
#endif
|
||||||
static Node * makeIntConst(int val, int location);
|
static Node * makeIntConst(int val, int location);
|
||||||
static Node * makeFloatConst(char *str, int location);
|
static Node * makeFloatConst(char *str, int location);
|
||||||
static const char * WrapQueryInAlterRoleIfExistsCall(const char *query, RoleSpec *role);
|
static const char * WrapQueryInAlterRoleIfExistsCall(const char *query, RoleSpec *role);
|
||||||
|
@ -163,7 +165,7 @@ PostprocessAlterRoleStmt(Node *node, const char *queryString)
|
||||||
AlterRoleStmt *stmt = castNode(AlterRoleStmt, node);
|
AlterRoleStmt *stmt = castNode(AlterRoleStmt, node);
|
||||||
|
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, stmt->options)
|
foreach_declared_ptr(option, stmt->options)
|
||||||
{
|
{
|
||||||
if (strcasecmp(option->defname, "password") == 0)
|
if (strcasecmp(option->defname, "password") == 0)
|
||||||
{
|
{
|
||||||
|
@ -564,7 +566,7 @@ GenerateCreateOrAlterRoleCommand(Oid roleOid)
|
||||||
{
|
{
|
||||||
List *grantRoleStmts = GenerateGrantRoleStmtsOfRole(roleOid);
|
List *grantRoleStmts = GenerateGrantRoleStmtsOfRole(roleOid);
|
||||||
Node *stmt = NULL;
|
Node *stmt = NULL;
|
||||||
foreach_ptr(stmt, grantRoleStmts)
|
foreach_declared_ptr(stmt, grantRoleStmts)
|
||||||
{
|
{
|
||||||
completeRoleList = lappend(completeRoleList, DeparseTreeNode(stmt));
|
completeRoleList = lappend(completeRoleList, DeparseTreeNode(stmt));
|
||||||
}
|
}
|
||||||
|
@ -578,7 +580,7 @@ GenerateCreateOrAlterRoleCommand(Oid roleOid)
|
||||||
*/
|
*/
|
||||||
List *secLabelOnRoleStmts = GenerateSecLabelOnRoleStmts(roleOid, rolename);
|
List *secLabelOnRoleStmts = GenerateSecLabelOnRoleStmts(roleOid, rolename);
|
||||||
stmt = NULL;
|
stmt = NULL;
|
||||||
foreach_ptr(stmt, secLabelOnRoleStmts)
|
foreach_declared_ptr(stmt, secLabelOnRoleStmts)
|
||||||
{
|
{
|
||||||
completeRoleList = lappend(completeRoleList, DeparseTreeNode(stmt));
|
completeRoleList = lappend(completeRoleList, DeparseTreeNode(stmt));
|
||||||
}
|
}
|
||||||
|
@ -787,7 +789,7 @@ MakeSetStatementArguments(char *configurationName, char *configurationValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
char *configuration = NULL;
|
char *configuration = NULL;
|
||||||
foreach_ptr(configuration, configurationList)
|
foreach_declared_ptr(configuration, configurationList)
|
||||||
{
|
{
|
||||||
Node *arg = makeStringConst(configuration, -1);
|
Node *arg = makeStringConst(configuration, -1);
|
||||||
args = lappend(args, arg);
|
args = lappend(args, arg);
|
||||||
|
@ -823,7 +825,7 @@ GenerateGrantRoleStmtsFromOptions(RoleSpec *roleSpec, List *options)
|
||||||
List *stmts = NIL;
|
List *stmts = NIL;
|
||||||
|
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, options)
|
foreach_declared_ptr(option, options)
|
||||||
{
|
{
|
||||||
if (strcmp(option->defname, "adminmembers") != 0 &&
|
if (strcmp(option->defname, "adminmembers") != 0 &&
|
||||||
strcmp(option->defname, "rolemembers") != 0 &&
|
strcmp(option->defname, "rolemembers") != 0 &&
|
||||||
|
@ -1047,7 +1049,7 @@ PreprocessCreateRoleStmt(Node *node, const char *queryString,
|
||||||
|
|
||||||
/* deparse all grant statements and add them to the commands list */
|
/* deparse all grant statements and add them to the commands list */
|
||||||
Node *stmt = NULL;
|
Node *stmt = NULL;
|
||||||
foreach_ptr(stmt, grantRoleStmts)
|
foreach_declared_ptr(stmt, grantRoleStmts)
|
||||||
{
|
{
|
||||||
commands = lappend(commands, DeparseTreeNode(stmt));
|
commands = lappend(commands, DeparseTreeNode(stmt));
|
||||||
}
|
}
|
||||||
|
@ -1058,6 +1060,8 @@ PreprocessCreateRoleStmt(Node *node, const char *queryString,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM < PG_VERSION_17
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* makeStringConst creates a Const Node that stores a given string
|
* makeStringConst creates a Const Node that stores a given string
|
||||||
*
|
*
|
||||||
|
@ -1068,19 +1072,17 @@ makeStringConst(char *str, int location)
|
||||||
{
|
{
|
||||||
A_Const *n = makeNode(A_Const);
|
A_Const *n = makeNode(A_Const);
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
n->val.sval.type = T_String;
|
n->val.sval.type = T_String;
|
||||||
n->val.sval.sval = str;
|
n->val.sval.sval = str;
|
||||||
#else
|
|
||||||
n->val.type = T_String;
|
|
||||||
n->val.val.str = str;
|
|
||||||
#endif
|
|
||||||
n->location = location;
|
n->location = location;
|
||||||
|
|
||||||
return (Node *) n;
|
return (Node *) n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* makeIntConst creates a Const Node that stores a given integer
|
* makeIntConst creates a Const Node that stores a given integer
|
||||||
*
|
*
|
||||||
|
@ -1091,13 +1093,8 @@ makeIntConst(int val, int location)
|
||||||
{
|
{
|
||||||
A_Const *n = makeNode(A_Const);
|
A_Const *n = makeNode(A_Const);
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
n->val.ival.type = T_Integer;
|
n->val.ival.type = T_Integer;
|
||||||
n->val.ival.ival = val;
|
n->val.ival.ival = val;
|
||||||
#else
|
|
||||||
n->val.type = T_Integer;
|
|
||||||
n->val.val.ival = val;
|
|
||||||
#endif
|
|
||||||
n->location = location;
|
n->location = location;
|
||||||
|
|
||||||
return (Node *) n;
|
return (Node *) n;
|
||||||
|
@ -1114,13 +1111,8 @@ makeFloatConst(char *str, int location)
|
||||||
{
|
{
|
||||||
A_Const *n = makeNode(A_Const);
|
A_Const *n = makeNode(A_Const);
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
n->val.fval.type = T_Float;
|
n->val.fval.type = T_Float;
|
||||||
n->val.fval.fval = str;
|
n->val.fval.fval = str;
|
||||||
#else
|
|
||||||
n->val.type = T_Float;
|
|
||||||
n->val.val.str = str;
|
|
||||||
#endif
|
|
||||||
n->location = location;
|
n->location = location;
|
||||||
|
|
||||||
return (Node *) n;
|
return (Node *) n;
|
||||||
|
@ -1174,7 +1166,7 @@ void
|
||||||
UnmarkRolesDistributed(List *roles)
|
UnmarkRolesDistributed(List *roles)
|
||||||
{
|
{
|
||||||
Node *roleNode = NULL;
|
Node *roleNode = NULL;
|
||||||
foreach_ptr(roleNode, roles)
|
foreach_declared_ptr(roleNode, roles)
|
||||||
{
|
{
|
||||||
RoleSpec *role = castNode(RoleSpec, roleNode);
|
RoleSpec *role = castNode(RoleSpec, roleNode);
|
||||||
ObjectAddress roleAddress = { 0 };
|
ObjectAddress roleAddress = { 0 };
|
||||||
|
@ -1204,7 +1196,7 @@ FilterDistributedRoles(List *roles)
|
||||||
{
|
{
|
||||||
List *distributedRoles = NIL;
|
List *distributedRoles = NIL;
|
||||||
Node *roleNode = NULL;
|
Node *roleNode = NULL;
|
||||||
foreach_ptr(roleNode, roles)
|
foreach_declared_ptr(roleNode, roles)
|
||||||
{
|
{
|
||||||
RoleSpec *role = castNode(RoleSpec, roleNode);
|
RoleSpec *role = castNode(RoleSpec, roleNode);
|
||||||
Oid roleOid = get_rolespec_oid(role, true);
|
Oid roleOid = get_rolespec_oid(role, true);
|
||||||
|
@ -1282,7 +1274,7 @@ PostprocessGrantRoleStmt(Node *node, const char *queryString)
|
||||||
GrantRoleStmt *stmt = castNode(GrantRoleStmt, node);
|
GrantRoleStmt *stmt = castNode(GrantRoleStmt, node);
|
||||||
|
|
||||||
RoleSpec *role = NULL;
|
RoleSpec *role = NULL;
|
||||||
foreach_ptr(role, stmt->grantee_roles)
|
foreach_declared_ptr(role, stmt->grantee_roles)
|
||||||
{
|
{
|
||||||
Oid roleOid = get_rolespec_oid(role, false);
|
Oid roleOid = get_rolespec_oid(role, false);
|
||||||
ObjectAddress *roleAddress = palloc0(sizeof(ObjectAddress));
|
ObjectAddress *roleAddress = palloc0(sizeof(ObjectAddress));
|
||||||
|
|
|
@ -162,7 +162,7 @@ PreprocessDropSchemaStmt(Node *node, const char *queryString,
|
||||||
EnsureSequentialMode(OBJECT_SCHEMA);
|
EnsureSequentialMode(OBJECT_SCHEMA);
|
||||||
|
|
||||||
String *schemaVal = NULL;
|
String *schemaVal = NULL;
|
||||||
foreach_ptr(schemaVal, distributedSchemas)
|
foreach_declared_ptr(schemaVal, distributedSchemas)
|
||||||
{
|
{
|
||||||
if (SchemaHasDistributedTableWithFKey(strVal(schemaVal)))
|
if (SchemaHasDistributedTableWithFKey(strVal(schemaVal)))
|
||||||
{
|
{
|
||||||
|
@ -322,7 +322,7 @@ FilterDistributedSchemas(List *schemas)
|
||||||
List *distributedSchemas = NIL;
|
List *distributedSchemas = NIL;
|
||||||
|
|
||||||
String *schemaValue = NULL;
|
String *schemaValue = NULL;
|
||||||
foreach_ptr(schemaValue, schemas)
|
foreach_declared_ptr(schemaValue, schemas)
|
||||||
{
|
{
|
||||||
const char *schemaName = strVal(schemaValue);
|
const char *schemaName = strVal(schemaValue);
|
||||||
Oid schemaOid = get_namespace_oid(schemaName, true);
|
Oid schemaOid = get_namespace_oid(schemaName, true);
|
||||||
|
@ -443,7 +443,7 @@ GetGrantCommandsFromCreateSchemaStmt(Node *node)
|
||||||
CreateSchemaStmt *stmt = castNode(CreateSchemaStmt, node);
|
CreateSchemaStmt *stmt = castNode(CreateSchemaStmt, node);
|
||||||
|
|
||||||
Node *element = NULL;
|
Node *element = NULL;
|
||||||
foreach_ptr(element, stmt->schemaElts)
|
foreach_declared_ptr(element, stmt->schemaElts)
|
||||||
{
|
{
|
||||||
if (!IsA(element, GrantStmt))
|
if (!IsA(element, GrantStmt))
|
||||||
{
|
{
|
||||||
|
@ -480,7 +480,7 @@ static bool
|
||||||
CreateSchemaStmtCreatesTable(CreateSchemaStmt *stmt)
|
CreateSchemaStmtCreatesTable(CreateSchemaStmt *stmt)
|
||||||
{
|
{
|
||||||
Node *element = NULL;
|
Node *element = NULL;
|
||||||
foreach_ptr(element, stmt->schemaElts)
|
foreach_declared_ptr(element, stmt->schemaElts)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* CREATE TABLE AS and CREATE FOREIGN TABLE commands cannot be
|
* CREATE TABLE AS and CREATE FOREIGN TABLE commands cannot be
|
||||||
|
|
|
@ -174,7 +174,7 @@ EnsureTableKindSupportedForTenantSchema(Oid relationId)
|
||||||
List *partitionList = PartitionList(relationId);
|
List *partitionList = PartitionList(relationId);
|
||||||
|
|
||||||
Oid partitionRelationId = InvalidOid;
|
Oid partitionRelationId = InvalidOid;
|
||||||
foreach_oid(partitionRelationId, partitionList)
|
foreach_declared_oid(partitionRelationId, partitionList)
|
||||||
{
|
{
|
||||||
ErrorIfIllegalPartitioningInTenantSchema(relationId, partitionRelationId);
|
ErrorIfIllegalPartitioningInTenantSchema(relationId, partitionRelationId);
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,7 @@ EnsureFKeysForTenantTable(Oid relationId)
|
||||||
int fKeyReferencingFlags = INCLUDE_REFERENCING_CONSTRAINTS | INCLUDE_ALL_TABLE_TYPES;
|
int fKeyReferencingFlags = INCLUDE_REFERENCING_CONSTRAINTS | INCLUDE_ALL_TABLE_TYPES;
|
||||||
List *referencingForeignKeys = GetForeignKeyOids(relationId, fKeyReferencingFlags);
|
List *referencingForeignKeys = GetForeignKeyOids(relationId, fKeyReferencingFlags);
|
||||||
Oid foreignKeyId = InvalidOid;
|
Oid foreignKeyId = InvalidOid;
|
||||||
foreach_oid(foreignKeyId, referencingForeignKeys)
|
foreach_declared_oid(foreignKeyId, referencingForeignKeys)
|
||||||
{
|
{
|
||||||
Oid referencingTableId = GetReferencingTableId(foreignKeyId);
|
Oid referencingTableId = GetReferencingTableId(foreignKeyId);
|
||||||
Oid referencedTableId = GetReferencedTableId(foreignKeyId);
|
Oid referencedTableId = GetReferencedTableId(foreignKeyId);
|
||||||
|
@ -232,7 +232,7 @@ EnsureFKeysForTenantTable(Oid relationId)
|
||||||
|
|
||||||
int fKeyReferencedFlags = INCLUDE_REFERENCED_CONSTRAINTS | INCLUDE_ALL_TABLE_TYPES;
|
int fKeyReferencedFlags = INCLUDE_REFERENCED_CONSTRAINTS | INCLUDE_ALL_TABLE_TYPES;
|
||||||
List *referencedForeignKeys = GetForeignKeyOids(relationId, fKeyReferencedFlags);
|
List *referencedForeignKeys = GetForeignKeyOids(relationId, fKeyReferencedFlags);
|
||||||
foreach_oid(foreignKeyId, referencedForeignKeys)
|
foreach_declared_oid(foreignKeyId, referencedForeignKeys)
|
||||||
{
|
{
|
||||||
Oid referencingTableId = GetReferencingTableId(foreignKeyId);
|
Oid referencingTableId = GetReferencingTableId(foreignKeyId);
|
||||||
Oid referencedTableId = GetReferencedTableId(foreignKeyId);
|
Oid referencedTableId = GetReferencedTableId(foreignKeyId);
|
||||||
|
@ -429,7 +429,7 @@ EnsureSchemaCanBeDistributed(Oid schemaId, List *schemaTableIdList)
|
||||||
}
|
}
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, schemaTableIdList)
|
foreach_declared_oid(relationId, schemaTableIdList)
|
||||||
{
|
{
|
||||||
EnsureTenantTable(relationId, "citus_schema_distribute");
|
EnsureTenantTable(relationId, "citus_schema_distribute");
|
||||||
}
|
}
|
||||||
|
@ -637,7 +637,7 @@ citus_schema_distribute(PG_FUNCTION_ARGS)
|
||||||
List *tableIdListInSchema = SchemaGetNonShardTableIdList(schemaId);
|
List *tableIdListInSchema = SchemaGetNonShardTableIdList(schemaId);
|
||||||
List *tableIdListToConvert = NIL;
|
List *tableIdListToConvert = NIL;
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, tableIdListInSchema)
|
foreach_declared_oid(relationId, tableIdListInSchema)
|
||||||
{
|
{
|
||||||
/* prevent concurrent drop of the relation */
|
/* prevent concurrent drop of the relation */
|
||||||
LockRelationOid(relationId, AccessShareLock);
|
LockRelationOid(relationId, AccessShareLock);
|
||||||
|
@ -675,7 +675,7 @@ citus_schema_distribute(PG_FUNCTION_ARGS)
|
||||||
* tables.
|
* tables.
|
||||||
*/
|
*/
|
||||||
List *originalForeignKeyRecreationCommands = NIL;
|
List *originalForeignKeyRecreationCommands = NIL;
|
||||||
foreach_oid(relationId, tableIdListToConvert)
|
foreach_declared_oid(relationId, tableIdListToConvert)
|
||||||
{
|
{
|
||||||
List *fkeyCommandsForRelation =
|
List *fkeyCommandsForRelation =
|
||||||
GetFKeyCreationCommandsRelationInvolvedWithTableType(relationId,
|
GetFKeyCreationCommandsRelationInvolvedWithTableType(relationId,
|
||||||
|
@ -741,7 +741,7 @@ citus_schema_undistribute(PG_FUNCTION_ARGS)
|
||||||
List *tableIdListInSchema = SchemaGetNonShardTableIdList(schemaId);
|
List *tableIdListInSchema = SchemaGetNonShardTableIdList(schemaId);
|
||||||
List *tableIdListToConvert = NIL;
|
List *tableIdListToConvert = NIL;
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, tableIdListInSchema)
|
foreach_declared_oid(relationId, tableIdListInSchema)
|
||||||
{
|
{
|
||||||
/* prevent concurrent drop of the relation */
|
/* prevent concurrent drop of the relation */
|
||||||
LockRelationOid(relationId, AccessShareLock);
|
LockRelationOid(relationId, AccessShareLock);
|
||||||
|
@ -883,7 +883,7 @@ TenantSchemaPickAnchorShardId(Oid schemaId)
|
||||||
}
|
}
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, tablesInSchema)
|
foreach_declared_oid(relationId, tablesInSchema)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Make sure the relation isn't dropped for the remainder of
|
* Make sure the relation isn't dropped for the remainder of
|
||||||
|
|
|
@ -123,7 +123,7 @@ static bool
|
||||||
OptionsSpecifyOwnedBy(List *optionList, Oid *ownedByTableId)
|
OptionsSpecifyOwnedBy(List *optionList, Oid *ownedByTableId)
|
||||||
{
|
{
|
||||||
DefElem *defElem = NULL;
|
DefElem *defElem = NULL;
|
||||||
foreach_ptr(defElem, optionList)
|
foreach_declared_ptr(defElem, optionList)
|
||||||
{
|
{
|
||||||
if (strcmp(defElem->defname, "owned_by") == 0)
|
if (strcmp(defElem->defname, "owned_by") == 0)
|
||||||
{
|
{
|
||||||
|
@ -202,7 +202,7 @@ ExtractDefaultColumnsAndOwnedSequences(Oid relationId, List **columnNameList,
|
||||||
}
|
}
|
||||||
|
|
||||||
Oid ownedSequenceId = InvalidOid;
|
Oid ownedSequenceId = InvalidOid;
|
||||||
foreach_oid(ownedSequenceId, columnOwnedSequences)
|
foreach_declared_oid(ownedSequenceId, columnOwnedSequences)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* A column might have multiple sequences one via OWNED BY one another
|
* A column might have multiple sequences one via OWNED BY one another
|
||||||
|
@ -288,7 +288,7 @@ PreprocessDropSequenceStmt(Node *node, const char *queryString,
|
||||||
*/
|
*/
|
||||||
List *deletingSequencesList = stmt->objects;
|
List *deletingSequencesList = stmt->objects;
|
||||||
List *objectNameList = NULL;
|
List *objectNameList = NULL;
|
||||||
foreach_ptr(objectNameList, deletingSequencesList)
|
foreach_declared_ptr(objectNameList, deletingSequencesList)
|
||||||
{
|
{
|
||||||
RangeVar *seq = makeRangeVarFromNameList(objectNameList);
|
RangeVar *seq = makeRangeVarFromNameList(objectNameList);
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ PreprocessDropSequenceStmt(Node *node, const char *queryString,
|
||||||
|
|
||||||
/* remove the entries for the distributed objects on dropping */
|
/* remove the entries for the distributed objects on dropping */
|
||||||
ObjectAddress *address = NULL;
|
ObjectAddress *address = NULL;
|
||||||
foreach_ptr(address, distributedSequenceAddresses)
|
foreach_declared_ptr(address, distributedSequenceAddresses)
|
||||||
{
|
{
|
||||||
UnmarkObjectDistributed(address);
|
UnmarkObjectDistributed(address);
|
||||||
}
|
}
|
||||||
|
@ -356,7 +356,7 @@ SequenceDropStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess)
|
||||||
|
|
||||||
List *droppingSequencesList = dropSeqStmt->objects;
|
List *droppingSequencesList = dropSeqStmt->objects;
|
||||||
List *objectNameList = NULL;
|
List *objectNameList = NULL;
|
||||||
foreach_ptr(objectNameList, droppingSequencesList)
|
foreach_declared_ptr(objectNameList, droppingSequencesList)
|
||||||
{
|
{
|
||||||
RangeVar *seq = makeRangeVarFromNameList(objectNameList);
|
RangeVar *seq = makeRangeVarFromNameList(objectNameList);
|
||||||
|
|
||||||
|
@ -476,7 +476,7 @@ PreprocessAlterSequenceStmt(Node *node, const char *queryString,
|
||||||
{
|
{
|
||||||
List *options = stmt->options;
|
List *options = stmt->options;
|
||||||
DefElem *defel = NULL;
|
DefElem *defel = NULL;
|
||||||
foreach_ptr(defel, options)
|
foreach_declared_ptr(defel, options)
|
||||||
{
|
{
|
||||||
if (strcmp(defel->defname, "as") == 0)
|
if (strcmp(defel->defname, "as") == 0)
|
||||||
{
|
{
|
||||||
|
@ -511,7 +511,7 @@ SequenceUsedInDistributedTable(const ObjectAddress *sequenceAddress, char depTyp
|
||||||
Oid relationId;
|
Oid relationId;
|
||||||
List *relations = GetDependentRelationsWithSequence(sequenceAddress->objectId,
|
List *relations = GetDependentRelationsWithSequence(sequenceAddress->objectId,
|
||||||
depType);
|
depType);
|
||||||
foreach_oid(relationId, relations)
|
foreach_declared_oid(relationId, relations)
|
||||||
{
|
{
|
||||||
if (IsCitusTable(relationId))
|
if (IsCitusTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -735,8 +735,6 @@ PostprocessAlterSequenceOwnerStmt(Node *node, const char *queryString)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PreprocessAlterSequencePersistenceStmt is called for change of persistence
|
* PreprocessAlterSequencePersistenceStmt is called for change of persistence
|
||||||
* of sequences before the persistence is changed on the local instance.
|
* of sequences before the persistence is changed on the local instance.
|
||||||
|
@ -847,9 +845,6 @@ PreprocessSequenceAlterTableStmt(Node *node, const char *queryString,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PreprocessGrantOnSequenceStmt is executed before the statement is applied to the local
|
* PreprocessGrantOnSequenceStmt is executed before the statement is applied to the local
|
||||||
* postgres instance.
|
* postgres instance.
|
||||||
|
@ -930,7 +925,7 @@ PostprocessGrantOnSequenceStmt(Node *node, const char *queryString)
|
||||||
EnsureCoordinator();
|
EnsureCoordinator();
|
||||||
|
|
||||||
RangeVar *sequence = NULL;
|
RangeVar *sequence = NULL;
|
||||||
foreach_ptr(sequence, distributedSequences)
|
foreach_declared_ptr(sequence, distributedSequences)
|
||||||
{
|
{
|
||||||
ObjectAddress *sequenceAddress = palloc0(sizeof(ObjectAddress));
|
ObjectAddress *sequenceAddress = palloc0(sizeof(ObjectAddress));
|
||||||
Oid sequenceOid = RangeVarGetRelid(sequence, NoLock, false);
|
Oid sequenceOid = RangeVarGetRelid(sequence, NoLock, false);
|
||||||
|
@ -1014,7 +1009,7 @@ FilterDistributedSequences(GrantStmt *stmt)
|
||||||
/* iterate over all namespace names provided to get their oid's */
|
/* iterate over all namespace names provided to get their oid's */
|
||||||
List *namespaceOidList = NIL;
|
List *namespaceOidList = NIL;
|
||||||
String *namespaceValue = NULL;
|
String *namespaceValue = NULL;
|
||||||
foreach_ptr(namespaceValue, stmt->objects)
|
foreach_declared_ptr(namespaceValue, stmt->objects)
|
||||||
{
|
{
|
||||||
char *nspname = strVal(namespaceValue);
|
char *nspname = strVal(namespaceValue);
|
||||||
bool missing_ok = false;
|
bool missing_ok = false;
|
||||||
|
@ -1028,7 +1023,7 @@ FilterDistributedSequences(GrantStmt *stmt)
|
||||||
*/
|
*/
|
||||||
List *distributedSequenceList = DistributedSequenceList();
|
List *distributedSequenceList = DistributedSequenceList();
|
||||||
ObjectAddress *sequenceAddress = NULL;
|
ObjectAddress *sequenceAddress = NULL;
|
||||||
foreach_ptr(sequenceAddress, distributedSequenceList)
|
foreach_declared_ptr(sequenceAddress, distributedSequenceList)
|
||||||
{
|
{
|
||||||
Oid namespaceOid = get_rel_namespace(sequenceAddress->objectId);
|
Oid namespaceOid = get_rel_namespace(sequenceAddress->objectId);
|
||||||
|
|
||||||
|
@ -1052,7 +1047,7 @@ FilterDistributedSequences(GrantStmt *stmt)
|
||||||
{
|
{
|
||||||
bool missing_ok = false;
|
bool missing_ok = false;
|
||||||
RangeVar *sequenceRangeVar = NULL;
|
RangeVar *sequenceRangeVar = NULL;
|
||||||
foreach_ptr(sequenceRangeVar, stmt->objects)
|
foreach_declared_ptr(sequenceRangeVar, stmt->objects)
|
||||||
{
|
{
|
||||||
Oid sequenceOid = RangeVarGetRelid(sequenceRangeVar, NoLock, missing_ok);
|
Oid sequenceOid = RangeVarGetRelid(sequenceRangeVar, NoLock, missing_ok);
|
||||||
ObjectAddress *sequenceAddress = palloc0(sizeof(ObjectAddress));
|
ObjectAddress *sequenceAddress = palloc0(sizeof(ObjectAddress));
|
||||||
|
|
|
@ -184,7 +184,7 @@ PreprocessDropStatisticsStmt(Node *node, const char *queryString,
|
||||||
List *ddlJobs = NIL;
|
List *ddlJobs = NIL;
|
||||||
List *processedStatsOids = NIL;
|
List *processedStatsOids = NIL;
|
||||||
List *objectNameList = NULL;
|
List *objectNameList = NULL;
|
||||||
foreach_ptr(objectNameList, dropStatisticsStmt->objects)
|
foreach_declared_ptr(objectNameList, dropStatisticsStmt->objects)
|
||||||
{
|
{
|
||||||
Oid statsOid = get_statistics_object_oid(objectNameList,
|
Oid statsOid = get_statistics_object_oid(objectNameList,
|
||||||
dropStatisticsStmt->missing_ok);
|
dropStatisticsStmt->missing_ok);
|
||||||
|
@ -234,7 +234,7 @@ DropStatisticsObjectAddress(Node *node, bool missing_ok, bool isPostprocess)
|
||||||
List *objectAddresses = NIL;
|
List *objectAddresses = NIL;
|
||||||
|
|
||||||
List *objectNameList = NULL;
|
List *objectNameList = NULL;
|
||||||
foreach_ptr(objectNameList, dropStatisticsStmt->objects)
|
foreach_declared_ptr(objectNameList, dropStatisticsStmt->objects)
|
||||||
{
|
{
|
||||||
Oid statsOid = get_statistics_object_oid(objectNameList,
|
Oid statsOid = get_statistics_object_oid(objectNameList,
|
||||||
dropStatisticsStmt->missing_ok);
|
dropStatisticsStmt->missing_ok);
|
||||||
|
@ -535,7 +535,7 @@ GetExplicitStatisticsCommandList(Oid relationId)
|
||||||
int saveNestLevel = PushEmptySearchPath();
|
int saveNestLevel = PushEmptySearchPath();
|
||||||
|
|
||||||
Oid statisticsId = InvalidOid;
|
Oid statisticsId = InvalidOid;
|
||||||
foreach_oid(statisticsId, statisticsIdList)
|
foreach_declared_oid(statisticsId, statisticsIdList)
|
||||||
{
|
{
|
||||||
/* we need create commands for already created stats before distribution */
|
/* we need create commands for already created stats before distribution */
|
||||||
Datum commandText = DirectFunctionCall1(pg_get_statisticsobjdef,
|
Datum commandText = DirectFunctionCall1(pg_get_statisticsobjdef,
|
||||||
|
@ -606,7 +606,7 @@ GetExplicitStatisticsSchemaIdList(Oid relationId)
|
||||||
RelationClose(relation);
|
RelationClose(relation);
|
||||||
|
|
||||||
Oid statsId = InvalidOid;
|
Oid statsId = InvalidOid;
|
||||||
foreach_oid(statsId, statsIdList)
|
foreach_declared_oid(statsId, statsIdList)
|
||||||
{
|
{
|
||||||
HeapTuple heapTuple = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(statsId));
|
HeapTuple heapTuple = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(statsId));
|
||||||
if (!HeapTupleIsValid(heapTuple))
|
if (!HeapTupleIsValid(heapTuple))
|
||||||
|
@ -651,14 +651,15 @@ GetAlterIndexStatisticsCommands(Oid indexOid)
|
||||||
}
|
}
|
||||||
|
|
||||||
Form_pg_attribute targetAttr = (Form_pg_attribute) GETSTRUCT(attTuple);
|
Form_pg_attribute targetAttr = (Form_pg_attribute) GETSTRUCT(attTuple);
|
||||||
if (targetAttr->attstattarget != DEFAULT_STATISTICS_TARGET)
|
int32 targetAttstattarget = getAttstattarget_compat(attTuple);
|
||||||
|
if (targetAttstattarget != DEFAULT_STATISTICS_TARGET)
|
||||||
{
|
{
|
||||||
char *indexNameWithSchema = generate_qualified_relation_name(indexOid);
|
char *indexNameWithSchema = generate_qualified_relation_name(indexOid);
|
||||||
|
|
||||||
char *command =
|
char *command =
|
||||||
GenerateAlterIndexColumnSetStatsCommand(indexNameWithSchema,
|
GenerateAlterIndexColumnSetStatsCommand(indexNameWithSchema,
|
||||||
targetAttr->attnum,
|
targetAttr->attnum,
|
||||||
targetAttr->attstattarget);
|
targetAttstattarget);
|
||||||
|
|
||||||
alterIndexStatisticsCommandList =
|
alterIndexStatisticsCommandList =
|
||||||
lappend(alterIndexStatisticsCommandList,
|
lappend(alterIndexStatisticsCommandList,
|
||||||
|
@ -773,9 +774,10 @@ CreateAlterCommandIfTargetNotDefault(Oid statsOid)
|
||||||
}
|
}
|
||||||
|
|
||||||
Form_pg_statistic_ext statisticsForm = (Form_pg_statistic_ext) GETSTRUCT(tup);
|
Form_pg_statistic_ext statisticsForm = (Form_pg_statistic_ext) GETSTRUCT(tup);
|
||||||
|
int16 currentStxstattarget = getStxstattarget_compat(tup);
|
||||||
ReleaseSysCache(tup);
|
ReleaseSysCache(tup);
|
||||||
|
|
||||||
if (statisticsForm->stxstattarget == -1)
|
if (currentStxstattarget == -1)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -785,7 +787,8 @@ CreateAlterCommandIfTargetNotDefault(Oid statsOid)
|
||||||
char *schemaName = get_namespace_name(statisticsForm->stxnamespace);
|
char *schemaName = get_namespace_name(statisticsForm->stxnamespace);
|
||||||
char *statName = NameStr(statisticsForm->stxname);
|
char *statName = NameStr(statisticsForm->stxname);
|
||||||
|
|
||||||
alterStatsStmt->stxstattarget = statisticsForm->stxstattarget;
|
alterStatsStmt->stxstattarget = getAlterStatsStxstattarget_compat(
|
||||||
|
currentStxstattarget);
|
||||||
alterStatsStmt->defnames = list_make2(makeString(schemaName), makeString(statName));
|
alterStatsStmt->defnames = list_make2(makeString(schemaName), makeString(statName));
|
||||||
|
|
||||||
return DeparseAlterStatisticsStmt((Node *) alterStatsStmt);
|
return DeparseAlterStatisticsStmt((Node *) alterStatsStmt);
|
||||||
|
|
|
@ -154,7 +154,7 @@ PreprocessDropTableStmt(Node *node, const char *queryString,
|
||||||
Assert(dropTableStatement->removeType == OBJECT_TABLE);
|
Assert(dropTableStatement->removeType == OBJECT_TABLE);
|
||||||
|
|
||||||
List *tableNameList = NULL;
|
List *tableNameList = NULL;
|
||||||
foreach_ptr(tableNameList, dropTableStatement->objects)
|
foreach_declared_ptr(tableNameList, dropTableStatement->objects)
|
||||||
{
|
{
|
||||||
RangeVar *tableRangeVar = makeRangeVarFromNameList(tableNameList);
|
RangeVar *tableRangeVar = makeRangeVarFromNameList(tableNameList);
|
||||||
bool missingOK = true;
|
bool missingOK = true;
|
||||||
|
@ -202,7 +202,7 @@ PreprocessDropTableStmt(Node *node, const char *queryString,
|
||||||
SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION);
|
SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION);
|
||||||
|
|
||||||
Oid partitionRelationId = InvalidOid;
|
Oid partitionRelationId = InvalidOid;
|
||||||
foreach_oid(partitionRelationId, partitionList)
|
foreach_declared_oid(partitionRelationId, partitionList)
|
||||||
{
|
{
|
||||||
char *detachPartitionCommand =
|
char *detachPartitionCommand =
|
||||||
GenerateDetachPartitionCommand(partitionRelationId);
|
GenerateDetachPartitionCommand(partitionRelationId);
|
||||||
|
@ -263,7 +263,7 @@ PostprocessCreateTableStmt(CreateStmt *createStatement, const char *queryString)
|
||||||
}
|
}
|
||||||
|
|
||||||
RangeVar *parentRelation = NULL;
|
RangeVar *parentRelation = NULL;
|
||||||
foreach_ptr(parentRelation, createStatement->inhRelations)
|
foreach_declared_ptr(parentRelation, createStatement->inhRelations)
|
||||||
{
|
{
|
||||||
Oid parentRelationId = RangeVarGetRelid(parentRelation, NoLock,
|
Oid parentRelationId = RangeVarGetRelid(parentRelation, NoLock,
|
||||||
missingOk);
|
missingOk);
|
||||||
|
@ -480,7 +480,7 @@ PreprocessAlterTableStmtAttachPartition(AlterTableStmt *alterTableStatement,
|
||||||
{
|
{
|
||||||
List *commandList = alterTableStatement->cmds;
|
List *commandList = alterTableStatement->cmds;
|
||||||
AlterTableCmd *alterTableCommand = NULL;
|
AlterTableCmd *alterTableCommand = NULL;
|
||||||
foreach_ptr(alterTableCommand, commandList)
|
foreach_declared_ptr(alterTableCommand, commandList)
|
||||||
{
|
{
|
||||||
if (alterTableCommand->subtype == AT_AttachPartition)
|
if (alterTableCommand->subtype == AT_AttachPartition)
|
||||||
{
|
{
|
||||||
|
@ -792,7 +792,7 @@ ChooseForeignKeyConstraintNameAddition(List *columnNames)
|
||||||
|
|
||||||
String *columnNameString = NULL;
|
String *columnNameString = NULL;
|
||||||
|
|
||||||
foreach_ptr(columnNameString, columnNames)
|
foreach_declared_ptr(columnNameString, columnNames)
|
||||||
{
|
{
|
||||||
const char *name = strVal(columnNameString);
|
const char *name = strVal(columnNameString);
|
||||||
|
|
||||||
|
@ -1153,7 +1153,6 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand,
|
||||||
{
|
{
|
||||||
AlterTableStmt *stmtCopy = copyObject(alterTableStatement);
|
AlterTableStmt *stmtCopy = copyObject(alterTableStatement);
|
||||||
stmtCopy->objtype = OBJECT_SEQUENCE;
|
stmtCopy->objtype = OBJECT_SEQUENCE;
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* it must be ALTER TABLE .. OWNER TO ..
|
* it must be ALTER TABLE .. OWNER TO ..
|
||||||
|
@ -1163,16 +1162,6 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand,
|
||||||
*/
|
*/
|
||||||
return PreprocessSequenceAlterTableStmt((Node *) stmtCopy, alterTableCommand,
|
return PreprocessSequenceAlterTableStmt((Node *) stmtCopy, alterTableCommand,
|
||||||
processUtilityContext);
|
processUtilityContext);
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
* it must be ALTER TABLE .. OWNER TO .. command
|
|
||||||
* since this is the only ALTER command of a sequence that
|
|
||||||
* passes through an AlterTableStmt
|
|
||||||
*/
|
|
||||||
return PreprocessAlterSequenceOwnerStmt((Node *) stmtCopy, alterTableCommand,
|
|
||||||
processUtilityContext);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else if (relKind == RELKIND_VIEW)
|
else if (relKind == RELKIND_VIEW)
|
||||||
{
|
{
|
||||||
|
@ -1314,7 +1303,7 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand,
|
||||||
AlterTableCmd *newCmd = makeNode(AlterTableCmd);
|
AlterTableCmd *newCmd = makeNode(AlterTableCmd);
|
||||||
|
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
|
|
||||||
|
@ -1418,7 +1407,7 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand,
|
||||||
List *columnConstraints = columnDefinition->constraints;
|
List *columnConstraints = columnDefinition->constraints;
|
||||||
|
|
||||||
Constraint *constraint = NULL;
|
Constraint *constraint = NULL;
|
||||||
foreach_ptr(constraint, columnConstraints)
|
foreach_declared_ptr(constraint, columnConstraints)
|
||||||
{
|
{
|
||||||
if (constraint->contype == CONSTR_FOREIGN)
|
if (constraint->contype == CONSTR_FOREIGN)
|
||||||
{
|
{
|
||||||
|
@ -1442,7 +1431,7 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand,
|
||||||
deparseAT = true;
|
deparseAT = true;
|
||||||
|
|
||||||
constraint = NULL;
|
constraint = NULL;
|
||||||
foreach_ptr(constraint, columnConstraints)
|
foreach_declared_ptr(constraint, columnConstraints)
|
||||||
{
|
{
|
||||||
if (ConstrTypeCitusCanDefaultName(constraint->contype))
|
if (ConstrTypeCitusCanDefaultName(constraint->contype))
|
||||||
{
|
{
|
||||||
|
@ -1467,7 +1456,7 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand,
|
||||||
*/
|
*/
|
||||||
constraint = NULL;
|
constraint = NULL;
|
||||||
int constraintIdx = 0;
|
int constraintIdx = 0;
|
||||||
foreach_ptr(constraint, columnConstraints)
|
foreach_declared_ptr(constraint, columnConstraints)
|
||||||
{
|
{
|
||||||
if (constraint->contype == CONSTR_DEFAULT)
|
if (constraint->contype == CONSTR_DEFAULT)
|
||||||
{
|
{
|
||||||
|
@ -1696,7 +1685,7 @@ DeparserSupportsAlterTableAddColumn(AlterTableStmt *alterTableStatement,
|
||||||
{
|
{
|
||||||
ColumnDef *columnDefinition = (ColumnDef *) addColumnSubCommand->def;
|
ColumnDef *columnDefinition = (ColumnDef *) addColumnSubCommand->def;
|
||||||
Constraint *constraint = NULL;
|
Constraint *constraint = NULL;
|
||||||
foreach_ptr(constraint, columnDefinition->constraints)
|
foreach_declared_ptr(constraint, columnDefinition->constraints)
|
||||||
{
|
{
|
||||||
if (constraint->contype == CONSTR_CHECK)
|
if (constraint->contype == CONSTR_CHECK)
|
||||||
{
|
{
|
||||||
|
@ -1792,7 +1781,7 @@ static bool
|
||||||
RelationIdListContainsCitusTableType(List *relationIdList, CitusTableType citusTableType)
|
RelationIdListContainsCitusTableType(List *relationIdList, CitusTableType citusTableType)
|
||||||
{
|
{
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
if (IsCitusTableType(relationId, citusTableType))
|
if (IsCitusTableType(relationId, citusTableType))
|
||||||
{
|
{
|
||||||
|
@ -1812,7 +1801,7 @@ static bool
|
||||||
RelationIdListContainsPostgresTable(List *relationIdList)
|
RelationIdListContainsPostgresTable(List *relationIdList)
|
||||||
{
|
{
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
if (OidIsValid(relationId) && !IsCitusTable(relationId))
|
if (OidIsValid(relationId) && !IsCitusTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -1851,7 +1840,7 @@ ConvertPostgresLocalTablesToCitusLocalTables(AlterTableStmt *alterTableStatement
|
||||||
* change in below loop due to CreateCitusLocalTable.
|
* change in below loop due to CreateCitusLocalTable.
|
||||||
*/
|
*/
|
||||||
RangeVar *relationRangeVar;
|
RangeVar *relationRangeVar;
|
||||||
foreach_ptr(relationRangeVar, relationRangeVarList)
|
foreach_declared_ptr(relationRangeVar, relationRangeVarList)
|
||||||
{
|
{
|
||||||
List *commandList = alterTableStatement->cmds;
|
List *commandList = alterTableStatement->cmds;
|
||||||
LOCKMODE lockMode = AlterTableGetLockLevel(commandList);
|
LOCKMODE lockMode = AlterTableGetLockLevel(commandList);
|
||||||
|
@ -1979,7 +1968,7 @@ RangeVarListHasLocalRelationConvertedByUser(List *relationRangeVarList,
|
||||||
AlterTableStmt *alterTableStatement)
|
AlterTableStmt *alterTableStatement)
|
||||||
{
|
{
|
||||||
RangeVar *relationRangeVar;
|
RangeVar *relationRangeVar;
|
||||||
foreach_ptr(relationRangeVar, relationRangeVarList)
|
foreach_declared_ptr(relationRangeVar, relationRangeVarList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Here we iterate the relation list, and if at least one of the relations
|
* Here we iterate the relation list, and if at least one of the relations
|
||||||
|
@ -2076,7 +2065,7 @@ GetAlterTableAddFKeyConstraintList(AlterTableStmt *alterTableStatement)
|
||||||
|
|
||||||
List *commandList = alterTableStatement->cmds;
|
List *commandList = alterTableStatement->cmds;
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
List *commandForeignKeyConstraintList =
|
List *commandForeignKeyConstraintList =
|
||||||
GetAlterTableCommandFKeyConstraintList(command);
|
GetAlterTableCommandFKeyConstraintList(command);
|
||||||
|
@ -2116,7 +2105,7 @@ GetAlterTableCommandFKeyConstraintList(AlterTableCmd *command)
|
||||||
List *columnConstraints = columnDefinition->constraints;
|
List *columnConstraints = columnDefinition->constraints;
|
||||||
|
|
||||||
Constraint *constraint = NULL;
|
Constraint *constraint = NULL;
|
||||||
foreach_ptr(constraint, columnConstraints)
|
foreach_declared_ptr(constraint, columnConstraints)
|
||||||
{
|
{
|
||||||
if (constraint->contype == CONSTR_FOREIGN)
|
if (constraint->contype == CONSTR_FOREIGN)
|
||||||
{
|
{
|
||||||
|
@ -2139,7 +2128,7 @@ GetRangeVarListFromFKeyConstraintList(List *fKeyConstraintList)
|
||||||
List *rightRelationRangeVarList = NIL;
|
List *rightRelationRangeVarList = NIL;
|
||||||
|
|
||||||
Constraint *fKeyConstraint = NULL;
|
Constraint *fKeyConstraint = NULL;
|
||||||
foreach_ptr(fKeyConstraint, fKeyConstraintList)
|
foreach_declared_ptr(fKeyConstraint, fKeyConstraintList)
|
||||||
{
|
{
|
||||||
RangeVar *rightRelationRangeVar = fKeyConstraint->pktable;
|
RangeVar *rightRelationRangeVar = fKeyConstraint->pktable;
|
||||||
rightRelationRangeVarList = lappend(rightRelationRangeVarList,
|
rightRelationRangeVarList = lappend(rightRelationRangeVarList,
|
||||||
|
@ -2160,7 +2149,7 @@ GetRelationIdListFromRangeVarList(List *rangeVarList, LOCKMODE lockMode, bool mi
|
||||||
List *relationIdList = NIL;
|
List *relationIdList = NIL;
|
||||||
|
|
||||||
RangeVar *rangeVar = NULL;
|
RangeVar *rangeVar = NULL;
|
||||||
foreach_ptr(rangeVar, rangeVarList)
|
foreach_declared_ptr(rangeVar, rangeVarList)
|
||||||
{
|
{
|
||||||
Oid rightRelationId = RangeVarGetRelid(rangeVar, lockMode, missingOk);
|
Oid rightRelationId = RangeVarGetRelid(rangeVar, lockMode, missingOk);
|
||||||
relationIdList = lappend_oid(relationIdList, rightRelationId);
|
relationIdList = lappend_oid(relationIdList, rightRelationId);
|
||||||
|
@ -2234,7 +2223,7 @@ AlterTableDropsForeignKey(AlterTableStmt *alterTableStatement)
|
||||||
Oid relationId = AlterTableLookupRelation(alterTableStatement, lockmode);
|
Oid relationId = AlterTableLookupRelation(alterTableStatement, lockmode);
|
||||||
|
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, alterTableStatement->cmds)
|
foreach_declared_ptr(command, alterTableStatement->cmds)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
|
|
||||||
|
@ -2296,7 +2285,7 @@ AnyForeignKeyDependsOnIndex(Oid indexId)
|
||||||
GetPgDependTuplesForDependingObjects(dependentObjectClassId, dependentObjectId);
|
GetPgDependTuplesForDependingObjects(dependentObjectClassId, dependentObjectId);
|
||||||
|
|
||||||
HeapTuple dependencyTuple = NULL;
|
HeapTuple dependencyTuple = NULL;
|
||||||
foreach_ptr(dependencyTuple, dependencyTupleList)
|
foreach_declared_ptr(dependencyTuple, dependencyTupleList)
|
||||||
{
|
{
|
||||||
Form_pg_depend dependencyForm = (Form_pg_depend) GETSTRUCT(dependencyTuple);
|
Form_pg_depend dependencyForm = (Form_pg_depend) GETSTRUCT(dependencyTuple);
|
||||||
Oid dependingClassId = dependencyForm->classid;
|
Oid dependingClassId = dependencyForm->classid;
|
||||||
|
@ -2484,7 +2473,7 @@ SkipForeignKeyValidationIfConstraintIsFkey(AlterTableStmt *alterTableStatement,
|
||||||
* shards anyway.
|
* shards anyway.
|
||||||
*/
|
*/
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, alterTableStatement->cmds)
|
foreach_declared_ptr(command, alterTableStatement->cmds)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
|
|
||||||
|
@ -2565,7 +2554,7 @@ ErrorIfAlterDropsPartitionColumn(AlterTableStmt *alterTableStatement)
|
||||||
/* then check if any of subcommands drop partition column.*/
|
/* then check if any of subcommands drop partition column.*/
|
||||||
List *commandList = alterTableStatement->cmds;
|
List *commandList = alterTableStatement->cmds;
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
if (alterTableType == AT_DropColumn)
|
if (alterTableType == AT_DropColumn)
|
||||||
|
@ -2634,7 +2623,7 @@ PostprocessAlterTableStmt(AlterTableStmt *alterTableStatement)
|
||||||
|
|
||||||
List *commandList = alterTableStatement->cmds;
|
List *commandList = alterTableStatement->cmds;
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
|
|
||||||
|
@ -2670,7 +2659,7 @@ PostprocessAlterTableStmt(AlterTableStmt *alterTableStatement)
|
||||||
}
|
}
|
||||||
|
|
||||||
Constraint *constraint = NULL;
|
Constraint *constraint = NULL;
|
||||||
foreach_ptr(constraint, columnConstraints)
|
foreach_declared_ptr(constraint, columnConstraints)
|
||||||
{
|
{
|
||||||
if (constraint->conname == NULL &&
|
if (constraint->conname == NULL &&
|
||||||
(constraint->contype == CONSTR_PRIMARY ||
|
(constraint->contype == CONSTR_PRIMARY ||
|
||||||
|
@ -2690,7 +2679,7 @@ PostprocessAlterTableStmt(AlterTableStmt *alterTableStatement)
|
||||||
* that sequence is supported
|
* that sequence is supported
|
||||||
*/
|
*/
|
||||||
constraint = NULL;
|
constraint = NULL;
|
||||||
foreach_ptr(constraint, columnConstraints)
|
foreach_declared_ptr(constraint, columnConstraints)
|
||||||
{
|
{
|
||||||
if (constraint->contype == CONSTR_DEFAULT)
|
if (constraint->contype == CONSTR_DEFAULT)
|
||||||
{
|
{
|
||||||
|
@ -2802,7 +2791,7 @@ FixAlterTableStmtIndexNames(AlterTableStmt *alterTableStatement)
|
||||||
|
|
||||||
List *commandList = alterTableStatement->cmds;
|
List *commandList = alterTableStatement->cmds;
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
|
|
||||||
|
@ -3165,7 +3154,7 @@ ErrorIfUnsupportedConstraint(Relation relation, char distributionMethod,
|
||||||
List *indexOidList = RelationGetIndexList(relation);
|
List *indexOidList = RelationGetIndexList(relation);
|
||||||
|
|
||||||
Oid indexOid = InvalidOid;
|
Oid indexOid = InvalidOid;
|
||||||
foreach_oid(indexOid, indexOidList)
|
foreach_declared_oid(indexOid, indexOidList)
|
||||||
{
|
{
|
||||||
Relation indexDesc = index_open(indexOid, RowExclusiveLock);
|
Relation indexDesc = index_open(indexOid, RowExclusiveLock);
|
||||||
bool hasDistributionColumn = false;
|
bool hasDistributionColumn = false;
|
||||||
|
@ -3310,7 +3299,7 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement)
|
||||||
|
|
||||||
/* error out if any of the subcommands are unsupported */
|
/* error out if any of the subcommands are unsupported */
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
|
|
||||||
|
@ -3385,7 +3374,7 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement)
|
||||||
|
|
||||||
|
|
||||||
Constraint *columnConstraint = NULL;
|
Constraint *columnConstraint = NULL;
|
||||||
foreach_ptr(columnConstraint, column->constraints)
|
foreach_declared_ptr(columnConstraint, column->constraints)
|
||||||
{
|
{
|
||||||
if (columnConstraint->contype == CONSTR_IDENTITY)
|
if (columnConstraint->contype == CONSTR_IDENTITY)
|
||||||
{
|
{
|
||||||
|
@ -3417,7 +3406,7 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement)
|
||||||
List *columnConstraints = column->constraints;
|
List *columnConstraints = column->constraints;
|
||||||
|
|
||||||
Constraint *constraint = NULL;
|
Constraint *constraint = NULL;
|
||||||
foreach_ptr(constraint, columnConstraints)
|
foreach_declared_ptr(constraint, columnConstraints)
|
||||||
{
|
{
|
||||||
if (constraint->contype == CONSTR_DEFAULT)
|
if (constraint->contype == CONSTR_DEFAULT)
|
||||||
{
|
{
|
||||||
|
@ -3664,9 +3653,36 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
#if PG_VERSION_NUM >= PG_VERSION_17
|
||||||
case AT_SetAccessMethod:
|
case AT_SetExpression:
|
||||||
|
{
|
||||||
|
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
errmsg(
|
||||||
|
"ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION commands "
|
||||||
|
"are currently unsupported.")));
|
||||||
|
break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
case AT_SetAccessMethod:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* If command->name == NULL, that means the user is trying to use
|
||||||
|
* ALTER TABLE ... SET ACCESS METHOD DEFAULT
|
||||||
|
* which we don't support currently.
|
||||||
|
*/
|
||||||
|
if (command->name == NULL)
|
||||||
|
{
|
||||||
|
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
errmsg(
|
||||||
|
"DEFAULT option in ALTER TABLE ... SET ACCESS METHOD "
|
||||||
|
"is currently unsupported."),
|
||||||
|
errhint(
|
||||||
|
"You can rerun the command by explicitly writing the access method name.")));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case AT_SetNotNull:
|
case AT_SetNotNull:
|
||||||
case AT_ReplicaIdentity:
|
case AT_ReplicaIdentity:
|
||||||
case AT_ChangeOwner:
|
case AT_ChangeOwner:
|
||||||
|
@ -3770,7 +3786,7 @@ SetupExecutionModeForAlterTable(Oid relationId, AlterTableCmd *command)
|
||||||
List *columnConstraints = columnDefinition->constraints;
|
List *columnConstraints = columnDefinition->constraints;
|
||||||
|
|
||||||
Constraint *constraint = NULL;
|
Constraint *constraint = NULL;
|
||||||
foreach_ptr(constraint, columnConstraints)
|
foreach_declared_ptr(constraint, columnConstraints)
|
||||||
{
|
{
|
||||||
if (constraint->contype == CONSTR_FOREIGN)
|
if (constraint->contype == CONSTR_FOREIGN)
|
||||||
{
|
{
|
||||||
|
@ -3970,10 +3986,10 @@ SetInterShardDDLTaskPlacementList(Task *task, ShardInterval *leftShardInterval,
|
||||||
List *intersectedPlacementList = NIL;
|
List *intersectedPlacementList = NIL;
|
||||||
|
|
||||||
ShardPlacement *leftShardPlacement = NULL;
|
ShardPlacement *leftShardPlacement = NULL;
|
||||||
foreach_ptr(leftShardPlacement, leftShardPlacementList)
|
foreach_declared_ptr(leftShardPlacement, leftShardPlacementList)
|
||||||
{
|
{
|
||||||
ShardPlacement *rightShardPlacement = NULL;
|
ShardPlacement *rightShardPlacement = NULL;
|
||||||
foreach_ptr(rightShardPlacement, rightShardPlacementList)
|
foreach_declared_ptr(rightShardPlacement, rightShardPlacementList)
|
||||||
{
|
{
|
||||||
if (leftShardPlacement->nodeId == rightShardPlacement->nodeId)
|
if (leftShardPlacement->nodeId == rightShardPlacement->nodeId)
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,9 +57,6 @@ static void ExtractDropStmtTriggerAndRelationName(DropStmt *dropTriggerStmt,
|
||||||
static void ErrorIfDropStmtDropsMultipleTriggers(DropStmt *dropTriggerStmt);
|
static void ErrorIfDropStmtDropsMultipleTriggers(DropStmt *dropTriggerStmt);
|
||||||
static char * GetTriggerNameById(Oid triggerId);
|
static char * GetTriggerNameById(Oid triggerId);
|
||||||
static int16 GetTriggerTypeById(Oid triggerId);
|
static int16 GetTriggerTypeById(Oid triggerId);
|
||||||
#if (PG_VERSION_NUM < PG_VERSION_15)
|
|
||||||
static void ErrorOutIfCloneTrigger(Oid tgrelid, const char *tgname);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* GUC that overrides trigger checks for distributed tables and reference tables */
|
/* GUC that overrides trigger checks for distributed tables and reference tables */
|
||||||
|
@ -81,7 +78,7 @@ GetExplicitTriggerCommandList(Oid relationId)
|
||||||
List *triggerIdList = GetExplicitTriggerIdList(relationId);
|
List *triggerIdList = GetExplicitTriggerIdList(relationId);
|
||||||
|
|
||||||
Oid triggerId = InvalidOid;
|
Oid triggerId = InvalidOid;
|
||||||
foreach_oid(triggerId, triggerIdList)
|
foreach_declared_oid(triggerId, triggerIdList)
|
||||||
{
|
{
|
||||||
bool prettyOutput = false;
|
bool prettyOutput = false;
|
||||||
Datum commandText = DirectFunctionCall2(pg_get_triggerdef_ext,
|
Datum commandText = DirectFunctionCall2(pg_get_triggerdef_ext,
|
||||||
|
@ -404,40 +401,6 @@ CreateTriggerEventExtendNames(CreateTrigStmt *createTriggerStmt, char *schemaNam
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PreprocessAlterTriggerRenameStmt is called before a ALTER TRIGGER RENAME
|
|
||||||
* command has been executed by standard process utility. This function errors
|
|
||||||
* out if we are trying to rename a child trigger on a partition of a distributed
|
|
||||||
* table. In PG15, this is not allowed anyway.
|
|
||||||
*/
|
|
||||||
List *
|
|
||||||
PreprocessAlterTriggerRenameStmt(Node *node, const char *queryString,
|
|
||||||
ProcessUtilityContext processUtilityContext)
|
|
||||||
{
|
|
||||||
#if (PG_VERSION_NUM < PG_VERSION_15)
|
|
||||||
RenameStmt *renameTriggerStmt = castNode(RenameStmt, node);
|
|
||||||
Assert(renameTriggerStmt->renameType == OBJECT_TRIGGER);
|
|
||||||
|
|
||||||
RangeVar *relation = renameTriggerStmt->relation;
|
|
||||||
|
|
||||||
bool missingOk = false;
|
|
||||||
Oid relationId = RangeVarGetRelid(relation, ALTER_TRIGGER_LOCK_MODE, missingOk);
|
|
||||||
|
|
||||||
if (!IsCitusTable(relationId))
|
|
||||||
{
|
|
||||||
return NIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EnsureCoordinator();
|
|
||||||
ErrorOutForTriggerIfNotSupported(relationId);
|
|
||||||
|
|
||||||
ErrorOutIfCloneTrigger(relationId, renameTriggerStmt->subname);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return NIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PostprocessAlterTriggerRenameStmt is called after a ALTER TRIGGER RENAME
|
* PostprocessAlterTriggerRenameStmt is called after a ALTER TRIGGER RENAME
|
||||||
* command has been executed by standard process utility. This function errors
|
* command has been executed by standard process utility. This function errors
|
||||||
|
@ -742,7 +705,7 @@ ErrorIfRelationHasUnsupportedTrigger(Oid relationId)
|
||||||
List *relationTriggerList = GetExplicitTriggerIdList(relationId);
|
List *relationTriggerList = GetExplicitTriggerIdList(relationId);
|
||||||
|
|
||||||
Oid triggerId = InvalidOid;
|
Oid triggerId = InvalidOid;
|
||||||
foreach_oid(triggerId, relationTriggerList)
|
foreach_declared_oid(triggerId, relationTriggerList)
|
||||||
{
|
{
|
||||||
ObjectAddress triggerObjectAddress = InvalidObjectAddress;
|
ObjectAddress triggerObjectAddress = InvalidObjectAddress;
|
||||||
ObjectAddressSet(triggerObjectAddress, TriggerRelationId, triggerId);
|
ObjectAddressSet(triggerObjectAddress, TriggerRelationId, triggerId);
|
||||||
|
@ -759,64 +722,6 @@ ErrorIfRelationHasUnsupportedTrigger(Oid relationId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM < PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ErrorOutIfCloneTrigger is a helper function to error
|
|
||||||
* out if we are trying to rename a child trigger on a
|
|
||||||
* partition of a distributed table.
|
|
||||||
* A lot of this code is borrowed from PG15 because
|
|
||||||
* renaming clone triggers isn't allowed in PG15 anymore.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
ErrorOutIfCloneTrigger(Oid tgrelid, const char *tgname)
|
|
||||||
{
|
|
||||||
HeapTuple tuple;
|
|
||||||
ScanKeyData key[2];
|
|
||||||
|
|
||||||
Relation tgrel = table_open(TriggerRelationId, RowExclusiveLock);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Search for the trigger to modify.
|
|
||||||
*/
|
|
||||||
ScanKeyInit(&key[0],
|
|
||||||
Anum_pg_trigger_tgrelid,
|
|
||||||
BTEqualStrategyNumber, F_OIDEQ,
|
|
||||||
ObjectIdGetDatum(tgrelid));
|
|
||||||
ScanKeyInit(&key[1],
|
|
||||||
Anum_pg_trigger_tgname,
|
|
||||||
BTEqualStrategyNumber, F_NAMEEQ,
|
|
||||||
CStringGetDatum(tgname));
|
|
||||||
SysScanDesc tgscan = systable_beginscan(tgrel, TriggerRelidNameIndexId, true,
|
|
||||||
NULL, 2, key);
|
|
||||||
|
|
||||||
if (HeapTupleIsValid(tuple = systable_getnext(tgscan)))
|
|
||||||
{
|
|
||||||
Form_pg_trigger trigform = (Form_pg_trigger) GETSTRUCT(tuple);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the trigger descends from a trigger on a parent partitioned
|
|
||||||
* table, reject the rename.
|
|
||||||
* Appended shard ids to find the trigger on the partition's shards
|
|
||||||
* are not correct. Hence we would fail to find the trigger on the
|
|
||||||
* partition's shard.
|
|
||||||
*/
|
|
||||||
if (OidIsValid(trigform->tgparentid))
|
|
||||||
{
|
|
||||||
ereport(ERROR, (
|
|
||||||
errmsg(
|
|
||||||
"cannot rename child triggers on distributed partitions")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
systable_endscan(tgscan);
|
|
||||||
table_close(tgrel, RowExclusiveLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GetDropTriggerStmtRelation takes a DropStmt for a trigger object and returns
|
* GetDropTriggerStmtRelation takes a DropStmt for a trigger object and returns
|
||||||
* RangeVar for the relation that owns the trigger.
|
* RangeVar for the relation that owns the trigger.
|
||||||
|
|
|
@ -135,7 +135,7 @@ TruncateTaskList(Oid relationId)
|
||||||
LockShardListMetadata(shardIntervalList, ShareLock);
|
LockShardListMetadata(shardIntervalList, ShareLock);
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
char *shardRelationName = pstrdup(relationName);
|
char *shardRelationName = pstrdup(relationName);
|
||||||
|
@ -264,7 +264,7 @@ ErrorIfUnsupportedTruncateStmt(TruncateStmt *truncateStatement)
|
||||||
{
|
{
|
||||||
List *relationList = truncateStatement->relations;
|
List *relationList = truncateStatement->relations;
|
||||||
RangeVar *rangeVar = NULL;
|
RangeVar *rangeVar = NULL;
|
||||||
foreach_ptr(rangeVar, relationList)
|
foreach_declared_ptr(rangeVar, relationList)
|
||||||
{
|
{
|
||||||
Oid relationId = RangeVarGetRelid(rangeVar, NoLock, false);
|
Oid relationId = RangeVarGetRelid(rangeVar, NoLock, false);
|
||||||
|
|
||||||
|
@ -294,7 +294,7 @@ static void
|
||||||
EnsurePartitionTableNotReplicatedForTruncate(TruncateStmt *truncateStatement)
|
EnsurePartitionTableNotReplicatedForTruncate(TruncateStmt *truncateStatement)
|
||||||
{
|
{
|
||||||
RangeVar *rangeVar = NULL;
|
RangeVar *rangeVar = NULL;
|
||||||
foreach_ptr(rangeVar, truncateStatement->relations)
|
foreach_declared_ptr(rangeVar, truncateStatement->relations)
|
||||||
{
|
{
|
||||||
Oid relationId = RangeVarGetRelid(rangeVar, NoLock, false);
|
Oid relationId = RangeVarGetRelid(rangeVar, NoLock, false);
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ ExecuteTruncateStmtSequentialIfNecessary(TruncateStmt *command)
|
||||||
bool failOK = false;
|
bool failOK = false;
|
||||||
|
|
||||||
RangeVar *rangeVar = NULL;
|
RangeVar *rangeVar = NULL;
|
||||||
foreach_ptr(rangeVar, relationList)
|
foreach_declared_ptr(rangeVar, relationList)
|
||||||
{
|
{
|
||||||
Oid relationId = RangeVarGetRelid(rangeVar, NoLock, failOK);
|
Oid relationId = RangeVarGetRelid(rangeVar, NoLock, failOK);
|
||||||
|
|
||||||
|
|
|
@ -454,7 +454,7 @@ citus_ProcessUtilityInternal(PlannedStmt *pstmt,
|
||||||
bool analyze = false;
|
bool analyze = false;
|
||||||
|
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, explainStmt->options)
|
foreach_declared_ptr(option, explainStmt->options)
|
||||||
{
|
{
|
||||||
if (strcmp(option->defname, "analyze") == 0)
|
if (strcmp(option->defname, "analyze") == 0)
|
||||||
{
|
{
|
||||||
|
@ -695,7 +695,7 @@ citus_ProcessUtilityInternal(PlannedStmt *pstmt,
|
||||||
{
|
{
|
||||||
AlterTableStmt *alterTableStmt = (AlterTableStmt *) parsetree;
|
AlterTableStmt *alterTableStmt = (AlterTableStmt *) parsetree;
|
||||||
AlterTableCmd *command = NULL;
|
AlterTableCmd *command = NULL;
|
||||||
foreach_ptr(command, alterTableStmt->cmds)
|
foreach_declared_ptr(command, alterTableStmt->cmds)
|
||||||
{
|
{
|
||||||
AlterTableType alterTableType = command->subtype;
|
AlterTableType alterTableType = command->subtype;
|
||||||
|
|
||||||
|
@ -879,7 +879,7 @@ citus_ProcessUtilityInternal(PlannedStmt *pstmt,
|
||||||
}
|
}
|
||||||
|
|
||||||
DDLJob *ddlJob = NULL;
|
DDLJob *ddlJob = NULL;
|
||||||
foreach_ptr(ddlJob, ddlJobs)
|
foreach_declared_ptr(ddlJob, ddlJobs)
|
||||||
{
|
{
|
||||||
ExecuteDistributedDDLJob(ddlJob);
|
ExecuteDistributedDDLJob(ddlJob);
|
||||||
}
|
}
|
||||||
|
@ -939,7 +939,7 @@ citus_ProcessUtilityInternal(PlannedStmt *pstmt,
|
||||||
{
|
{
|
||||||
List *addresses = GetObjectAddressListFromParseTree(parsetree, false, true);
|
List *addresses = GetObjectAddressListFromParseTree(parsetree, false, true);
|
||||||
ObjectAddress *address = NULL;
|
ObjectAddress *address = NULL;
|
||||||
foreach_ptr(address, addresses)
|
foreach_declared_ptr(address, addresses)
|
||||||
{
|
{
|
||||||
MarkObjectDistributed(address);
|
MarkObjectDistributed(address);
|
||||||
TrackPropagatedObject(address);
|
TrackPropagatedObject(address);
|
||||||
|
@ -962,7 +962,7 @@ UndistributeDisconnectedCitusLocalTables(void)
|
||||||
citusLocalTableIdList = SortList(citusLocalTableIdList, CompareOids);
|
citusLocalTableIdList = SortList(citusLocalTableIdList, CompareOids);
|
||||||
|
|
||||||
Oid citusLocalTableId = InvalidOid;
|
Oid citusLocalTableId = InvalidOid;
|
||||||
foreach_oid(citusLocalTableId, citusLocalTableIdList)
|
foreach_declared_oid(citusLocalTableId, citusLocalTableIdList)
|
||||||
{
|
{
|
||||||
/* acquire ShareRowExclusiveLock to prevent concurrent foreign key creation */
|
/* acquire ShareRowExclusiveLock to prevent concurrent foreign key creation */
|
||||||
LOCKMODE lockMode = ShareRowExclusiveLock;
|
LOCKMODE lockMode = ShareRowExclusiveLock;
|
||||||
|
@ -1349,7 +1349,7 @@ CurrentSearchPath(void)
|
||||||
bool schemaAdded = false;
|
bool schemaAdded = false;
|
||||||
|
|
||||||
Oid searchPathOid = InvalidOid;
|
Oid searchPathOid = InvalidOid;
|
||||||
foreach_oid(searchPathOid, searchPathList)
|
foreach_declared_oid(searchPathOid, searchPathList)
|
||||||
{
|
{
|
||||||
char *schemaName = get_namespace_name(searchPathOid);
|
char *schemaName = get_namespace_name(searchPathOid);
|
||||||
|
|
||||||
|
@ -1483,7 +1483,7 @@ DDLTaskList(Oid relationId, const char *commandString)
|
||||||
LockShardListMetadata(shardIntervalList, ShareLock);
|
LockShardListMetadata(shardIntervalList, ShareLock);
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
StringInfo applyCommand = makeStringInfo();
|
StringInfo applyCommand = makeStringInfo();
|
||||||
|
@ -1525,10 +1525,10 @@ NontransactionalNodeDDLTaskList(TargetWorkerSet targets, List *commands,
|
||||||
{
|
{
|
||||||
List *ddlJobs = NodeDDLTaskList(targets, commands);
|
List *ddlJobs = NodeDDLTaskList(targets, commands);
|
||||||
DDLJob *ddlJob = NULL;
|
DDLJob *ddlJob = NULL;
|
||||||
foreach_ptr(ddlJob, ddlJobs)
|
foreach_declared_ptr(ddlJob, ddlJobs)
|
||||||
{
|
{
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, ddlJob->taskList)
|
foreach_declared_ptr(task, ddlJob->taskList)
|
||||||
{
|
{
|
||||||
task->cannotBeExecutedInTransaction = true;
|
task->cannotBeExecutedInTransaction = true;
|
||||||
}
|
}
|
||||||
|
@ -1564,7 +1564,7 @@ NodeDDLTaskList(TargetWorkerSet targets, List *commands)
|
||||||
SetTaskQueryStringList(task, commands);
|
SetTaskQueryStringList(task, commands);
|
||||||
|
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodes)
|
foreach_declared_ptr(workerNode, workerNodes)
|
||||||
{
|
{
|
||||||
ShardPlacement *targetPlacement = CitusMakeNode(ShardPlacement);
|
ShardPlacement *targetPlacement = CitusMakeNode(ShardPlacement);
|
||||||
targetPlacement->nodeName = workerNode->workerName;
|
targetPlacement->nodeName = workerNode->workerName;
|
||||||
|
|
|
@ -135,7 +135,7 @@ VacuumRelationIdList(VacuumStmt *vacuumStmt, CitusVacuumParams vacuumParams)
|
||||||
List *relationIdList = NIL;
|
List *relationIdList = NIL;
|
||||||
|
|
||||||
RangeVar *vacuumRelation = NULL;
|
RangeVar *vacuumRelation = NULL;
|
||||||
foreach_ptr(vacuumRelation, vacuumRelationList)
|
foreach_declared_ptr(vacuumRelation, vacuumRelationList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* If skip_locked option is enabled, we are skipping that relation
|
* If skip_locked option is enabled, we are skipping that relation
|
||||||
|
@ -164,7 +164,7 @@ static bool
|
||||||
IsDistributedVacuumStmt(List *vacuumRelationIdList)
|
IsDistributedVacuumStmt(List *vacuumRelationIdList)
|
||||||
{
|
{
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, vacuumRelationIdList)
|
foreach_declared_oid(relationId, vacuumRelationIdList)
|
||||||
{
|
{
|
||||||
if (OidIsValid(relationId) && IsCitusTable(relationId))
|
if (OidIsValid(relationId) && IsCitusTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -187,7 +187,7 @@ ExecuteVacuumOnDistributedTables(VacuumStmt *vacuumStmt, List *relationIdList,
|
||||||
int relationIndex = 0;
|
int relationIndex = 0;
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
if (IsCitusTable(relationId))
|
if (IsCitusTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -252,7 +252,7 @@ VacuumTaskList(Oid relationId, CitusVacuumParams vacuumParams, List *vacuumColum
|
||||||
LockShardListMetadata(shardIntervalList, ShareLock);
|
LockShardListMetadata(shardIntervalList, ShareLock);
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
char *shardRelationName = pstrdup(relationName);
|
char *shardRelationName = pstrdup(relationName);
|
||||||
|
@ -473,7 +473,7 @@ DeparseVacuumColumnNames(List *columnNameList)
|
||||||
appendStringInfoString(columnNames, " (");
|
appendStringInfoString(columnNames, " (");
|
||||||
|
|
||||||
String *columnName = NULL;
|
String *columnName = NULL;
|
||||||
foreach_ptr(columnName, columnNameList)
|
foreach_declared_ptr(columnName, columnNameList)
|
||||||
{
|
{
|
||||||
appendStringInfo(columnNames, "%s,", strVal(columnName));
|
appendStringInfo(columnNames, "%s,", strVal(columnName));
|
||||||
}
|
}
|
||||||
|
@ -508,7 +508,7 @@ ExtractVacuumTargetRels(VacuumStmt *vacuumStmt)
|
||||||
List *vacuumList = NIL;
|
List *vacuumList = NIL;
|
||||||
|
|
||||||
VacuumRelation *vacuumRelation = NULL;
|
VacuumRelation *vacuumRelation = NULL;
|
||||||
foreach_ptr(vacuumRelation, vacuumStmt->rels)
|
foreach_declared_ptr(vacuumRelation, vacuumStmt->rels)
|
||||||
{
|
{
|
||||||
vacuumList = lappend(vacuumList, vacuumRelation->relation);
|
vacuumList = lappend(vacuumList, vacuumRelation->relation);
|
||||||
}
|
}
|
||||||
|
@ -552,7 +552,7 @@ VacuumStmtParams(VacuumStmt *vacstmt)
|
||||||
|
|
||||||
/* Parse options list */
|
/* Parse options list */
|
||||||
DefElem *opt = NULL;
|
DefElem *opt = NULL;
|
||||||
foreach_ptr(opt, vacstmt->options)
|
foreach_declared_ptr(opt, vacstmt->options)
|
||||||
{
|
{
|
||||||
/* Parse common options for VACUUM and ANALYZE */
|
/* Parse common options for VACUUM and ANALYZE */
|
||||||
if (strcmp(opt->defname, "verbose") == 0)
|
if (strcmp(opt->defname, "verbose") == 0)
|
||||||
|
@ -725,7 +725,7 @@ ExecuteUnqualifiedVacuumTasks(VacuumStmt *vacuumStmt, CitusVacuumParams vacuumPa
|
||||||
int32 localNodeGroupId = GetLocalGroupId();
|
int32 localNodeGroupId = GetLocalGroupId();
|
||||||
|
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodes)
|
foreach_declared_ptr(workerNode, workerNodes)
|
||||||
{
|
{
|
||||||
if (workerNode->groupId != localNodeGroupId)
|
if (workerNode->groupId != localNodeGroupId)
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,7 +69,7 @@ ViewHasDistributedRelationDependency(ObjectAddress *viewObjectAddress)
|
||||||
List *dependencies = GetAllDependenciesForObject(viewObjectAddress);
|
List *dependencies = GetAllDependenciesForObject(viewObjectAddress);
|
||||||
ObjectAddress *dependency = NULL;
|
ObjectAddress *dependency = NULL;
|
||||||
|
|
||||||
foreach_ptr(dependency, dependencies)
|
foreach_declared_ptr(dependency, dependencies)
|
||||||
{
|
{
|
||||||
if (dependency->classId == RelationRelationId && IsAnyObjectDistributed(
|
if (dependency->classId == RelationRelationId && IsAnyObjectDistributed(
|
||||||
list_make1(dependency)))
|
list_make1(dependency)))
|
||||||
|
@ -304,7 +304,7 @@ DropViewStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess)
|
||||||
List *objectAddresses = NIL;
|
List *objectAddresses = NIL;
|
||||||
|
|
||||||
List *possiblyQualifiedViewName = NULL;
|
List *possiblyQualifiedViewName = NULL;
|
||||||
foreach_ptr(possiblyQualifiedViewName, dropStmt->objects)
|
foreach_declared_ptr(possiblyQualifiedViewName, dropStmt->objects)
|
||||||
{
|
{
|
||||||
RangeVar *viewRangeVar = makeRangeVarFromNameList(possiblyQualifiedViewName);
|
RangeVar *viewRangeVar = makeRangeVarFromNameList(possiblyQualifiedViewName);
|
||||||
Oid viewOid = RangeVarGetRelid(viewRangeVar, AccessShareLock,
|
Oid viewOid = RangeVarGetRelid(viewRangeVar, AccessShareLock,
|
||||||
|
@ -332,7 +332,7 @@ FilterNameListForDistributedViews(List *viewNamesList, bool missing_ok)
|
||||||
List *distributedViewNames = NIL;
|
List *distributedViewNames = NIL;
|
||||||
|
|
||||||
List *possiblyQualifiedViewName = NULL;
|
List *possiblyQualifiedViewName = NULL;
|
||||||
foreach_ptr(possiblyQualifiedViewName, viewNamesList)
|
foreach_declared_ptr(possiblyQualifiedViewName, viewNamesList)
|
||||||
{
|
{
|
||||||
char *viewName = NULL;
|
char *viewName = NULL;
|
||||||
char *schemaName = NULL;
|
char *schemaName = NULL;
|
||||||
|
|
|
@ -866,7 +866,8 @@ WaitEventSetFromMultiConnectionStates(List *connections, int *waitCount)
|
||||||
*waitCount = 0;
|
*waitCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
WaitEventSet *waitEventSet = CreateWaitEventSet(CurrentMemoryContext, eventSetSize);
|
WaitEventSet *waitEventSet = CreateWaitEventSet(WaitEventSetTracker_compat,
|
||||||
|
eventSetSize);
|
||||||
EnsureReleaseResource((MemoryContextCallbackFunction) (&FreeWaitEventSet),
|
EnsureReleaseResource((MemoryContextCallbackFunction) (&FreeWaitEventSet),
|
||||||
waitEventSet);
|
waitEventSet);
|
||||||
|
|
||||||
|
@ -879,7 +880,7 @@ WaitEventSetFromMultiConnectionStates(List *connections, int *waitCount)
|
||||||
numEventsAdded += 2;
|
numEventsAdded += 2;
|
||||||
|
|
||||||
MultiConnectionPollState *connectionState = NULL;
|
MultiConnectionPollState *connectionState = NULL;
|
||||||
foreach_ptr(connectionState, connections)
|
foreach_declared_ptr(connectionState, connections)
|
||||||
{
|
{
|
||||||
if (numEventsAdded >= eventSetSize)
|
if (numEventsAdded >= eventSetSize)
|
||||||
{
|
{
|
||||||
|
@ -961,7 +962,7 @@ FinishConnectionListEstablishment(List *multiConnectionList)
|
||||||
int waitCount = 0;
|
int waitCount = 0;
|
||||||
|
|
||||||
MultiConnection *connection = NULL;
|
MultiConnection *connection = NULL;
|
||||||
foreach_ptr(connection, multiConnectionList)
|
foreach_declared_ptr(connection, multiConnectionList)
|
||||||
{
|
{
|
||||||
MultiConnectionPollState *connectionState =
|
MultiConnectionPollState *connectionState =
|
||||||
palloc0(sizeof(MultiConnectionPollState));
|
palloc0(sizeof(MultiConnectionPollState));
|
||||||
|
@ -1160,7 +1161,7 @@ static void
|
||||||
CloseNotReadyMultiConnectionStates(List *connectionStates)
|
CloseNotReadyMultiConnectionStates(List *connectionStates)
|
||||||
{
|
{
|
||||||
MultiConnectionPollState *connectionState = NULL;
|
MultiConnectionPollState *connectionState = NULL;
|
||||||
foreach_ptr(connectionState, connectionStates)
|
foreach_declared_ptr(connectionState, connectionStates)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = connectionState->connection;
|
MultiConnection *connection = connectionState->connection;
|
||||||
|
|
||||||
|
|
|
@ -360,7 +360,7 @@ EnsureConnectionPossibilityForNodeList(List *nodeList)
|
||||||
nodeList = SortList(nodeList, CompareWorkerNodes);
|
nodeList = SortList(nodeList, CompareWorkerNodes);
|
||||||
|
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, nodeList)
|
foreach_declared_ptr(workerNode, nodeList)
|
||||||
{
|
{
|
||||||
bool waitForConnection = true;
|
bool waitForConnection = true;
|
||||||
EnsureConnectionPossibilityForNode(workerNode, waitForConnection);
|
EnsureConnectionPossibilityForNode(workerNode, waitForConnection);
|
||||||
|
|
|
@ -370,7 +370,7 @@ AssignPlacementListToConnection(List *placementAccessList, MultiConnection *conn
|
||||||
const char *userName = connection->user;
|
const char *userName = connection->user;
|
||||||
|
|
||||||
ShardPlacementAccess *placementAccess = NULL;
|
ShardPlacementAccess *placementAccess = NULL;
|
||||||
foreach_ptr(placementAccess, placementAccessList)
|
foreach_declared_ptr(placementAccess, placementAccessList)
|
||||||
{
|
{
|
||||||
ShardPlacement *placement = placementAccess->placement;
|
ShardPlacement *placement = placementAccess->placement;
|
||||||
ShardPlacementAccessType accessType = placementAccess->accessType;
|
ShardPlacementAccessType accessType = placementAccess->accessType;
|
||||||
|
@ -533,7 +533,7 @@ FindPlacementListConnection(int flags, List *placementAccessList, const char *us
|
||||||
* suitable connection found for a placement in the placementAccessList.
|
* suitable connection found for a placement in the placementAccessList.
|
||||||
*/
|
*/
|
||||||
ShardPlacementAccess *placementAccess = NULL;
|
ShardPlacementAccess *placementAccess = NULL;
|
||||||
foreach_ptr(placementAccess, placementAccessList)
|
foreach_declared_ptr(placementAccess, placementAccessList)
|
||||||
{
|
{
|
||||||
ShardPlacement *placement = placementAccess->placement;
|
ShardPlacement *placement = placementAccess->placement;
|
||||||
ShardPlacementAccessType accessType = placementAccess->accessType;
|
ShardPlacementAccessType accessType = placementAccess->accessType;
|
||||||
|
|
|
@ -392,7 +392,7 @@ void
|
||||||
ExecuteCriticalRemoteCommandList(MultiConnection *connection, List *commandList)
|
ExecuteCriticalRemoteCommandList(MultiConnection *connection, List *commandList)
|
||||||
{
|
{
|
||||||
const char *command = NULL;
|
const char *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
ExecuteCriticalRemoteCommand(connection, command);
|
ExecuteCriticalRemoteCommand(connection, command);
|
||||||
}
|
}
|
||||||
|
@ -435,7 +435,7 @@ ExecuteRemoteCommandInConnectionList(List *nodeConnectionList, const char *comma
|
||||||
{
|
{
|
||||||
MultiConnection *connection = NULL;
|
MultiConnection *connection = NULL;
|
||||||
|
|
||||||
foreach_ptr(connection, nodeConnectionList)
|
foreach_declared_ptr(connection, nodeConnectionList)
|
||||||
{
|
{
|
||||||
int querySent = SendRemoteCommand(connection, command);
|
int querySent = SendRemoteCommand(connection, command);
|
||||||
|
|
||||||
|
@ -446,7 +446,7 @@ ExecuteRemoteCommandInConnectionList(List *nodeConnectionList, const char *comma
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Process the result */
|
/* Process the result */
|
||||||
foreach_ptr(connection, nodeConnectionList)
|
foreach_declared_ptr(connection, nodeConnectionList)
|
||||||
{
|
{
|
||||||
bool raiseInterrupts = true;
|
bool raiseInterrupts = true;
|
||||||
PGresult *result = GetRemoteCommandResult(connection, raiseInterrupts);
|
PGresult *result = GetRemoteCommandResult(connection, raiseInterrupts);
|
||||||
|
@ -887,7 +887,7 @@ WaitForAllConnections(List *connectionList, bool raiseInterrupts)
|
||||||
|
|
||||||
/* convert connection list to an array such that we can move items around */
|
/* convert connection list to an array such that we can move items around */
|
||||||
MultiConnection *connectionItem = NULL;
|
MultiConnection *connectionItem = NULL;
|
||||||
foreach_ptr(connectionItem, connectionList)
|
foreach_declared_ptr(connectionItem, connectionList)
|
||||||
{
|
{
|
||||||
allConnections[connectionIndex] = connectionItem;
|
allConnections[connectionIndex] = connectionItem;
|
||||||
connectionReady[connectionIndex] = false;
|
connectionReady[connectionIndex] = false;
|
||||||
|
@ -1130,7 +1130,7 @@ BuildWaitEventSet(MultiConnection **allConnections, int totalConnectionCount,
|
||||||
|
|
||||||
/* allocate pending connections + 2 for the signal latch and postmaster death */
|
/* allocate pending connections + 2 for the signal latch and postmaster death */
|
||||||
/* (CreateWaitEventSet makes room for pgwin32_signal_event automatically) */
|
/* (CreateWaitEventSet makes room for pgwin32_signal_event automatically) */
|
||||||
WaitEventSet *waitEventSet = CreateWaitEventSet(CurrentMemoryContext,
|
WaitEventSet *waitEventSet = CreateWaitEventSet(WaitEventSetTracker_compat,
|
||||||
pendingConnectionCount + 2);
|
pendingConnectionCount + 2);
|
||||||
|
|
||||||
for (int connectionIndex = 0; connectionIndex < pendingConnectionCount;
|
for (int connectionIndex = 0; connectionIndex < pendingConnectionCount;
|
||||||
|
|
|
@ -614,16 +614,6 @@ WaitForSharedConnection(void)
|
||||||
void
|
void
|
||||||
InitializeSharedConnectionStats(void)
|
InitializeSharedConnectionStats(void)
|
||||||
{
|
{
|
||||||
/* on PG 15, we use shmem_request_hook_type */
|
|
||||||
#if PG_VERSION_NUM < PG_VERSION_15
|
|
||||||
|
|
||||||
/* allocate shared memory */
|
|
||||||
if (!IsUnderPostmaster)
|
|
||||||
{
|
|
||||||
RequestAddinShmemSpace(SharedConnectionStatsShmemSize());
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
prev_shmem_startup_hook = shmem_startup_hook;
|
prev_shmem_startup_hook = shmem_startup_hook;
|
||||||
shmem_startup_hook = SharedConnectionStatsShmemInit;
|
shmem_startup_hook = SharedConnectionStatsShmemInit;
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,10 +258,8 @@ pg_get_sequencedef_string(Oid sequenceRelationId)
|
||||||
char *typeName = format_type_be(pgSequenceForm->seqtypid);
|
char *typeName = format_type_be(pgSequenceForm->seqtypid);
|
||||||
|
|
||||||
char *sequenceDef = psprintf(CREATE_SEQUENCE_COMMAND,
|
char *sequenceDef = psprintf(CREATE_SEQUENCE_COMMAND,
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
get_rel_persistence(sequenceRelationId) ==
|
get_rel_persistence(sequenceRelationId) ==
|
||||||
RELPERSISTENCE_UNLOGGED ? "UNLOGGED " : "",
|
RELPERSISTENCE_UNLOGGED ? "UNLOGGED " : "",
|
||||||
#endif
|
|
||||||
qualifiedSequenceName,
|
qualifiedSequenceName,
|
||||||
typeName,
|
typeName,
|
||||||
pgSequenceForm->seqincrement, pgSequenceForm->seqmin,
|
pgSequenceForm->seqincrement, pgSequenceForm->seqmin,
|
||||||
|
@ -315,6 +313,7 @@ pg_get_tableschemadef_string(Oid tableRelationId, IncludeSequenceDefaults
|
||||||
AttrNumber defaultValueIndex = 0;
|
AttrNumber defaultValueIndex = 0;
|
||||||
AttrNumber constraintIndex = 0;
|
AttrNumber constraintIndex = 0;
|
||||||
AttrNumber constraintCount = 0;
|
AttrNumber constraintCount = 0;
|
||||||
|
bool relIsPartition = false;
|
||||||
StringInfoData buffer = { NULL, 0, 0, 0 };
|
StringInfoData buffer = { NULL, 0, 0, 0 };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -342,6 +341,8 @@ pg_get_tableschemadef_string(Oid tableRelationId, IncludeSequenceDefaults
|
||||||
}
|
}
|
||||||
|
|
||||||
appendStringInfo(&buffer, "TABLE %s (", relationName);
|
appendStringInfo(&buffer, "TABLE %s (", relationName);
|
||||||
|
|
||||||
|
relIsPartition = relation->rd_rel->relispartition;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -392,10 +393,18 @@ pg_get_tableschemadef_string(Oid tableRelationId, IncludeSequenceDefaults
|
||||||
GetCompressionMethodName(attributeForm->attcompression));
|
GetCompressionMethodName(attributeForm->attcompression));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attributeForm->attidentity && includeIdentityDefaults)
|
/*
|
||||||
|
* If this is an identity column include its identity definition in the
|
||||||
|
* DDL only if its relation is not a partition. If it is a partition, any
|
||||||
|
* identity is inherited from the parent table by ATTACH PARTITION. This
|
||||||
|
* is Postgres 17+ behavior (commit 699586315); prior PG versions did not
|
||||||
|
* support identity columns in partitioned tables.
|
||||||
|
*/
|
||||||
|
if (attributeForm->attidentity && includeIdentityDefaults && !relIsPartition)
|
||||||
{
|
{
|
||||||
bool missing_ok = false;
|
bool missing_ok = false;
|
||||||
Oid seqOid = getIdentitySequence(RelationGetRelid(relation),
|
Oid seqOid = getIdentitySequence(identitySequenceRelation_compat(
|
||||||
|
relation),
|
||||||
attributeForm->attnum, missing_ok);
|
attributeForm->attnum, missing_ok);
|
||||||
|
|
||||||
if (includeIdentityDefaults == INCLUDE_IDENTITY)
|
if (includeIdentityDefaults == INCLUDE_IDENTITY)
|
||||||
|
@ -738,7 +747,18 @@ pg_get_tablecolumnoptionsdef_string(Oid tableRelationId)
|
||||||
* If the user changed the column's statistics target, create
|
* If the user changed the column's statistics target, create
|
||||||
* alter statement and add statement to a list for later processing.
|
* alter statement and add statement to a list for later processing.
|
||||||
*/
|
*/
|
||||||
if (attributeForm->attstattarget >= 0)
|
HeapTuple atttuple = SearchSysCache2(ATTNUM,
|
||||||
|
ObjectIdGetDatum(tableRelationId),
|
||||||
|
Int16GetDatum(attributeForm->attnum));
|
||||||
|
if (!HeapTupleIsValid(atttuple))
|
||||||
|
{
|
||||||
|
elog(ERROR, "cache lookup failed for attribute %d of relation %u",
|
||||||
|
attributeForm->attnum, tableRelationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 targetAttstattarget = getAttstattarget_compat(atttuple);
|
||||||
|
ReleaseSysCache(atttuple);
|
||||||
|
if (targetAttstattarget >= 0)
|
||||||
{
|
{
|
||||||
StringInfoData statement = { NULL, 0, 0, 0 };
|
StringInfoData statement = { NULL, 0, 0, 0 };
|
||||||
initStringInfo(&statement);
|
initStringInfo(&statement);
|
||||||
|
@ -746,7 +766,7 @@ pg_get_tablecolumnoptionsdef_string(Oid tableRelationId)
|
||||||
appendStringInfo(&statement, "ALTER COLUMN %s ",
|
appendStringInfo(&statement, "ALTER COLUMN %s ",
|
||||||
quote_identifier(attributeName));
|
quote_identifier(attributeName));
|
||||||
appendStringInfo(&statement, "SET STATISTICS %d",
|
appendStringInfo(&statement, "SET STATISTICS %d",
|
||||||
attributeForm->attstattarget);
|
targetAttstattarget);
|
||||||
|
|
||||||
columnOptionList = lappend(columnOptionList, statement.data);
|
columnOptionList = lappend(columnOptionList, statement.data);
|
||||||
}
|
}
|
||||||
|
@ -835,12 +855,10 @@ deparse_shard_index_statement(IndexStmt *origStmt, Oid distrelid, int64 shardid,
|
||||||
appendStringInfoString(buffer, ") ");
|
appendStringInfoString(buffer, ") ");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
if (indexStmt->nulls_not_distinct)
|
if (indexStmt->nulls_not_distinct)
|
||||||
{
|
{
|
||||||
appendStringInfoString(buffer, "NULLS NOT DISTINCT ");
|
appendStringInfoString(buffer, "NULLS NOT DISTINCT ");
|
||||||
}
|
}
|
||||||
#endif /* PG_VERSION_15 */
|
|
||||||
|
|
||||||
if (indexStmt->options != NIL)
|
if (indexStmt->options != NIL)
|
||||||
{
|
{
|
||||||
|
@ -938,7 +956,7 @@ bool
|
||||||
IsReindexWithParam_compat(ReindexStmt *reindexStmt, char *param)
|
IsReindexWithParam_compat(ReindexStmt *reindexStmt, char *param)
|
||||||
{
|
{
|
||||||
DefElem *opt = NULL;
|
DefElem *opt = NULL;
|
||||||
foreach_ptr(opt, reindexStmt->params)
|
foreach_declared_ptr(opt, reindexStmt->params)
|
||||||
{
|
{
|
||||||
if (strcmp(opt->defname, param) == 0)
|
if (strcmp(opt->defname, param) == 0)
|
||||||
{
|
{
|
||||||
|
@ -963,7 +981,7 @@ AddVacuumParams(ReindexStmt *reindexStmt, StringInfo buffer)
|
||||||
|
|
||||||
char *tableSpaceName = NULL;
|
char *tableSpaceName = NULL;
|
||||||
DefElem *opt = NULL;
|
DefElem *opt = NULL;
|
||||||
foreach_ptr(opt, reindexStmt->params)
|
foreach_declared_ptr(opt, reindexStmt->params)
|
||||||
{
|
{
|
||||||
if (strcmp(opt->defname, "tablespace") == 0)
|
if (strcmp(opt->defname, "tablespace") == 0)
|
||||||
{
|
{
|
||||||
|
@ -1347,6 +1365,10 @@ convert_aclright_to_string(int aclright)
|
||||||
return "TEMPORARY";
|
return "TEMPORARY";
|
||||||
case ACL_CONNECT:
|
case ACL_CONNECT:
|
||||||
return "CONNECT";
|
return "CONNECT";
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_17
|
||||||
|
case ACL_MAINTAIN:
|
||||||
|
return "MAINTAIN";
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
elog(ERROR, "unrecognized aclright: %d", aclright);
|
elog(ERROR, "unrecognized aclright: %d", aclright);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -47,7 +47,7 @@ DeparseTreeNodes(List *stmts)
|
||||||
{
|
{
|
||||||
List *sqls = NIL;
|
List *sqls = NIL;
|
||||||
Node *stmt = NULL;
|
Node *stmt = NULL;
|
||||||
foreach_ptr(stmt, stmts)
|
foreach_declared_ptr(stmt, stmts)
|
||||||
{
|
{
|
||||||
sqls = lappend(sqls, DeparseTreeNode(stmt));
|
sqls = lappend(sqls, DeparseTreeNode(stmt));
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,7 +174,7 @@ static void
|
||||||
AppendBasicAlterDatabaseOptions(StringInfo buf, AlterDatabaseStmt *stmt)
|
AppendBasicAlterDatabaseOptions(StringInfo buf, AlterDatabaseStmt *stmt)
|
||||||
{
|
{
|
||||||
DefElem *def = NULL;
|
DefElem *def = NULL;
|
||||||
foreach_ptr(def, stmt->options)
|
foreach_declared_ptr(def, stmt->options)
|
||||||
{
|
{
|
||||||
DefElemOptionToStatement(buf, def, alterDatabaseOptionFormats, lengthof(
|
DefElemOptionToStatement(buf, def, alterDatabaseOptionFormats, lengthof(
|
||||||
alterDatabaseOptionFormats));
|
alterDatabaseOptionFormats));
|
||||||
|
@ -211,7 +211,6 @@ DeparseAlterDatabaseStmt(Node *node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
char *
|
char *
|
||||||
DeparseAlterDatabaseRefreshCollStmt(Node *node)
|
DeparseAlterDatabaseRefreshCollStmt(Node *node)
|
||||||
{
|
{
|
||||||
|
@ -228,8 +227,6 @@ DeparseAlterDatabaseRefreshCollStmt(Node *node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
AppendAlterDatabaseSetStmt(StringInfo buf, AlterDatabaseSetStmt *stmt)
|
AppendAlterDatabaseSetStmt(StringInfo buf, AlterDatabaseSetStmt *stmt)
|
||||||
{
|
{
|
||||||
|
@ -290,7 +287,7 @@ AppendCreateDatabaseStmt(StringInfo buf, CreatedbStmt *stmt)
|
||||||
quote_identifier(stmt->dbname));
|
quote_identifier(stmt->dbname));
|
||||||
|
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, stmt->options)
|
foreach_declared_ptr(option, stmt->options)
|
||||||
{
|
{
|
||||||
DefElemOptionToStatement(buf, option, createDatabaseOptionFormats,
|
DefElemOptionToStatement(buf, option, createDatabaseOptionFormats,
|
||||||
lengthof(createDatabaseOptionFormats));
|
lengthof(createDatabaseOptionFormats));
|
||||||
|
|
|
@ -70,7 +70,7 @@ DeparseCreateDomainStmt(Node *node)
|
||||||
}
|
}
|
||||||
|
|
||||||
Constraint *constraint = NULL;
|
Constraint *constraint = NULL;
|
||||||
foreach_ptr(constraint, stmt->constraints)
|
foreach_declared_ptr(constraint, stmt->constraints)
|
||||||
{
|
{
|
||||||
AppendConstraint(&buf, constraint, stmt->domainname, stmt->typeName);
|
AppendConstraint(&buf, constraint, stmt->domainname, stmt->typeName);
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ DeparseDropDomainStmt(Node *node)
|
||||||
|
|
||||||
TypeName *domainName = NULL;
|
TypeName *domainName = NULL;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
foreach_ptr(domainName, stmt->objects)
|
foreach_declared_ptr(domainName, stmt->objects)
|
||||||
{
|
{
|
||||||
if (!first)
|
if (!first)
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,7 +40,7 @@ DefElem *
|
||||||
GetExtensionOption(List *extensionOptions, const char *defname)
|
GetExtensionOption(List *extensionOptions, const char *defname)
|
||||||
{
|
{
|
||||||
DefElem *defElement = NULL;
|
DefElem *defElement = NULL;
|
||||||
foreach_ptr(defElement, extensionOptions)
|
foreach_declared_ptr(defElement, extensionOptions)
|
||||||
{
|
{
|
||||||
if (IsA(defElement, DefElem) &&
|
if (IsA(defElement, DefElem) &&
|
||||||
strncmp(defElement->defname, defname, NAMEDATALEN) == 0)
|
strncmp(defElement->defname, defname, NAMEDATALEN) == 0)
|
||||||
|
@ -112,7 +112,7 @@ AppendCreateExtensionStmtOptions(StringInfo buf, List *options)
|
||||||
|
|
||||||
/* Add the options to the statement */
|
/* Add the options to the statement */
|
||||||
DefElem *defElem = NULL;
|
DefElem *defElem = NULL;
|
||||||
foreach_ptr(defElem, options)
|
foreach_declared_ptr(defElem, options)
|
||||||
{
|
{
|
||||||
if (strcmp(defElem->defname, "schema") == 0)
|
if (strcmp(defElem->defname, "schema") == 0)
|
||||||
{
|
{
|
||||||
|
@ -181,7 +181,7 @@ AppendAlterExtensionStmt(StringInfo buf, AlterExtensionStmt *alterExtensionStmt)
|
||||||
* the options.
|
* the options.
|
||||||
*/
|
*/
|
||||||
DefElem *option = NULL;
|
DefElem *option = NULL;
|
||||||
foreach_ptr(option, optionsList)
|
foreach_declared_ptr(option, optionsList)
|
||||||
{
|
{
|
||||||
if (strcmp(option->defname, "new_version") == 0)
|
if (strcmp(option->defname, "new_version") == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -176,7 +176,7 @@ AppendAlterForeignServerOptions(StringInfo buf, AlterForeignServerStmt *stmt)
|
||||||
|
|
||||||
DefElemAction action = DEFELEM_UNSPEC;
|
DefElemAction action = DEFELEM_UNSPEC;
|
||||||
DefElem *def = NULL;
|
DefElem *def = NULL;
|
||||||
foreach_ptr(def, stmt->options)
|
foreach_declared_ptr(def, stmt->options)
|
||||||
{
|
{
|
||||||
if (def->defaction != DEFELEM_UNSPEC)
|
if (def->defaction != DEFELEM_UNSPEC)
|
||||||
{
|
{
|
||||||
|
@ -242,7 +242,7 @@ static void
|
||||||
AppendServerNames(StringInfo buf, DropStmt *stmt)
|
AppendServerNames(StringInfo buf, DropStmt *stmt)
|
||||||
{
|
{
|
||||||
String *serverValue = NULL;
|
String *serverValue = NULL;
|
||||||
foreach_ptr(serverValue, stmt->objects)
|
foreach_declared_ptr(serverValue, stmt->objects)
|
||||||
{
|
{
|
||||||
const char *serverString = quote_identifier(strVal(serverValue));
|
const char *serverString = quote_identifier(strVal(serverValue));
|
||||||
appendStringInfo(buf, "%s", serverString);
|
appendStringInfo(buf, "%s", serverString);
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
static void AppendCreatePublicationStmt(StringInfo buf, CreatePublicationStmt *stmt,
|
static void AppendCreatePublicationStmt(StringInfo buf, CreatePublicationStmt *stmt,
|
||||||
bool whereClauseNeedsTransform,
|
bool whereClauseNeedsTransform,
|
||||||
bool includeLocalTables);
|
bool includeLocalTables);
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
static bool AppendPublicationObjects(StringInfo buf, List *publicationObjects,
|
static bool AppendPublicationObjects(StringInfo buf, List *publicationObjects,
|
||||||
bool whereClauseNeedsTransform,
|
bool whereClauseNeedsTransform,
|
||||||
bool includeLocalTables);
|
bool includeLocalTables);
|
||||||
|
@ -40,10 +39,6 @@ static void AppendWhereClauseExpression(StringInfo buf, RangeVar *tableName,
|
||||||
Node *whereClause,
|
Node *whereClause,
|
||||||
bool whereClauseNeedsTransform);
|
bool whereClauseNeedsTransform);
|
||||||
static void AppendAlterPublicationAction(StringInfo buf, AlterPublicationAction action);
|
static void AppendAlterPublicationAction(StringInfo buf, AlterPublicationAction action);
|
||||||
#else
|
|
||||||
static bool AppendTables(StringInfo buf, List *tables, bool includeLocalTables);
|
|
||||||
static void AppendDefElemAction(StringInfo buf, DefElemAction action);
|
|
||||||
#endif
|
|
||||||
static bool AppendAlterPublicationStmt(StringInfo buf, AlterPublicationStmt *stmt,
|
static bool AppendAlterPublicationStmt(StringInfo buf, AlterPublicationStmt *stmt,
|
||||||
bool whereClauseNeedsTransform,
|
bool whereClauseNeedsTransform,
|
||||||
bool includeLocalTables);
|
bool includeLocalTables);
|
||||||
|
@ -108,7 +103,6 @@ AppendCreatePublicationStmt(StringInfo buf, CreatePublicationStmt *stmt,
|
||||||
{
|
{
|
||||||
appendStringInfoString(buf, " FOR ALL TABLES");
|
appendStringInfoString(buf, " FOR ALL TABLES");
|
||||||
}
|
}
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
else if (stmt->pubobjects != NIL)
|
else if (stmt->pubobjects != NIL)
|
||||||
{
|
{
|
||||||
bool hasObjects = false;
|
bool hasObjects = false;
|
||||||
|
@ -118,7 +112,7 @@ AppendCreatePublicationStmt(StringInfo buf, CreatePublicationStmt *stmt,
|
||||||
* Check whether there are objects to propagate, mainly to know whether
|
* Check whether there are objects to propagate, mainly to know whether
|
||||||
* we should include "FOR".
|
* we should include "FOR".
|
||||||
*/
|
*/
|
||||||
foreach_ptr(publicationObject, stmt->pubobjects)
|
foreach_declared_ptr(publicationObject, stmt->pubobjects)
|
||||||
{
|
{
|
||||||
if (publicationObject->pubobjtype == PUBLICATIONOBJ_TABLE)
|
if (publicationObject->pubobjtype == PUBLICATIONOBJ_TABLE)
|
||||||
{
|
{
|
||||||
|
@ -146,32 +140,6 @@ AppendCreatePublicationStmt(StringInfo buf, CreatePublicationStmt *stmt,
|
||||||
includeLocalTables);
|
includeLocalTables);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
else if (stmt->tables != NIL)
|
|
||||||
{
|
|
||||||
bool hasTables = false;
|
|
||||||
RangeVar *rangeVar = NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check whether there are tables to propagate, mainly to know whether
|
|
||||||
* we should include "FOR".
|
|
||||||
*/
|
|
||||||
foreach_ptr(rangeVar, stmt->tables)
|
|
||||||
{
|
|
||||||
if (includeLocalTables || IsCitusTableRangeVar(rangeVar, NoLock, false))
|
|
||||||
{
|
|
||||||
hasTables = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasTables)
|
|
||||||
{
|
|
||||||
appendStringInfoString(buf, " FOR");
|
|
||||||
AppendTables(buf, stmt->tables, includeLocalTables);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (stmt->options != NIL)
|
if (stmt->options != NIL)
|
||||||
{
|
{
|
||||||
|
@ -182,8 +150,6 @@ AppendCreatePublicationStmt(StringInfo buf, CreatePublicationStmt *stmt,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AppendPublicationObjects appends a string representing a list of publication
|
* AppendPublicationObjects appends a string representing a list of publication
|
||||||
* objects to a buffer.
|
* objects to a buffer.
|
||||||
|
@ -198,7 +164,7 @@ AppendPublicationObjects(StringInfo buf, List *publicationObjects,
|
||||||
PublicationObjSpec *publicationObject = NULL;
|
PublicationObjSpec *publicationObject = NULL;
|
||||||
bool appendedObject = false;
|
bool appendedObject = false;
|
||||||
|
|
||||||
foreach_ptr(publicationObject, publicationObjects)
|
foreach_declared_ptr(publicationObject, publicationObjects)
|
||||||
{
|
{
|
||||||
if (publicationObject->pubobjtype == PUBLICATIONOBJ_TABLE)
|
if (publicationObject->pubobjtype == PUBLICATIONOBJ_TABLE)
|
||||||
{
|
{
|
||||||
|
@ -320,57 +286,6 @@ AppendWhereClauseExpression(StringInfo buf, RangeVar *tableName,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
* AppendPublicationObjects appends a string representing a list of publication
|
|
||||||
* objects to a buffer.
|
|
||||||
*
|
|
||||||
* For instance: TABLE users, departments
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
AppendTables(StringInfo buf, List *tables, bool includeLocalTables)
|
|
||||||
{
|
|
||||||
RangeVar *rangeVar = NULL;
|
|
||||||
bool appendedObject = false;
|
|
||||||
|
|
||||||
foreach_ptr(rangeVar, tables)
|
|
||||||
{
|
|
||||||
if (!includeLocalTables &&
|
|
||||||
!IsCitusTableRangeVar(rangeVar, NoLock, false))
|
|
||||||
{
|
|
||||||
/* do not propagate local tables */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *schemaName = rangeVar->schemaname;
|
|
||||||
char *tableName = rangeVar->relname;
|
|
||||||
|
|
||||||
if (schemaName != NULL)
|
|
||||||
{
|
|
||||||
/* qualified table name */
|
|
||||||
appendStringInfo(buf, "%s %s",
|
|
||||||
appendedObject ? "," : " TABLE",
|
|
||||||
quote_qualified_identifier(schemaName, tableName));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* unqualified table name */
|
|
||||||
appendStringInfo(buf, "%s %s",
|
|
||||||
appendedObject ? "," : " TABLE",
|
|
||||||
quote_identifier(tableName));
|
|
||||||
}
|
|
||||||
|
|
||||||
appendedObject = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return appendedObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DeparseAlterPublicationSchemaStmt builds and returns a string representing
|
* DeparseAlterPublicationSchemaStmt builds and returns a string representing
|
||||||
* an AlterPublicationStmt.
|
* an AlterPublicationStmt.
|
||||||
|
@ -439,19 +354,12 @@ AppendAlterPublicationStmt(StringInfo buf, AlterPublicationStmt *stmt,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
AppendAlterPublicationAction(buf, stmt->action);
|
AppendAlterPublicationAction(buf, stmt->action);
|
||||||
return AppendPublicationObjects(buf, stmt->pubobjects, whereClauseNeedsTransform,
|
return AppendPublicationObjects(buf, stmt->pubobjects, whereClauseNeedsTransform,
|
||||||
includeLocalTables);
|
includeLocalTables);
|
||||||
#else
|
|
||||||
AppendDefElemAction(buf, stmt->tableAction);
|
|
||||||
return AppendTables(buf, stmt->tables, includeLocalTables);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AppendAlterPublicationAction appends a string representing an AlterPublicationAction
|
* AppendAlterPublicationAction appends a string representing an AlterPublicationAction
|
||||||
* to a buffer.
|
* to a buffer.
|
||||||
|
@ -487,46 +395,6 @@ AppendAlterPublicationAction(StringInfo buf, AlterPublicationAction action)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
* AppendDefElemAction appends a string representing a DefElemAction
|
|
||||||
* to a buffer.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
AppendDefElemAction(StringInfo buf, DefElemAction action)
|
|
||||||
{
|
|
||||||
switch (action)
|
|
||||||
{
|
|
||||||
case DEFELEM_ADD:
|
|
||||||
{
|
|
||||||
appendStringInfoString(buf, " ADD");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DEFELEM_DROP:
|
|
||||||
{
|
|
||||||
appendStringInfoString(buf, " DROP");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DEFELEM_SET:
|
|
||||||
{
|
|
||||||
appendStringInfoString(buf, " SET");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
ereport(ERROR, (errmsg("unrecognized publication action: %d", action)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DeparseDropPublicationStmt builds and returns a string representing the DropStmt
|
* DeparseDropPublicationStmt builds and returns a string representing the DropStmt
|
||||||
*/
|
*/
|
||||||
|
@ -651,11 +519,7 @@ AppendPublicationOptions(StringInfo stringBuffer, List *optionList)
|
||||||
appendStringInfo(stringBuffer, "%s = ",
|
appendStringInfo(stringBuffer, "%s = ",
|
||||||
quote_identifier(optionName));
|
quote_identifier(optionName));
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
if (valueType == T_Integer || valueType == T_Float || valueType == T_Boolean)
|
if (valueType == T_Integer || valueType == T_Float || valueType == T_Boolean)
|
||||||
#else
|
|
||||||
if (valueType == T_Integer || valueType == T_Float)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
/* string escaping is unnecessary for numeric types and can cause issues */
|
/* string escaping is unnecessary for numeric types and can cause issues */
|
||||||
appendStringInfo(stringBuffer, "%s", optionValue);
|
appendStringInfo(stringBuffer, "%s", optionValue);
|
||||||
|
|
|
@ -404,7 +404,7 @@ AppendRevokeAdminOptionFor(StringInfo buf, GrantRoleStmt *stmt)
|
||||||
if (!stmt->is_grant)
|
if (!stmt->is_grant)
|
||||||
{
|
{
|
||||||
DefElem *opt = NULL;
|
DefElem *opt = NULL;
|
||||||
foreach_ptr(opt, stmt->opt)
|
foreach_declared_ptr(opt, stmt->opt)
|
||||||
{
|
{
|
||||||
if (strcmp(opt->defname, "admin") == 0)
|
if (strcmp(opt->defname, "admin") == 0)
|
||||||
{
|
{
|
||||||
|
@ -440,7 +440,7 @@ AppendGrantWithAdminOption(StringInfo buf, GrantRoleStmt *stmt)
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_16
|
#if PG_VERSION_NUM >= PG_VERSION_16
|
||||||
int opt_count = 0;
|
int opt_count = 0;
|
||||||
DefElem *opt = NULL;
|
DefElem *opt = NULL;
|
||||||
foreach_ptr(opt, stmt->opt)
|
foreach_declared_ptr(opt, stmt->opt)
|
||||||
{
|
{
|
||||||
char *optval = defGetString(opt);
|
char *optval = defGetString(opt);
|
||||||
bool option_value = false;
|
bool option_value = false;
|
||||||
|
|
|
@ -152,7 +152,7 @@ AppendDropSchemaStmt(StringInfo buf, DropStmt *stmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
String *schemaValue = NULL;
|
String *schemaValue = NULL;
|
||||||
foreach_ptr(schemaValue, stmt->objects)
|
foreach_declared_ptr(schemaValue, stmt->objects)
|
||||||
{
|
{
|
||||||
const char *schemaString = quote_identifier(strVal(schemaValue));
|
const char *schemaString = quote_identifier(strVal(schemaValue));
|
||||||
appendStringInfo(buf, "%s", schemaString);
|
appendStringInfo(buf, "%s", schemaString);
|
||||||
|
|
|
@ -28,9 +28,7 @@ static void AppendSequenceNameList(StringInfo buf, List *objects, ObjectType obj
|
||||||
static void AppendRenameSequenceStmt(StringInfo buf, RenameStmt *stmt);
|
static void AppendRenameSequenceStmt(StringInfo buf, RenameStmt *stmt);
|
||||||
static void AppendAlterSequenceSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt);
|
static void AppendAlterSequenceSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt);
|
||||||
static void AppendAlterSequenceOwnerStmt(StringInfo buf, AlterTableStmt *stmt);
|
static void AppendAlterSequenceOwnerStmt(StringInfo buf, AlterTableStmt *stmt);
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
static void AppendAlterSequencePersistenceStmt(StringInfo buf, AlterTableStmt *stmt);
|
static void AppendAlterSequencePersistenceStmt(StringInfo buf, AlterTableStmt *stmt);
|
||||||
#endif
|
|
||||||
static void AppendGrantOnSequenceStmt(StringInfo buf, GrantStmt *stmt);
|
static void AppendGrantOnSequenceStmt(StringInfo buf, GrantStmt *stmt);
|
||||||
static void AppendGrantOnSequenceSequences(StringInfo buf, GrantStmt *stmt);
|
static void AppendGrantOnSequenceSequences(StringInfo buf, GrantStmt *stmt);
|
||||||
|
|
||||||
|
@ -262,8 +260,6 @@ AppendAlterSequenceOwnerStmt(StringInfo buf, AlterTableStmt *stmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DeparseAlterSequencePersistenceStmt builds and returns a string representing
|
* DeparseAlterSequencePersistenceStmt builds and returns a string representing
|
||||||
* the AlterTableStmt consisting of changing the persistence of a sequence
|
* the AlterTableStmt consisting of changing the persistence of a sequence
|
||||||
|
@ -349,9 +345,6 @@ AppendAlterSequencePersistenceStmt(StringInfo buf, AlterTableStmt *stmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DeparseGrantOnSequenceStmt builds and returns a string representing the GrantOnSequenceStmt
|
* DeparseGrantOnSequenceStmt builds and returns a string representing the GrantOnSequenceStmt
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -177,8 +177,9 @@ AppendAlterStatisticsSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt)
|
||||||
static void
|
static void
|
||||||
AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt)
|
AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt)
|
||||||
{
|
{
|
||||||
appendStringInfo(buf, "ALTER STATISTICS %s SET STATISTICS %d", NameListToQuotedString(
|
appendStringInfo(buf, "ALTER STATISTICS %s SET STATISTICS %d",
|
||||||
stmt->defnames), stmt->stxstattarget);
|
NameListToQuotedString(stmt->defnames),
|
||||||
|
getIntStxstattarget_compat(stmt->stxstattarget));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -216,7 +217,7 @@ AppendStatTypes(StringInfo buf, CreateStatsStmt *stmt)
|
||||||
appendStringInfoString(buf, " (");
|
appendStringInfoString(buf, " (");
|
||||||
|
|
||||||
String *statType = NULL;
|
String *statType = NULL;
|
||||||
foreach_ptr(statType, stmt->stat_types)
|
foreach_declared_ptr(statType, stmt->stat_types)
|
||||||
{
|
{
|
||||||
appendStringInfoString(buf, strVal(statType));
|
appendStringInfoString(buf, strVal(statType));
|
||||||
|
|
||||||
|
@ -235,7 +236,7 @@ AppendColumnNames(StringInfo buf, CreateStatsStmt *stmt)
|
||||||
{
|
{
|
||||||
StatsElem *column = NULL;
|
StatsElem *column = NULL;
|
||||||
|
|
||||||
foreach_ptr(column, stmt->exprs)
|
foreach_declared_ptr(column, stmt->exprs)
|
||||||
{
|
{
|
||||||
if (!column->name)
|
if (!column->name)
|
||||||
{
|
{
|
||||||
|
|
|
@ -193,12 +193,10 @@ AppendAlterTableCmdConstraint(StringInfo buf, Constraint *constraint,
|
||||||
{
|
{
|
||||||
appendStringInfoString(buf, " UNIQUE");
|
appendStringInfoString(buf, " UNIQUE");
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
if (constraint->nulls_not_distinct == true)
|
if (constraint->nulls_not_distinct == true)
|
||||||
{
|
{
|
||||||
appendStringInfoString(buf, " NULLS NOT DISTINCT");
|
appendStringInfoString(buf, " NULLS NOT DISTINCT");
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subtype == AT_AddConstraint)
|
if (subtype == AT_AddConstraint)
|
||||||
|
|
|
@ -86,7 +86,7 @@ AppendDefElemList(StringInfo buf, List *defelems, char *objectName)
|
||||||
{
|
{
|
||||||
DefElem *defelem = NULL;
|
DefElem *defelem = NULL;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
foreach_ptr(defelem, defelems)
|
foreach_declared_ptr(defelem, defelems)
|
||||||
{
|
{
|
||||||
if (!first)
|
if (!first)
|
||||||
{
|
{
|
||||||
|
@ -133,7 +133,7 @@ DeparseDropTextSearchConfigurationStmt(Node *node)
|
||||||
appendStringInfoString(&buf, "DROP TEXT SEARCH CONFIGURATION ");
|
appendStringInfoString(&buf, "DROP TEXT SEARCH CONFIGURATION ");
|
||||||
List *nameList = NIL;
|
List *nameList = NIL;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
foreach_ptr(nameList, stmt->objects)
|
foreach_declared_ptr(nameList, stmt->objects)
|
||||||
{
|
{
|
||||||
if (!first)
|
if (!first)
|
||||||
{
|
{
|
||||||
|
@ -171,7 +171,7 @@ DeparseDropTextSearchDictionaryStmt(Node *node)
|
||||||
appendStringInfoString(&buf, "DROP TEXT SEARCH DICTIONARY ");
|
appendStringInfoString(&buf, "DROP TEXT SEARCH DICTIONARY ");
|
||||||
List *nameList = NIL;
|
List *nameList = NIL;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
foreach_ptr(nameList, stmt->objects)
|
foreach_declared_ptr(nameList, stmt->objects)
|
||||||
{
|
{
|
||||||
if (!first)
|
if (!first)
|
||||||
{
|
{
|
||||||
|
@ -404,7 +404,7 @@ AppendStringInfoTokentypeList(StringInfo buf, List *tokentypes)
|
||||||
{
|
{
|
||||||
String *tokentype = NULL;
|
String *tokentype = NULL;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
foreach_ptr(tokentype, tokentypes)
|
foreach_declared_ptr(tokentype, tokentypes)
|
||||||
{
|
{
|
||||||
if (nodeTag(tokentype) != T_String)
|
if (nodeTag(tokentype) != T_String)
|
||||||
{
|
{
|
||||||
|
@ -432,7 +432,7 @@ AppendStringInfoDictnames(StringInfo buf, List *dicts)
|
||||||
{
|
{
|
||||||
List *dictNames = NIL;
|
List *dictNames = NIL;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
foreach_ptr(dictNames, dicts)
|
foreach_declared_ptr(dictNames, dicts)
|
||||||
{
|
{
|
||||||
if (!first)
|
if (!first)
|
||||||
{
|
{
|
||||||
|
|
|
@ -88,7 +88,7 @@ AppendViewNameList(StringInfo buf, List *viewNamesList)
|
||||||
{
|
{
|
||||||
bool isFirstView = true;
|
bool isFirstView = true;
|
||||||
List *qualifiedViewName = NULL;
|
List *qualifiedViewName = NULL;
|
||||||
foreach_ptr(qualifiedViewName, viewNamesList)
|
foreach_declared_ptr(qualifiedViewName, viewNamesList)
|
||||||
{
|
{
|
||||||
char *quotedQualifiedVieName = NameListToQuotedString(qualifiedViewName);
|
char *quotedQualifiedVieName = NameListToQuotedString(qualifiedViewName);
|
||||||
if (!isFirstView)
|
if (!isFirstView)
|
||||||
|
|
|
@ -83,7 +83,7 @@ QualifyDropCollationStmt(Node *node)
|
||||||
List *names = NIL;
|
List *names = NIL;
|
||||||
List *name = NIL;
|
List *name = NIL;
|
||||||
|
|
||||||
foreach_ptr(name, stmt->objects)
|
foreach_declared_ptr(name, stmt->objects)
|
||||||
{
|
{
|
||||||
names = lappend(names, QualifyCollationName(name));
|
names = lappend(names, QualifyCollationName(name));
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@ QualifyDropDomainStmt(Node *node)
|
||||||
DropStmt *stmt = castNode(DropStmt, node);
|
DropStmt *stmt = castNode(DropStmt, node);
|
||||||
|
|
||||||
TypeName *domainName = NULL;
|
TypeName *domainName = NULL;
|
||||||
foreach_ptr(domainName, stmt->objects)
|
foreach_declared_ptr(domainName, stmt->objects)
|
||||||
{
|
{
|
||||||
QualifyTypeName(domainName, stmt->missing_ok);
|
QualifyTypeName(domainName, stmt->missing_ok);
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,7 @@ QualifyCollate(CollateClause *collClause, bool missing_ok)
|
||||||
|
|
||||||
collClause->collname = NIL;
|
collClause->collname = NIL;
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
foreach_ptr(name, objName)
|
foreach_declared_ptr(name, objName)
|
||||||
{
|
{
|
||||||
collClause->collname = lappend(collClause->collname, makeString(name));
|
collClause->collname = lappend(collClause->collname, makeString(name));
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,7 @@
|
||||||
#include "distributed/deparser.h"
|
#include "distributed/deparser.h"
|
||||||
#include "distributed/listutils.h"
|
#include "distributed/listutils.h"
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
static void QualifyPublicationObjects(List *publicationObjects);
|
static void QualifyPublicationObjects(List *publicationObjects);
|
||||||
#else
|
|
||||||
static void QualifyTables(List *tables);
|
|
||||||
#endif
|
|
||||||
static void QualifyPublicationRangeVar(RangeVar *publication);
|
static void QualifyPublicationRangeVar(RangeVar *publication);
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,16 +32,10 @@ QualifyCreatePublicationStmt(Node *node)
|
||||||
{
|
{
|
||||||
CreatePublicationStmt *stmt = castNode(CreatePublicationStmt, node);
|
CreatePublicationStmt *stmt = castNode(CreatePublicationStmt, node);
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
QualifyPublicationObjects(stmt->pubobjects);
|
QualifyPublicationObjects(stmt->pubobjects);
|
||||||
#else
|
|
||||||
QualifyTables(stmt->tables);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* QualifyPublicationObjects ensures all table names in a list of
|
* QualifyPublicationObjects ensures all table names in a list of
|
||||||
* publication objects are fully qualified.
|
* publication objects are fully qualified.
|
||||||
|
@ -55,7 +45,7 @@ QualifyPublicationObjects(List *publicationObjects)
|
||||||
{
|
{
|
||||||
PublicationObjSpec *publicationObject = NULL;
|
PublicationObjSpec *publicationObject = NULL;
|
||||||
|
|
||||||
foreach_ptr(publicationObject, publicationObjects)
|
foreach_declared_ptr(publicationObject, publicationObjects)
|
||||||
{
|
{
|
||||||
if (publicationObject->pubobjtype == PUBLICATIONOBJ_TABLE)
|
if (publicationObject->pubobjtype == PUBLICATIONOBJ_TABLE)
|
||||||
{
|
{
|
||||||
|
@ -68,26 +58,6 @@ QualifyPublicationObjects(List *publicationObjects)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
* QualifyTables ensures all table names in a list are fully qualified.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
QualifyTables(List *tables)
|
|
||||||
{
|
|
||||||
RangeVar *rangeVar = NULL;
|
|
||||||
|
|
||||||
foreach_ptr(rangeVar, tables)
|
|
||||||
{
|
|
||||||
QualifyPublicationRangeVar(rangeVar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* QualifyPublicationObjects ensures all table names in a list of
|
* QualifyPublicationObjects ensures all table names in a list of
|
||||||
* publication objects are fully qualified.
|
* publication objects are fully qualified.
|
||||||
|
@ -97,11 +67,7 @@ QualifyAlterPublicationStmt(Node *node)
|
||||||
{
|
{
|
||||||
AlterPublicationStmt *stmt = castNode(AlterPublicationStmt, node);
|
AlterPublicationStmt *stmt = castNode(AlterPublicationStmt, node);
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
QualifyPublicationObjects(stmt->pubobjects);
|
QualifyPublicationObjects(stmt->pubobjects);
|
||||||
#else
|
|
||||||
QualifyTables(stmt->tables);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -52,8 +52,6 @@ QualifyAlterSequenceOwnerStmt(Node *node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= PG_VERSION_15)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* QualifyAlterSequencePersistenceStmt transforms a
|
* QualifyAlterSequencePersistenceStmt transforms a
|
||||||
* ALTER SEQUENCE .. SET LOGGED/UNLOGGED
|
* ALTER SEQUENCE .. SET LOGGED/UNLOGGED
|
||||||
|
@ -80,9 +78,6 @@ QualifyAlterSequencePersistenceStmt(Node *node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* QualifyAlterSequenceSchemaStmt transforms a
|
* QualifyAlterSequenceSchemaStmt transforms a
|
||||||
* ALTER SEQUENCE .. SET SCHEMA ..
|
* ALTER SEQUENCE .. SET SCHEMA ..
|
||||||
|
@ -148,7 +143,7 @@ QualifyDropSequenceStmt(Node *node)
|
||||||
|
|
||||||
List *objectNameListWithSchema = NIL;
|
List *objectNameListWithSchema = NIL;
|
||||||
List *objectNameList = NULL;
|
List *objectNameList = NULL;
|
||||||
foreach_ptr(objectNameList, stmt->objects)
|
foreach_declared_ptr(objectNameList, stmt->objects)
|
||||||
{
|
{
|
||||||
RangeVar *seq = makeRangeVarFromNameList(objectNameList);
|
RangeVar *seq = makeRangeVarFromNameList(objectNameList);
|
||||||
|
|
||||||
|
@ -192,7 +187,7 @@ QualifyGrantOnSequenceStmt(Node *node)
|
||||||
}
|
}
|
||||||
List *qualifiedSequenceRangeVars = NIL;
|
List *qualifiedSequenceRangeVars = NIL;
|
||||||
RangeVar *sequenceRangeVar = NULL;
|
RangeVar *sequenceRangeVar = NULL;
|
||||||
foreach_ptr(sequenceRangeVar, stmt->objects)
|
foreach_declared_ptr(sequenceRangeVar, stmt->objects)
|
||||||
{
|
{
|
||||||
if (sequenceRangeVar->schemaname == NULL)
|
if (sequenceRangeVar->schemaname == NULL)
|
||||||
{
|
{
|
||||||
|
|
|
@ -73,7 +73,7 @@ QualifyDropStatisticsStmt(Node *node)
|
||||||
|
|
||||||
List *objectNameListWithSchema = NIL;
|
List *objectNameListWithSchema = NIL;
|
||||||
List *objectNameList = NULL;
|
List *objectNameList = NULL;
|
||||||
foreach_ptr(objectNameList, dropStatisticsStmt->objects)
|
foreach_declared_ptr(objectNameList, dropStatisticsStmt->objects)
|
||||||
{
|
{
|
||||||
RangeVar *stat = makeRangeVarFromNameList(objectNameList);
|
RangeVar *stat = makeRangeVarFromNameList(objectNameList);
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ QualifyDropTextSearchConfigurationStmt(Node *node)
|
||||||
List *qualifiedObjects = NIL;
|
List *qualifiedObjects = NIL;
|
||||||
List *objName = NIL;
|
List *objName = NIL;
|
||||||
|
|
||||||
foreach_ptr(objName, stmt->objects)
|
foreach_declared_ptr(objName, stmt->objects)
|
||||||
{
|
{
|
||||||
char *schemaName = NULL;
|
char *schemaName = NULL;
|
||||||
char *tsconfigName = NULL;
|
char *tsconfigName = NULL;
|
||||||
|
@ -87,7 +87,7 @@ QualifyDropTextSearchDictionaryStmt(Node *node)
|
||||||
List *qualifiedObjects = NIL;
|
List *qualifiedObjects = NIL;
|
||||||
List *objName = NIL;
|
List *objName = NIL;
|
||||||
|
|
||||||
foreach_ptr(objName, stmt->objects)
|
foreach_declared_ptr(objName, stmt->objects)
|
||||||
{
|
{
|
||||||
char *schemaName = NULL;
|
char *schemaName = NULL;
|
||||||
char *tsdictName = NULL;
|
char *tsdictName = NULL;
|
||||||
|
@ -141,7 +141,7 @@ QualifyAlterTextSearchConfigurationStmt(Node *node)
|
||||||
bool useNewDicts = false;
|
bool useNewDicts = false;
|
||||||
List *dicts = NULL;
|
List *dicts = NULL;
|
||||||
List *dictName = NIL;
|
List *dictName = NIL;
|
||||||
foreach_ptr(dictName, stmt->dicts)
|
foreach_declared_ptr(dictName, stmt->dicts)
|
||||||
{
|
{
|
||||||
DeconstructQualifiedName(dictName, &schemaName, &objName);
|
DeconstructQualifiedName(dictName, &schemaName, &objName);
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ QualifyDropViewStmt(Node *node)
|
||||||
List *qualifiedViewNames = NIL;
|
List *qualifiedViewNames = NIL;
|
||||||
|
|
||||||
List *possiblyQualifiedViewName = NULL;
|
List *possiblyQualifiedViewName = NULL;
|
||||||
foreach_ptr(possiblyQualifiedViewName, stmt->objects)
|
foreach_declared_ptr(possiblyQualifiedViewName, stmt->objects)
|
||||||
{
|
{
|
||||||
char *viewName = NULL;
|
char *viewName = NULL;
|
||||||
char *schemaName = NULL;
|
char *schemaName = NULL;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -718,10 +718,8 @@ static void RebuildWaitEventSetForSessions(DistributedExecution *execution);
|
||||||
static void AddLatchWaitEventToExecution(DistributedExecution *execution);
|
static void AddLatchWaitEventToExecution(DistributedExecution *execution);
|
||||||
static void ProcessWaitEvents(DistributedExecution *execution, WaitEvent *events, int
|
static void ProcessWaitEvents(DistributedExecution *execution, WaitEvent *events, int
|
||||||
eventCount, bool *cancellationReceived);
|
eventCount, bool *cancellationReceived);
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
static void RemoteSocketClosedForAnySession(DistributedExecution *execution);
|
static void RemoteSocketClosedForAnySession(DistributedExecution *execution);
|
||||||
static void ProcessWaitEventsForSocketClosed(WaitEvent *events, int eventCount);
|
static void ProcessWaitEventsForSocketClosed(WaitEvent *events, int eventCount);
|
||||||
#endif
|
|
||||||
static long MillisecondsBetweenTimestamps(instr_time startTime, instr_time endTime);
|
static long MillisecondsBetweenTimestamps(instr_time startTime, instr_time endTime);
|
||||||
static uint64 MicrosecondsBetweenTimestamps(instr_time startTime, instr_time endTime);
|
static uint64 MicrosecondsBetweenTimestamps(instr_time startTime, instr_time endTime);
|
||||||
static int WorkerPoolCompare(const void *lhsKey, const void *rhsKey);
|
static int WorkerPoolCompare(const void *lhsKey, const void *rhsKey);
|
||||||
|
@ -1430,7 +1428,7 @@ AssignTasksToConnectionsOrWorkerPool(DistributedExecution *execution)
|
||||||
List *taskList = execution->remoteTaskList;
|
List *taskList = execution->remoteTaskList;
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
bool placementExecutionReady = true;
|
bool placementExecutionReady = true;
|
||||||
int placementExecutionIndex = 0;
|
int placementExecutionIndex = 0;
|
||||||
|
@ -1453,7 +1451,7 @@ AssignTasksToConnectionsOrWorkerPool(DistributedExecution *execution)
|
||||||
|
|
||||||
SetAttributeInputMetadata(execution, shardCommandExecution);
|
SetAttributeInputMetadata(execution, shardCommandExecution);
|
||||||
ShardPlacement *taskPlacement = NULL;
|
ShardPlacement *taskPlacement = NULL;
|
||||||
foreach_ptr(taskPlacement, task->taskPlacementList)
|
foreach_declared_ptr(taskPlacement, task->taskPlacementList)
|
||||||
{
|
{
|
||||||
int connectionFlags = 0;
|
int connectionFlags = 0;
|
||||||
char *nodeName = NULL;
|
char *nodeName = NULL;
|
||||||
|
@ -1598,7 +1596,7 @@ AssignTasksToConnectionsOrWorkerPool(DistributedExecution *execution)
|
||||||
* connection may be be returned multiple times by GetPlacementListConnectionIfCached.
|
* connection may be be returned multiple times by GetPlacementListConnectionIfCached.
|
||||||
*/
|
*/
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, execution->sessionList)
|
foreach_declared_ptr(session, execution->sessionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = session->connection;
|
MultiConnection *connection = session->connection;
|
||||||
|
|
||||||
|
@ -1721,7 +1719,7 @@ static WorkerPool *
|
||||||
FindOrCreateWorkerPool(DistributedExecution *execution, char *nodeName, int nodePort)
|
FindOrCreateWorkerPool(DistributedExecution *execution, char *nodeName, int nodePort)
|
||||||
{
|
{
|
||||||
WorkerPool *workerPool = NULL;
|
WorkerPool *workerPool = NULL;
|
||||||
foreach_ptr(workerPool, execution->workerList)
|
foreach_declared_ptr(workerPool, execution->workerList)
|
||||||
{
|
{
|
||||||
if (strncmp(nodeName, workerPool->nodeName, WORKER_LENGTH) == 0 &&
|
if (strncmp(nodeName, workerPool->nodeName, WORKER_LENGTH) == 0 &&
|
||||||
nodePort == workerPool->nodePort)
|
nodePort == workerPool->nodePort)
|
||||||
|
@ -1768,7 +1766,7 @@ FindOrCreateWorkerSession(WorkerPool *workerPool, MultiConnection *connection)
|
||||||
static uint64 sessionId = 1;
|
static uint64 sessionId = 1;
|
||||||
|
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, workerPool->sessionList)
|
foreach_declared_ptr(session, workerPool->sessionList)
|
||||||
{
|
{
|
||||||
if (session->connection == connection)
|
if (session->connection == connection)
|
||||||
{
|
{
|
||||||
|
@ -1784,11 +1782,8 @@ FindOrCreateWorkerSession(WorkerPool *workerPool, MultiConnection *connection)
|
||||||
session->commandsSent = 0;
|
session->commandsSent = 0;
|
||||||
session->waitEventSetIndex = WAIT_EVENT_SET_INDEX_NOT_INITIALIZED;
|
session->waitEventSetIndex = WAIT_EVENT_SET_INDEX_NOT_INITIALIZED;
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
|
|
||||||
/* always detect closed sockets */
|
/* always detect closed sockets */
|
||||||
UpdateConnectionWaitFlags(session, WL_SOCKET_CLOSED);
|
UpdateConnectionWaitFlags(session, WL_SOCKET_CLOSED);
|
||||||
#endif
|
|
||||||
|
|
||||||
dlist_init(&session->pendingTaskQueue);
|
dlist_init(&session->pendingTaskQueue);
|
||||||
dlist_init(&session->readyTaskQueue);
|
dlist_init(&session->readyTaskQueue);
|
||||||
|
@ -1832,7 +1827,6 @@ FindOrCreateWorkerSession(WorkerPool *workerPool, MultiConnection *connection)
|
||||||
* the events, even ignores cancellation events. Future callers of this
|
* the events, even ignores cancellation events. Future callers of this
|
||||||
* function should consider its limitations.
|
* function should consider its limitations.
|
||||||
*/
|
*/
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
static void
|
static void
|
||||||
RemoteSocketClosedForAnySession(DistributedExecution *execution)
|
RemoteSocketClosedForAnySession(DistributedExecution *execution)
|
||||||
{
|
{
|
||||||
|
@ -1850,9 +1844,6 @@ RemoteSocketClosedForAnySession(DistributedExecution *execution)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SequentialRunDistributedExecution gets a distributed execution and
|
* SequentialRunDistributedExecution gets a distributed execution and
|
||||||
* executes each individual task in the execution sequentially, one
|
* executes each individual task in the execution sequentially, one
|
||||||
|
@ -1871,7 +1862,7 @@ SequentialRunDistributedExecution(DistributedExecution *execution)
|
||||||
*/
|
*/
|
||||||
MultiShardConnectionType = SEQUENTIAL_CONNECTION;
|
MultiShardConnectionType = SEQUENTIAL_CONNECTION;
|
||||||
Task *taskToExecute = NULL;
|
Task *taskToExecute = NULL;
|
||||||
foreach_ptr(taskToExecute, taskList)
|
foreach_declared_ptr(taskToExecute, taskList)
|
||||||
{
|
{
|
||||||
execution->remoteAndLocalTaskList = list_make1(taskToExecute);
|
execution->remoteAndLocalTaskList = list_make1(taskToExecute);
|
||||||
execution->remoteTaskList = list_make1(taskToExecute);
|
execution->remoteTaskList = list_make1(taskToExecute);
|
||||||
|
@ -1911,7 +1902,7 @@ RunDistributedExecution(DistributedExecution *execution)
|
||||||
{
|
{
|
||||||
/* Preemptively step state machines in case of immediate errors */
|
/* Preemptively step state machines in case of immediate errors */
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, execution->sessionList)
|
foreach_declared_ptr(session, execution->sessionList)
|
||||||
{
|
{
|
||||||
ConnectionStateMachine(session);
|
ConnectionStateMachine(session);
|
||||||
}
|
}
|
||||||
|
@ -1943,7 +1934,7 @@ RunDistributedExecution(DistributedExecution *execution)
|
||||||
HasIncompleteConnectionEstablishment(execution)))
|
HasIncompleteConnectionEstablishment(execution)))
|
||||||
{
|
{
|
||||||
WorkerPool *workerPool = NULL;
|
WorkerPool *workerPool = NULL;
|
||||||
foreach_ptr(workerPool, execution->workerList)
|
foreach_declared_ptr(workerPool, execution->workerList)
|
||||||
{
|
{
|
||||||
ManageWorkerPool(workerPool);
|
ManageWorkerPool(workerPool);
|
||||||
}
|
}
|
||||||
|
@ -2028,7 +2019,7 @@ ProcessSessionsWithFailedWaitEventSetOperations(DistributedExecution *execution)
|
||||||
{
|
{
|
||||||
bool foundFailedSession = false;
|
bool foundFailedSession = false;
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, execution->sessionList)
|
foreach_declared_ptr(session, execution->sessionList)
|
||||||
{
|
{
|
||||||
if (session->waitEventSetIndex == WAIT_EVENT_SET_INDEX_FAILED)
|
if (session->waitEventSetIndex == WAIT_EVENT_SET_INDEX_FAILED)
|
||||||
{
|
{
|
||||||
|
@ -2072,7 +2063,7 @@ HasIncompleteConnectionEstablishment(DistributedExecution *execution)
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, execution->sessionList)
|
foreach_declared_ptr(session, execution->sessionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = session->connection;
|
MultiConnection *connection = session->connection;
|
||||||
if (connection->connectionState == MULTI_CONNECTION_INITIAL ||
|
if (connection->connectionState == MULTI_CONNECTION_INITIAL ||
|
||||||
|
@ -2188,8 +2179,6 @@ ProcessWaitEvents(DistributedExecution *execution, WaitEvent *events, int eventC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ProcessWaitEventsForSocketClosed mainly checks for WL_SOCKET_CLOSED event.
|
* ProcessWaitEventsForSocketClosed mainly checks for WL_SOCKET_CLOSED event.
|
||||||
* If WL_SOCKET_CLOSED is found, the function sets the underlying connection's
|
* If WL_SOCKET_CLOSED is found, the function sets the underlying connection's
|
||||||
|
@ -2222,9 +2211,6 @@ ProcessWaitEventsForSocketClosed(WaitEvent *events, int eventCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ManageWorkerPool ensures the worker pool has the appropriate number of connections
|
* ManageWorkerPool ensures the worker pool has the appropriate number of connections
|
||||||
* based on the number of pending tasks.
|
* based on the number of pending tasks.
|
||||||
|
@ -2550,7 +2536,7 @@ AvgTaskExecutionTimeApproximation(WorkerPool *workerPool)
|
||||||
INSTR_TIME_SET_CURRENT(now);
|
INSTR_TIME_SET_CURRENT(now);
|
||||||
|
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, workerPool->sessionList)
|
foreach_declared_ptr(session, workerPool->sessionList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Involve the tasks that are currently running. We do this to
|
* Involve the tasks that are currently running. We do this to
|
||||||
|
@ -2588,7 +2574,7 @@ AvgConnectionEstablishmentTime(WorkerPool *workerPool)
|
||||||
int sessionCount = 0;
|
int sessionCount = 0;
|
||||||
|
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, workerPool->sessionList)
|
foreach_declared_ptr(session, workerPool->sessionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = session->connection;
|
MultiConnection *connection = session->connection;
|
||||||
|
|
||||||
|
@ -2719,7 +2705,6 @@ OpenNewConnections(WorkerPool *workerPool, int newConnectionCount,
|
||||||
* Instead, we prefer this slight difference, which in effect has almost no
|
* Instead, we prefer this slight difference, which in effect has almost no
|
||||||
* difference, but doing things in different points in time.
|
* difference, but doing things in different points in time.
|
||||||
*/
|
*/
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
|
|
||||||
/* we added new connections, rebuild the waitEventSet */
|
/* we added new connections, rebuild the waitEventSet */
|
||||||
RebuildWaitEventSetForSessions(execution);
|
RebuildWaitEventSetForSessions(execution);
|
||||||
|
@ -2739,12 +2724,9 @@ OpenNewConnections(WorkerPool *workerPool, int newConnectionCount,
|
||||||
* of the execution.
|
* of the execution.
|
||||||
*/
|
*/
|
||||||
AddLatchWaitEventToExecution(execution);
|
AddLatchWaitEventToExecution(execution);
|
||||||
#else
|
|
||||||
execution->rebuildWaitEventSet = true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, newSessionsList)
|
foreach_declared_ptr(session, newSessionsList)
|
||||||
{
|
{
|
||||||
/* immediately run the state machine to handle potential failure */
|
/* immediately run the state machine to handle potential failure */
|
||||||
ConnectionStateMachine(session);
|
ConnectionStateMachine(session);
|
||||||
|
@ -2862,7 +2844,7 @@ static void
|
||||||
MarkEstablishingSessionsTimedOut(WorkerPool *workerPool)
|
MarkEstablishingSessionsTimedOut(WorkerPool *workerPool)
|
||||||
{
|
{
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, workerPool->sessionList)
|
foreach_declared_ptr(session, workerPool->sessionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = session->connection;
|
MultiConnection *connection = session->connection;
|
||||||
|
|
||||||
|
@ -2914,7 +2896,7 @@ NextEventTimeout(DistributedExecution *execution)
|
||||||
long eventTimeout = 1000; /* milliseconds */
|
long eventTimeout = 1000; /* milliseconds */
|
||||||
|
|
||||||
WorkerPool *workerPool = NULL;
|
WorkerPool *workerPool = NULL;
|
||||||
foreach_ptr(workerPool, execution->workerList)
|
foreach_declared_ptr(workerPool, execution->workerList)
|
||||||
{
|
{
|
||||||
if (workerPool->failureState == WORKER_POOL_FAILED)
|
if (workerPool->failureState == WORKER_POOL_FAILED)
|
||||||
{
|
{
|
||||||
|
@ -3678,13 +3660,8 @@ UpdateConnectionWaitFlags(WorkerSession *session, int waitFlags)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
|
|
||||||
/* always detect closed sockets */
|
/* always detect closed sockets */
|
||||||
connection->waitFlags = waitFlags | WL_SOCKET_CLOSED;
|
connection->waitFlags = waitFlags | WL_SOCKET_CLOSED;
|
||||||
#else
|
|
||||||
connection->waitFlags = waitFlags;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* without signalling the execution, the flag changes won't be reflected */
|
/* without signalling the execution, the flag changes won't be reflected */
|
||||||
execution->waitFlagsChanged = true;
|
execution->waitFlagsChanged = true;
|
||||||
|
@ -3709,13 +3686,11 @@ CheckConnectionReady(WorkerSession *session)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
if ((session->latestUnconsumedWaitEvents & WL_SOCKET_CLOSED) != 0)
|
if ((session->latestUnconsumedWaitEvents & WL_SOCKET_CLOSED) != 0)
|
||||||
{
|
{
|
||||||
connection->connectionState = MULTI_CONNECTION_LOST;
|
connection->connectionState = MULTI_CONNECTION_LOST;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* try to send all pending data */
|
/* try to send all pending data */
|
||||||
int sendStatus = PQflush(connection->pgConn);
|
int sendStatus = PQflush(connection->pgConn);
|
||||||
|
@ -4255,7 +4230,7 @@ WorkerPoolFailed(WorkerPool *workerPool)
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, workerPool->sessionList)
|
foreach_declared_ptr(session, workerPool->sessionList)
|
||||||
{
|
{
|
||||||
WorkerSessionFailed(session);
|
WorkerSessionFailed(session);
|
||||||
}
|
}
|
||||||
|
@ -4280,7 +4255,7 @@ WorkerPoolFailed(WorkerPool *workerPool)
|
||||||
List *workerList = workerPool->distributedExecution->workerList;
|
List *workerList = workerPool->distributedExecution->workerList;
|
||||||
|
|
||||||
WorkerPool *pool = NULL;
|
WorkerPool *pool = NULL;
|
||||||
foreach_ptr(pool, workerList)
|
foreach_declared_ptr(pool, workerList)
|
||||||
{
|
{
|
||||||
/* failed pools or pools without any connection attempts ignored */
|
/* failed pools or pools without any connection attempts ignored */
|
||||||
if (pool->failureState == WORKER_POOL_FAILED ||
|
if (pool->failureState == WORKER_POOL_FAILED ||
|
||||||
|
@ -4633,7 +4608,7 @@ PlacementExecutionReady(TaskPlacementExecution *placementExecution)
|
||||||
|
|
||||||
/* wake up an idle connection by checking whether the connection is writeable */
|
/* wake up an idle connection by checking whether the connection is writeable */
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, workerPool->sessionList)
|
foreach_declared_ptr(session, workerPool->sessionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = session->connection;
|
MultiConnection *connection = session->connection;
|
||||||
RemoteTransaction *transaction = &(connection->remoteTransaction);
|
RemoteTransaction *transaction = &(connection->remoteTransaction);
|
||||||
|
@ -4755,10 +4730,10 @@ BuildWaitEventSet(List *sessionList)
|
||||||
int eventSetSize = GetEventSetSize(sessionList);
|
int eventSetSize = GetEventSetSize(sessionList);
|
||||||
|
|
||||||
WaitEventSet *waitEventSet =
|
WaitEventSet *waitEventSet =
|
||||||
CreateWaitEventSet(CurrentMemoryContext, eventSetSize);
|
CreateWaitEventSet(WaitEventSetTracker_compat, eventSetSize);
|
||||||
|
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, sessionList)
|
foreach_declared_ptr(session, sessionList)
|
||||||
{
|
{
|
||||||
AddSessionToWaitEventSet(session, waitEventSet);
|
AddSessionToWaitEventSet(session, waitEventSet);
|
||||||
}
|
}
|
||||||
|
@ -4856,7 +4831,7 @@ static void
|
||||||
RebuildWaitEventSetFlags(WaitEventSet *waitEventSet, List *sessionList)
|
RebuildWaitEventSetFlags(WaitEventSet *waitEventSet, List *sessionList)
|
||||||
{
|
{
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, sessionList)
|
foreach_declared_ptr(session, sessionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = session->connection;
|
MultiConnection *connection = session->connection;
|
||||||
int waitEventSetIndex = session->waitEventSetIndex;
|
int waitEventSetIndex = session->waitEventSetIndex;
|
||||||
|
@ -4912,7 +4887,7 @@ CleanUpSessions(DistributedExecution *execution)
|
||||||
|
|
||||||
/* always trigger wait event set in the first round */
|
/* always trigger wait event set in the first round */
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, sessionList)
|
foreach_declared_ptr(session, sessionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = session->connection;
|
MultiConnection *connection = session->connection;
|
||||||
|
|
||||||
|
@ -4993,7 +4968,7 @@ static void
|
||||||
UnclaimAllSessionConnections(List *sessionList)
|
UnclaimAllSessionConnections(List *sessionList)
|
||||||
{
|
{
|
||||||
WorkerSession *session = NULL;
|
WorkerSession *session = NULL;
|
||||||
foreach_ptr(session, sessionList)
|
foreach_declared_ptr(session, sessionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = session->connection;
|
MultiConnection *connection = session->connection;
|
||||||
|
|
||||||
|
|
|
@ -524,7 +524,7 @@ static bool
|
||||||
AnchorShardsInTaskListExist(List *taskList)
|
AnchorShardsInTaskListExist(List *taskList)
|
||||||
{
|
{
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
if (!ShardExists(task->anchorShardId))
|
if (!ShardExists(task->anchorShardId))
|
||||||
{
|
{
|
||||||
|
|
|
@ -94,7 +94,7 @@ FindExecutableTasks(List *allTasks, HTAB *completedTasks)
|
||||||
List *curTasks = NIL;
|
List *curTasks = NIL;
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, allTasks)
|
foreach_declared_ptr(task, allTasks)
|
||||||
{
|
{
|
||||||
if (IsAllDependencyCompleted(task, completedTasks) &&
|
if (IsAllDependencyCompleted(task, completedTasks) &&
|
||||||
!IsTaskAlreadyCompleted(task, completedTasks))
|
!IsTaskAlreadyCompleted(task, completedTasks))
|
||||||
|
@ -118,7 +118,7 @@ RemoveMergeTasks(List *taskList)
|
||||||
List *prunedTaskList = NIL;
|
List *prunedTaskList = NIL;
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
|
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
if (task->taskType != MERGE_TASK)
|
if (task->taskType != MERGE_TASK)
|
||||||
{
|
{
|
||||||
|
@ -139,7 +139,7 @@ AddCompletedTasks(List *curCompletedTasks, HTAB *completedTasks)
|
||||||
bool found;
|
bool found;
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, curCompletedTasks)
|
foreach_declared_ptr(task, curCompletedTasks)
|
||||||
{
|
{
|
||||||
TaskHashKey taskKey = { task->jobId, task->taskId };
|
TaskHashKey taskKey = { task->jobId, task->taskId };
|
||||||
hash_search(completedTasks, &taskKey, HASH_ENTER, &found);
|
hash_search(completedTasks, &taskKey, HASH_ENTER, &found);
|
||||||
|
@ -172,7 +172,7 @@ IsAllDependencyCompleted(Task *targetTask, HTAB *completedTasks)
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, targetTask->dependentTaskList)
|
foreach_declared_ptr(task, targetTask->dependentTaskList)
|
||||||
{
|
{
|
||||||
TaskHashKey taskKey = { task->jobId, task->taskId };
|
TaskHashKey taskKey = { task->jobId, task->taskId };
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ AcquireExecutorShardLocksForExecution(RowModifyLevel modLevel, List *taskList)
|
||||||
List *requiresConsistentSnapshotRelationShardList = NIL;
|
List *requiresConsistentSnapshotRelationShardList = NIL;
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
ShardInterval *anchorShardInterval = LoadShardInterval(task->anchorShardId);
|
ShardInterval *anchorShardInterval = LoadShardInterval(task->anchorShardId);
|
||||||
anchorShardIntervalList = lappend(anchorShardIntervalList, anchorShardInterval);
|
anchorShardIntervalList = lappend(anchorShardIntervalList, anchorShardInterval);
|
||||||
|
@ -344,7 +344,7 @@ AcquireMetadataLocks(List *taskList)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
LockShardDistributionMetadata(task->anchorShardId, ShareLock);
|
LockShardDistributionMetadata(task->anchorShardId, ShareLock);
|
||||||
}
|
}
|
||||||
|
@ -379,7 +379,7 @@ AcquireExecutorShardLocksForRelationRowLockList(List *relationRowLockList)
|
||||||
* them.
|
* them.
|
||||||
*/
|
*/
|
||||||
RelationRowLock *relationRowLock = NULL;
|
RelationRowLock *relationRowLock = NULL;
|
||||||
foreach_ptr(relationRowLock, relationRowLockList)
|
foreach_declared_ptr(relationRowLock, relationRowLockList)
|
||||||
{
|
{
|
||||||
LockClauseStrength rowLockStrength = relationRowLock->rowLockStrength;
|
LockClauseStrength rowLockStrength = relationRowLock->rowLockStrength;
|
||||||
Oid relationId = relationRowLock->relationId;
|
Oid relationId = relationRowLock->relationId;
|
||||||
|
@ -412,7 +412,7 @@ void
|
||||||
LockPartitionsInRelationList(List *relationIdList, LOCKMODE lockmode)
|
LockPartitionsInRelationList(List *relationIdList, LOCKMODE lockmode)
|
||||||
{
|
{
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, relationIdList)
|
foreach_declared_oid(relationId, relationIdList)
|
||||||
{
|
{
|
||||||
if (PartitionedTable(relationId))
|
if (PartitionedTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -437,7 +437,7 @@ LockPartitionRelations(Oid relationId, LOCKMODE lockMode)
|
||||||
*/
|
*/
|
||||||
List *partitionList = PartitionList(relationId);
|
List *partitionList = PartitionList(relationId);
|
||||||
Oid partitionRelationId = InvalidOid;
|
Oid partitionRelationId = InvalidOid;
|
||||||
foreach_oid(partitionRelationId, partitionList)
|
foreach_declared_oid(partitionRelationId, partitionList)
|
||||||
{
|
{
|
||||||
LockRelationOid(partitionRelationId, lockMode);
|
LockRelationOid(partitionRelationId, lockMode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,7 +206,7 @@ WrapTasksForPartitioning(const char *resultIdPrefix, List *selectTaskList,
|
||||||
intervalTypeMod);
|
intervalTypeMod);
|
||||||
|
|
||||||
Task *selectTask = NULL;
|
Task *selectTask = NULL;
|
||||||
foreach_ptr(selectTask, selectTaskList)
|
foreach_declared_ptr(selectTask, selectTaskList)
|
||||||
{
|
{
|
||||||
char *taskPrefix = SourceShardPrefix(resultIdPrefix, selectTask->anchorShardId);
|
char *taskPrefix = SourceShardPrefix(resultIdPrefix, selectTask->anchorShardId);
|
||||||
char *partitionMethodString = targetRelation->partitionMethod == 'h' ?
|
char *partitionMethodString = targetRelation->partitionMethod == 'h' ?
|
||||||
|
@ -490,7 +490,7 @@ ColocateFragmentsWithRelation(List *fragmentList, CitusTableCacheEntry *targetRe
|
||||||
List **shardResultIdList = palloc0(shardCount * sizeof(List *));
|
List **shardResultIdList = palloc0(shardCount * sizeof(List *));
|
||||||
|
|
||||||
DistributedResultFragment *sourceFragment = NULL;
|
DistributedResultFragment *sourceFragment = NULL;
|
||||||
foreach_ptr(sourceFragment, fragmentList)
|
foreach_declared_ptr(sourceFragment, fragmentList)
|
||||||
{
|
{
|
||||||
int shardIndex = sourceFragment->targetShardIndex;
|
int shardIndex = sourceFragment->targetShardIndex;
|
||||||
|
|
||||||
|
@ -520,11 +520,11 @@ ColocationTransfers(List *fragmentList, CitusTableCacheEntry *targetRelation)
|
||||||
HASH_ELEM | HASH_CONTEXT | HASH_BLOBS);
|
HASH_ELEM | HASH_CONTEXT | HASH_BLOBS);
|
||||||
|
|
||||||
DistributedResultFragment *fragment = NULL;
|
DistributedResultFragment *fragment = NULL;
|
||||||
foreach_ptr(fragment, fragmentList)
|
foreach_declared_ptr(fragment, fragmentList)
|
||||||
{
|
{
|
||||||
List *placementList = ActiveShardPlacementList(fragment->targetShardId);
|
List *placementList = ActiveShardPlacementList(fragment->targetShardId);
|
||||||
ShardPlacement *placement = NULL;
|
ShardPlacement *placement = NULL;
|
||||||
foreach_ptr(placement, placementList)
|
foreach_declared_ptr(placement, placementList)
|
||||||
{
|
{
|
||||||
NodePair transferKey = {
|
NodePair transferKey = {
|
||||||
.sourceNodeId = fragment->nodeId,
|
.sourceNodeId = fragment->nodeId,
|
||||||
|
@ -576,7 +576,7 @@ FragmentTransferTaskList(List *fragmentListTransfers)
|
||||||
List *fetchTaskList = NIL;
|
List *fetchTaskList = NIL;
|
||||||
|
|
||||||
NodeToNodeFragmentsTransfer *fragmentsTransfer = NULL;
|
NodeToNodeFragmentsTransfer *fragmentsTransfer = NULL;
|
||||||
foreach_ptr(fragmentsTransfer, fragmentListTransfers)
|
foreach_declared_ptr(fragmentsTransfer, fragmentListTransfers)
|
||||||
{
|
{
|
||||||
uint32 targetNodeId = fragmentsTransfer->nodes.targetNodeId;
|
uint32 targetNodeId = fragmentsTransfer->nodes.targetNodeId;
|
||||||
|
|
||||||
|
@ -629,7 +629,7 @@ QueryStringForFragmentsTransfer(NodeToNodeFragmentsTransfer *fragmentsTransfer)
|
||||||
appendStringInfoString(fragmentNamesArrayString, "ARRAY[");
|
appendStringInfoString(fragmentNamesArrayString, "ARRAY[");
|
||||||
|
|
||||||
DistributedResultFragment *fragment = NULL;
|
DistributedResultFragment *fragment = NULL;
|
||||||
foreach_ptr(fragment, fragmentsTransfer->fragmentList)
|
foreach_declared_ptr(fragment, fragmentsTransfer->fragmentList)
|
||||||
{
|
{
|
||||||
const char *fragmentName = fragment->resultId;
|
const char *fragmentName = fragment->resultId;
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,7 @@ bool
|
||||||
TaskListCannotBeExecutedInTransaction(List *taskList)
|
TaskListCannotBeExecutedInTransaction(List *taskList)
|
||||||
{
|
{
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
if (task->cannotBeExecutedInTransaction)
|
if (task->cannotBeExecutedInTransaction)
|
||||||
{
|
{
|
||||||
|
@ -190,7 +190,7 @@ SelectForUpdateOnReferenceTable(List *taskList)
|
||||||
|
|
||||||
Task *task = (Task *) linitial(taskList);
|
Task *task = (Task *) linitial(taskList);
|
||||||
RelationRowLock *relationRowLock = NULL;
|
RelationRowLock *relationRowLock = NULL;
|
||||||
foreach_ptr(relationRowLock, task->relationRowLockList)
|
foreach_declared_ptr(relationRowLock, task->relationRowLockList)
|
||||||
{
|
{
|
||||||
Oid relationId = relationRowLock->relationId;
|
Oid relationId = relationRowLock->relationId;
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ bool
|
||||||
ModifiedTableReplicated(List *taskList)
|
ModifiedTableReplicated(List *taskList)
|
||||||
{
|
{
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
int64 shardId = task->anchorShardId;
|
int64 shardId = task->anchorShardId;
|
||||||
|
|
||||||
|
|
|
@ -239,7 +239,7 @@ NonPushableInsertSelectExecScan(CustomScanState *node)
|
||||||
* on shards with connections.
|
* on shards with connections.
|
||||||
*/
|
*/
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
uint64 shardId = task->anchorShardId;
|
uint64 shardId = task->anchorShardId;
|
||||||
bool shardModified = false;
|
bool shardModified = false;
|
||||||
|
@ -376,7 +376,7 @@ BuildColumnNameListFromTargetList(Oid targetRelationId, List *insertTargetList)
|
||||||
|
|
||||||
/* build the list of column names for the COPY statement */
|
/* build the list of column names for the COPY statement */
|
||||||
TargetEntry *insertTargetEntry = NULL;
|
TargetEntry *insertTargetEntry = NULL;
|
||||||
foreach_ptr(insertTargetEntry, insertTargetList)
|
foreach_declared_ptr(insertTargetEntry, insertTargetList)
|
||||||
{
|
{
|
||||||
columnNameList = lappend(columnNameList, insertTargetEntry->resname);
|
columnNameList = lappend(columnNameList, insertTargetEntry->resname);
|
||||||
}
|
}
|
||||||
|
@ -397,7 +397,7 @@ PartitionColumnIndexFromColumnList(Oid relationId, List *columnNameList)
|
||||||
int partitionColumnIndex = 0;
|
int partitionColumnIndex = 0;
|
||||||
|
|
||||||
const char *columnName = NULL;
|
const char *columnName = NULL;
|
||||||
foreach_ptr(columnName, columnNameList)
|
foreach_declared_ptr(columnName, columnNameList)
|
||||||
{
|
{
|
||||||
AttrNumber attrNumber = get_attnum(relationId, columnName);
|
AttrNumber attrNumber = get_attnum(relationId, columnName);
|
||||||
|
|
||||||
|
@ -423,7 +423,7 @@ DistributionColumnIndex(List *insertTargetList, Var *distributionColumn)
|
||||||
{
|
{
|
||||||
TargetEntry *insertTargetEntry = NULL;
|
TargetEntry *insertTargetEntry = NULL;
|
||||||
int targetEntryIndex = 0;
|
int targetEntryIndex = 0;
|
||||||
foreach_ptr(insertTargetEntry, insertTargetList)
|
foreach_declared_ptr(insertTargetEntry, insertTargetList)
|
||||||
{
|
{
|
||||||
if (insertTargetEntry->resno == distributionColumn->varattno)
|
if (insertTargetEntry->resno == distributionColumn->varattno)
|
||||||
{
|
{
|
||||||
|
@ -447,7 +447,7 @@ WrapTaskListForProjection(List *taskList, List *projectedTargetEntries)
|
||||||
StringInfo projectedColumnsString = makeStringInfo();
|
StringInfo projectedColumnsString = makeStringInfo();
|
||||||
int entryIndex = 0;
|
int entryIndex = 0;
|
||||||
TargetEntry *targetEntry = NULL;
|
TargetEntry *targetEntry = NULL;
|
||||||
foreach_ptr(targetEntry, projectedTargetEntries)
|
foreach_declared_ptr(targetEntry, projectedTargetEntries)
|
||||||
{
|
{
|
||||||
if (entryIndex != 0)
|
if (entryIndex != 0)
|
||||||
{
|
{
|
||||||
|
@ -462,7 +462,7 @@ WrapTaskListForProjection(List *taskList, List *projectedTargetEntries)
|
||||||
}
|
}
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
StringInfo wrappedQuery = makeStringInfo();
|
StringInfo wrappedQuery = makeStringInfo();
|
||||||
appendStringInfo(wrappedQuery, "SELECT %s FROM (%s) subquery",
|
appendStringInfo(wrappedQuery, "SELECT %s FROM (%s) subquery",
|
||||||
|
|
|
@ -306,7 +306,7 @@ PrepareIntermediateResultBroadcast(RemoteFileDestReceiver *resultDest)
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, initialNodeList)
|
foreach_declared_ptr(workerNode, initialNodeList)
|
||||||
{
|
{
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ PrepareIntermediateResultBroadcast(RemoteFileDestReceiver *resultDest)
|
||||||
RemoteTransactionsBeginIfNecessary(connectionList);
|
RemoteTransactionsBeginIfNecessary(connectionList);
|
||||||
|
|
||||||
MultiConnection *connection = NULL;
|
MultiConnection *connection = NULL;
|
||||||
foreach_ptr(connection, connectionList)
|
foreach_declared_ptr(connection, connectionList)
|
||||||
{
|
{
|
||||||
StringInfo copyCommand = ConstructCopyResultStatement(resultId);
|
StringInfo copyCommand = ConstructCopyResultStatement(resultId);
|
||||||
|
|
||||||
|
@ -337,7 +337,7 @@ PrepareIntermediateResultBroadcast(RemoteFileDestReceiver *resultDest)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach_ptr(connection, connectionList)
|
foreach_declared_ptr(connection, connectionList)
|
||||||
{
|
{
|
||||||
bool raiseInterrupts = true;
|
bool raiseInterrupts = true;
|
||||||
|
|
||||||
|
@ -516,7 +516,7 @@ static void
|
||||||
BroadcastCopyData(StringInfo dataBuffer, List *connectionList)
|
BroadcastCopyData(StringInfo dataBuffer, List *connectionList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = NULL;
|
MultiConnection *connection = NULL;
|
||||||
foreach_ptr(connection, connectionList)
|
foreach_declared_ptr(connection, connectionList)
|
||||||
{
|
{
|
||||||
SendCopyDataOverConnection(dataBuffer, connection);
|
SendCopyDataOverConnection(dataBuffer, connection);
|
||||||
}
|
}
|
||||||
|
@ -712,7 +712,7 @@ void
|
||||||
RemoveIntermediateResultsDirectories(void)
|
RemoveIntermediateResultsDirectories(void)
|
||||||
{
|
{
|
||||||
char *directoryElement = NULL;
|
char *directoryElement = NULL;
|
||||||
foreach_ptr(directoryElement, CreatedResultsDirectories)
|
foreach_declared_ptr(directoryElement, CreatedResultsDirectories)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* The shared directory is renamed before deleting it. Otherwise it
|
* The shared directory is renamed before deleting it. Otherwise it
|
||||||
|
|
|
@ -253,7 +253,7 @@ ExecuteLocalTaskListExtended(List *taskList,
|
||||||
ALLOCSET_DEFAULT_SIZES);
|
ALLOCSET_DEFAULT_SIZES);
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
MemoryContext oldContext = MemoryContextSwitchTo(loopContext);
|
MemoryContext oldContext = MemoryContextSwitchTo(loopContext);
|
||||||
|
|
||||||
|
@ -304,7 +304,7 @@ ExecuteLocalTaskListExtended(List *taskList,
|
||||||
LOCKMODE lockMode = GetQueryLockMode(jobQuery);
|
LOCKMODE lockMode = GetQueryLockMode(jobQuery);
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, localPlan->relationOids)
|
foreach_declared_oid(relationId, localPlan->relationOids)
|
||||||
{
|
{
|
||||||
LockRelationOid(relationId, lockMode);
|
LockRelationOid(relationId, lockMode);
|
||||||
}
|
}
|
||||||
|
@ -393,7 +393,7 @@ SetColocationIdAndPartitionKeyValueForTasks(List *taskList, Job *workerJob)
|
||||||
if (workerJob->colocationId != INVALID_COLOCATION_ID)
|
if (workerJob->colocationId != INVALID_COLOCATION_ID)
|
||||||
{
|
{
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
task->colocationId = workerJob->colocationId;
|
task->colocationId = workerJob->colocationId;
|
||||||
task->partitionKeyValue = workerJob->partitionKeyValue;
|
task->partitionKeyValue = workerJob->partitionKeyValue;
|
||||||
|
@ -412,7 +412,7 @@ LocallyPlanAndExecuteMultipleQueries(List *queryStrings, TupleDestination *tuple
|
||||||
{
|
{
|
||||||
char *queryString = NULL;
|
char *queryString = NULL;
|
||||||
uint64 totalProcessedRows = 0;
|
uint64 totalProcessedRows = 0;
|
||||||
foreach_ptr(queryString, queryStrings)
|
foreach_declared_ptr(queryString, queryStrings)
|
||||||
{
|
{
|
||||||
Query *shardQuery = ParseQueryString(queryString,
|
Query *shardQuery = ParseQueryString(queryString,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -490,7 +490,7 @@ ExecuteUtilityCommand(const char *taskQueryCommand)
|
||||||
List *parseTreeList = pg_parse_query(taskQueryCommand);
|
List *parseTreeList = pg_parse_query(taskQueryCommand);
|
||||||
RawStmt *taskRawStmt = NULL;
|
RawStmt *taskRawStmt = NULL;
|
||||||
|
|
||||||
foreach_ptr(taskRawStmt, parseTreeList)
|
foreach_declared_ptr(taskRawStmt, parseTreeList)
|
||||||
{
|
{
|
||||||
Node *taskRawParseTree = taskRawStmt->stmt;
|
Node *taskRawParseTree = taskRawStmt->stmt;
|
||||||
|
|
||||||
|
@ -580,7 +580,7 @@ ExtractLocalAndRemoteTasks(bool readOnly, List *taskList, List **localTaskList,
|
||||||
*localTaskList = NIL;
|
*localTaskList = NIL;
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
List *localTaskPlacementList = NULL;
|
List *localTaskPlacementList = NULL;
|
||||||
List *remoteTaskPlacementList = NULL;
|
List *remoteTaskPlacementList = NULL;
|
||||||
|
@ -645,7 +645,7 @@ SplitLocalAndRemotePlacements(List *taskPlacementList, List **localTaskPlacement
|
||||||
*remoteTaskPlacementList = NIL;
|
*remoteTaskPlacementList = NIL;
|
||||||
|
|
||||||
ShardPlacement *taskPlacement = NULL;
|
ShardPlacement *taskPlacement = NULL;
|
||||||
foreach_ptr(taskPlacement, taskPlacementList)
|
foreach_declared_ptr(taskPlacement, taskPlacementList)
|
||||||
{
|
{
|
||||||
if (taskPlacement->groupId == localGroupId)
|
if (taskPlacement->groupId == localGroupId)
|
||||||
{
|
{
|
||||||
|
@ -817,7 +817,7 @@ RecordNonDistTableAccessesForTask(Task *task)
|
||||||
List *placementAccessList = PlacementAccessListForTask(task, taskPlacement);
|
List *placementAccessList = PlacementAccessListForTask(task, taskPlacement);
|
||||||
|
|
||||||
ShardPlacementAccess *placementAccess = NULL;
|
ShardPlacementAccess *placementAccess = NULL;
|
||||||
foreach_ptr(placementAccess, placementAccessList)
|
foreach_declared_ptr(placementAccess, placementAccessList)
|
||||||
{
|
{
|
||||||
uint64 placementAccessShardId = placementAccess->placement->shardId;
|
uint64 placementAccessShardId = placementAccess->placement->shardId;
|
||||||
if (placementAccessShardId == INVALID_SHARD_ID)
|
if (placementAccessShardId == INVALID_SHARD_ID)
|
||||||
|
@ -968,7 +968,7 @@ AnyTaskAccessesLocalNode(List *taskList)
|
||||||
{
|
{
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
|
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
if (TaskAccessesLocalNode(task))
|
if (TaskAccessesLocalNode(task))
|
||||||
{
|
{
|
||||||
|
@ -990,7 +990,7 @@ TaskAccessesLocalNode(Task *task)
|
||||||
int32 localGroupId = GetLocalGroupId();
|
int32 localGroupId = GetLocalGroupId();
|
||||||
|
|
||||||
ShardPlacement *taskPlacement = NULL;
|
ShardPlacement *taskPlacement = NULL;
|
||||||
foreach_ptr(taskPlacement, task->taskPlacementList)
|
foreach_declared_ptr(taskPlacement, task->taskPlacementList)
|
||||||
{
|
{
|
||||||
if (taskPlacement->groupId == localGroupId)
|
if (taskPlacement->groupId == localGroupId)
|
||||||
{
|
{
|
||||||
|
|
|
@ -219,6 +219,7 @@ ExecuteSourceAtCoordAndRedistribution(CitusScanState *scanState)
|
||||||
copyObject(distributedPlan->selectPlanForModifyViaCoordinatorOrRepartition);
|
copyObject(distributedPlan->selectPlanForModifyViaCoordinatorOrRepartition);
|
||||||
char *intermediateResultIdPrefix = distributedPlan->intermediateResultIdPrefix;
|
char *intermediateResultIdPrefix = distributedPlan->intermediateResultIdPrefix;
|
||||||
bool hasReturning = distributedPlan->expectResults;
|
bool hasReturning = distributedPlan->expectResults;
|
||||||
|
bool hasNotMatchedBySource = HasMergeNotMatchedBySource(mergeQuery);
|
||||||
int partitionColumnIndex = distributedPlan->sourceResultRepartitionColumnIndex;
|
int partitionColumnIndex = distributedPlan->sourceResultRepartitionColumnIndex;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -233,7 +234,7 @@ ExecuteSourceAtCoordAndRedistribution(CitusScanState *scanState)
|
||||||
|
|
||||||
ereport(DEBUG1, (errmsg("Collect source query results on coordinator")));
|
ereport(DEBUG1, (errmsg("Collect source query results on coordinator")));
|
||||||
|
|
||||||
List *prunedTaskList = NIL;
|
List *prunedTaskList = NIL, *emptySourceTaskList = NIL;
|
||||||
HTAB *shardStateHash =
|
HTAB *shardStateHash =
|
||||||
ExecuteMergeSourcePlanIntoColocatedIntermediateResults(
|
ExecuteMergeSourcePlanIntoColocatedIntermediateResults(
|
||||||
targetRelationId,
|
targetRelationId,
|
||||||
|
@ -255,10 +256,11 @@ ExecuteSourceAtCoordAndRedistribution(CitusScanState *scanState)
|
||||||
* We cannot actually execute MERGE INTO ... tasks that read from
|
* We cannot actually execute MERGE INTO ... tasks that read from
|
||||||
* intermediate results that weren't created because no rows were
|
* intermediate results that weren't created because no rows were
|
||||||
* written to them. Prune those tasks out by only including tasks
|
* written to them. Prune those tasks out by only including tasks
|
||||||
* on shards with connections.
|
* on shards with connections; however, if the MERGE INTO includes
|
||||||
|
* a NOT MATCHED BY SOURCE clause we need to include the task.
|
||||||
*/
|
*/
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, taskList)
|
foreach_declared_ptr(task, taskList)
|
||||||
{
|
{
|
||||||
uint64 shardId = task->anchorShardId;
|
uint64 shardId = task->anchorShardId;
|
||||||
bool shardModified = false;
|
bool shardModified = false;
|
||||||
|
@ -268,6 +270,19 @@ ExecuteSourceAtCoordAndRedistribution(CitusScanState *scanState)
|
||||||
{
|
{
|
||||||
prunedTaskList = lappend(prunedTaskList, task);
|
prunedTaskList = lappend(prunedTaskList, task);
|
||||||
}
|
}
|
||||||
|
else if (hasNotMatchedBySource)
|
||||||
|
{
|
||||||
|
emptySourceTaskList = lappend(emptySourceTaskList, task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emptySourceTaskList != NIL)
|
||||||
|
{
|
||||||
|
ereport(DEBUG1, (errmsg("MERGE has NOT MATCHED BY SOURCE clause, "
|
||||||
|
"execute MERGE on all shards")));
|
||||||
|
AdjustTaskQueryForEmptySource(targetRelationId, mergeQuery, emptySourceTaskList,
|
||||||
|
intermediateResultIdPrefix);
|
||||||
|
prunedTaskList = list_concat(prunedTaskList, emptySourceTaskList);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prunedTaskList == NIL)
|
if (prunedTaskList == NIL)
|
||||||
|
|
|
@ -224,7 +224,7 @@ CitusExecutorRun(QueryDesc *queryDesc,
|
||||||
*/
|
*/
|
||||||
List *citusCustomScanStates = FindCitusCustomScanStates(queryDesc->planstate);
|
List *citusCustomScanStates = FindCitusCustomScanStates(queryDesc->planstate);
|
||||||
CitusScanState *citusScanState = NULL;
|
CitusScanState *citusScanState = NULL;
|
||||||
foreach_ptr(citusScanState, citusCustomScanStates)
|
foreach_declared_ptr(citusScanState, citusCustomScanStates)
|
||||||
{
|
{
|
||||||
if (citusScanState->PreExecScan)
|
if (citusScanState->PreExecScan)
|
||||||
{
|
{
|
||||||
|
@ -512,7 +512,7 @@ SortTupleStore(CitusScanState *scanState)
|
||||||
* for sorting the tuples.
|
* for sorting the tuples.
|
||||||
*/
|
*/
|
||||||
TargetEntry *returningEntry = NULL;
|
TargetEntry *returningEntry = NULL;
|
||||||
foreach_ptr(returningEntry, targetList)
|
foreach_declared_ptr(returningEntry, targetList)
|
||||||
{
|
{
|
||||||
Oid sortop = InvalidOid;
|
Oid sortop = InvalidOid;
|
||||||
|
|
||||||
|
|
|
@ -126,7 +126,7 @@ BuildPlacementAccessList(int32 groupId, List *relationShardList,
|
||||||
List *placementAccessList = NIL;
|
List *placementAccessList = NIL;
|
||||||
|
|
||||||
RelationShard *relationShard = NULL;
|
RelationShard *relationShard = NULL;
|
||||||
foreach_ptr(relationShard, relationShardList)
|
foreach_declared_ptr(relationShard, relationShardList)
|
||||||
{
|
{
|
||||||
ShardPlacement *placement = ActiveShardPlacementOnGroup(groupId,
|
ShardPlacement *placement = ActiveShardPlacementOnGroup(groupId,
|
||||||
relationShard->shardId);
|
relationShard->shardId);
|
||||||
|
|
|
@ -140,19 +140,6 @@ static void CitusQueryStatsRemoveExpiredEntries(HTAB *existingQueryIdHash);
|
||||||
void
|
void
|
||||||
InitializeCitusQueryStats(void)
|
InitializeCitusQueryStats(void)
|
||||||
{
|
{
|
||||||
/* on PG 15, we use shmem_request_hook_type */
|
|
||||||
#if PG_VERSION_NUM < PG_VERSION_15
|
|
||||||
|
|
||||||
/* allocate shared memory */
|
|
||||||
if (!IsUnderPostmaster)
|
|
||||||
{
|
|
||||||
RequestAddinShmemSpace(CitusQueryStatsSharedMemSize());
|
|
||||||
|
|
||||||
elog(LOG, "requesting named LWLockTranch for %s", STATS_SHARED_MEM_NAME);
|
|
||||||
RequestNamedLWLockTranche(STATS_SHARED_MEM_NAME, 1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Install hook */
|
/* Install hook */
|
||||||
prev_shmem_startup_hook = shmem_startup_hook;
|
prev_shmem_startup_hook = shmem_startup_hook;
|
||||||
shmem_startup_hook = CitusQueryStatsShmemStartup;
|
shmem_startup_hook = CitusQueryStatsShmemStartup;
|
||||||
|
@ -759,9 +746,6 @@ citus_query_stats(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
LWLockRelease(queryStats->lock);
|
LWLockRelease(queryStats->lock);
|
||||||
|
|
||||||
/* clean up and return the tuplestore */
|
|
||||||
tuplestore_donestoring(tupstore);
|
|
||||||
|
|
||||||
return (Datum) 0;
|
return (Datum) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "nodes/parsenodes.h"
|
#include "nodes/parsenodes.h"
|
||||||
|
|
||||||
#include "distributed/citus_custom_scan.h"
|
#include "distributed/citus_custom_scan.h"
|
||||||
|
#include "distributed/deparse_shard_query.h"
|
||||||
#include "distributed/intermediate_results.h"
|
#include "distributed/intermediate_results.h"
|
||||||
#include "distributed/listutils.h"
|
#include "distributed/listutils.h"
|
||||||
#include "distributed/multi_physical_planner.h"
|
#include "distributed/multi_physical_planner.h"
|
||||||
|
@ -101,6 +102,40 @@ IsRedistributablePlan(Plan *selectPlan)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* HasMergeNotMatchedBySource returns true if the MERGE query has a
|
||||||
|
* WHEN NOT MATCHED BY SOURCE clause. If it does, we need to execute
|
||||||
|
* the MERGE query on all shards of the target table, regardless of
|
||||||
|
* whether or not the source shard has any rows.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
HasMergeNotMatchedBySource(Query *query)
|
||||||
|
{
|
||||||
|
if (!IsMergeQuery(query))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool haveNotMatchedBySource = false;
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_17
|
||||||
|
ListCell *lc;
|
||||||
|
foreach(lc, query->mergeActionList)
|
||||||
|
{
|
||||||
|
MergeAction *action = lfirst_node(MergeAction, lc);
|
||||||
|
|
||||||
|
if (action->matchKind == MERGE_WHEN_NOT_MATCHED_BY_SOURCE)
|
||||||
|
{
|
||||||
|
haveNotMatchedBySource = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return haveNotMatchedBySource;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GenerateTaskListWithColocatedIntermediateResults generates a list of tasks
|
* GenerateTaskListWithColocatedIntermediateResults generates a list of tasks
|
||||||
* for a query that inserts into a target relation and selects from a set of
|
* for a query that inserts into a target relation and selects from a set of
|
||||||
|
@ -200,6 +235,61 @@ GenerateTaskListWithColocatedIntermediateResults(Oid targetRelationId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AdjustTaskQueryForEmptySource adjusts the query for tasks that read from an
|
||||||
|
* intermediate result to instead read from an empty relation. This ensures that
|
||||||
|
* the MERGE query is executed on all shards of the target table, because it has
|
||||||
|
* a NOT MATCHED BY SOURCE clause, which will be true for all target shards where
|
||||||
|
* the source shard has no rows.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
AdjustTaskQueryForEmptySource(Oid targetRelationId,
|
||||||
|
Query *mergeQuery,
|
||||||
|
List *tasks,
|
||||||
|
char *resultIdPrefix)
|
||||||
|
{
|
||||||
|
Query *mergeQueryCopy = copyObject(mergeQuery);
|
||||||
|
RangeTblEntry *selectRte = ExtractSourceResultRangeTableEntry(mergeQueryCopy);
|
||||||
|
RangeTblEntry *mergeRte = ExtractResultRelationRTE(mergeQueryCopy);
|
||||||
|
List *targetList = selectRte->subquery->targetList;
|
||||||
|
ListCell *taskCell = NULL;
|
||||||
|
|
||||||
|
foreach(taskCell, tasks)
|
||||||
|
{
|
||||||
|
Task *task = lfirst(taskCell);
|
||||||
|
uint64 shardId = task->anchorShardId;
|
||||||
|
StringInfo queryString = makeStringInfo();
|
||||||
|
StringInfo resultId = makeStringInfo();
|
||||||
|
|
||||||
|
appendStringInfo(resultId, "%s_" UINT64_FORMAT, resultIdPrefix, shardId);
|
||||||
|
|
||||||
|
/* Generate a query for an empty relation */
|
||||||
|
selectRte->subquery = BuildEmptyResultQuery(targetList, resultId->data);
|
||||||
|
|
||||||
|
/* setting an alias simplifies deparsing of RETURNING */
|
||||||
|
if (mergeRte->alias == NULL)
|
||||||
|
{
|
||||||
|
Alias *alias = makeAlias(CITUS_TABLE_ALIAS, NIL);
|
||||||
|
mergeRte->alias = alias;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate a query string for the query that merges into a shard and reads
|
||||||
|
* from an empty relation.
|
||||||
|
*
|
||||||
|
* Since CTEs have already been converted to intermediate results, they need
|
||||||
|
* to removed from the query. Otherwise, worker queries include both
|
||||||
|
* intermediate results and CTEs in the query.
|
||||||
|
*/
|
||||||
|
mergeQueryCopy->cteList = NIL;
|
||||||
|
deparse_shard_query(mergeQueryCopy, targetRelationId, shardId, queryString);
|
||||||
|
ereport(DEBUG2, (errmsg("distributed statement: %s", queryString->data)));
|
||||||
|
|
||||||
|
SetTaskQueryString(task, queryString->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GenerateTaskListWithRedistributedResults returns a task list to insert given
|
* GenerateTaskListWithRedistributedResults returns a task list to insert given
|
||||||
* redistributedResults into the given target relation.
|
* redistributedResults into the given target relation.
|
||||||
|
@ -223,6 +313,7 @@ GenerateTaskListWithRedistributedResults(Query *modifyQueryViaCoordinatorOrRepar
|
||||||
Query *modifyResultQuery = copyObject(modifyQueryViaCoordinatorOrRepartition);
|
Query *modifyResultQuery = copyObject(modifyQueryViaCoordinatorOrRepartition);
|
||||||
RangeTblEntry *insertRte = ExtractResultRelationRTE(modifyResultQuery);
|
RangeTblEntry *insertRte = ExtractResultRelationRTE(modifyResultQuery);
|
||||||
Oid targetRelationId = targetRelation->relationId;
|
Oid targetRelationId = targetRelation->relationId;
|
||||||
|
bool hasNotMatchedBySource = HasMergeNotMatchedBySource(modifyResultQuery);
|
||||||
|
|
||||||
int shardCount = targetRelation->shardIntervalArrayLength;
|
int shardCount = targetRelation->shardIntervalArrayLength;
|
||||||
int shardOffset = 0;
|
int shardOffset = 0;
|
||||||
|
@ -242,19 +333,33 @@ GenerateTaskListWithRedistributedResults(Query *modifyQueryViaCoordinatorOrRepar
|
||||||
StringInfo queryString = makeStringInfo();
|
StringInfo queryString = makeStringInfo();
|
||||||
|
|
||||||
/* skip empty tasks */
|
/* skip empty tasks */
|
||||||
if (resultIdList == NIL)
|
if (resultIdList == NIL && !hasNotMatchedBySource)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sort result ids for consistent test output */
|
Query *fragmentSetQuery = NULL;
|
||||||
List *sortedResultIds = SortList(resultIdList, pg_qsort_strcmp);
|
|
||||||
|
|
||||||
/* generate the query on the intermediate result */
|
if (resultIdList != NIL)
|
||||||
Query *fragmentSetQuery = BuildReadIntermediateResultsArrayQuery(selectTargetList,
|
{
|
||||||
NIL,
|
/* sort result ids for consistent test output */
|
||||||
sortedResultIds,
|
List *sortedResultIds = SortList(resultIdList, pg_qsort_strcmp);
|
||||||
useBinaryFormat);
|
|
||||||
|
/* generate the query on the intermediate result */
|
||||||
|
fragmentSetQuery = BuildReadIntermediateResultsArrayQuery(selectTargetList,
|
||||||
|
NIL,
|
||||||
|
sortedResultIds,
|
||||||
|
useBinaryFormat);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No source data, but MERGE query has NOT MATCHED BY SOURCE */
|
||||||
|
StringInfo emptyFragmentId = makeStringInfo();
|
||||||
|
appendStringInfo(emptyFragmentId, "%s_" UINT64_FORMAT, "temp_empty_rel_",
|
||||||
|
shardId);
|
||||||
|
fragmentSetQuery = BuildEmptyResultQuery(selectTargetList,
|
||||||
|
emptyFragmentId->data);
|
||||||
|
}
|
||||||
|
|
||||||
/* put the intermediate result query in the INSERT..SELECT */
|
/* put the intermediate result query in the INSERT..SELECT */
|
||||||
selectRte->subquery = fragmentSetQuery;
|
selectRte->subquery = fragmentSetQuery;
|
||||||
|
|
|
@ -93,7 +93,7 @@ TraverseJobTree(Job *curJob, List **jobIds)
|
||||||
*jobIds = lappend(*jobIds, jobIdPointer);
|
*jobIds = lappend(*jobIds, jobIdPointer);
|
||||||
|
|
||||||
Job *childJob = NULL;
|
Job *childJob = NULL;
|
||||||
foreach_ptr(childJob, curJob->dependentJobList)
|
foreach_declared_ptr(childJob, curJob->dependentJobList)
|
||||||
{
|
{
|
||||||
TraverseJobTree(childJob, jobIds);
|
TraverseJobTree(childJob, jobIds);
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ ExecuteSubPlans(DistributedPlan *distributedPlan)
|
||||||
UseCoordinatedTransaction();
|
UseCoordinatedTransaction();
|
||||||
|
|
||||||
DistributedSubPlan *subPlan = NULL;
|
DistributedSubPlan *subPlan = NULL;
|
||||||
foreach_ptr(subPlan, subPlanList)
|
foreach_declared_ptr(subPlan, subPlanList)
|
||||||
{
|
{
|
||||||
PlannedStmt *plannedStmt = subPlan->plan;
|
PlannedStmt *plannedStmt = subPlan->plan;
|
||||||
uint32 subPlanId = subPlan->subPlanId;
|
uint32 subPlanId = subPlan->subPlanId;
|
||||||
|
|
|
@ -207,7 +207,7 @@ GetUniqueDependenciesList(List *objectAddressesList)
|
||||||
InitObjectAddressCollector(&objectAddressCollector);
|
InitObjectAddressCollector(&objectAddressCollector);
|
||||||
|
|
||||||
ObjectAddress *objectAddress = NULL;
|
ObjectAddress *objectAddress = NULL;
|
||||||
foreach_ptr(objectAddress, objectAddressesList)
|
foreach_declared_ptr(objectAddress, objectAddressesList)
|
||||||
{
|
{
|
||||||
if (IsObjectAddressCollected(*objectAddress, &objectAddressCollector))
|
if (IsObjectAddressCollected(*objectAddress, &objectAddressCollector))
|
||||||
{
|
{
|
||||||
|
@ -334,7 +334,7 @@ OrderObjectAddressListInDependencyOrder(List *objectAddressList)
|
||||||
InitObjectAddressCollector(&collector);
|
InitObjectAddressCollector(&collector);
|
||||||
|
|
||||||
ObjectAddress *objectAddress = NULL;
|
ObjectAddress *objectAddress = NULL;
|
||||||
foreach_ptr(objectAddress, objectAddressList)
|
foreach_declared_ptr(objectAddress, objectAddressList)
|
||||||
{
|
{
|
||||||
if (IsObjectAddressCollected(*objectAddress, &collector))
|
if (IsObjectAddressCollected(*objectAddress, &collector))
|
||||||
{
|
{
|
||||||
|
@ -403,7 +403,7 @@ RecurseObjectDependencies(ObjectAddress target, expandFn expand, followFn follow
|
||||||
|
|
||||||
/* iterate all entries and recurse depth first */
|
/* iterate all entries and recurse depth first */
|
||||||
DependencyDefinition *dependencyDefinition = NULL;
|
DependencyDefinition *dependencyDefinition = NULL;
|
||||||
foreach_ptr(dependencyDefinition, dependenyDefinitionList)
|
foreach_declared_ptr(dependencyDefinition, dependenyDefinitionList)
|
||||||
{
|
{
|
||||||
if (follow == NULL || !follow(collector, dependencyDefinition))
|
if (follow == NULL || !follow(collector, dependencyDefinition))
|
||||||
{
|
{
|
||||||
|
@ -869,7 +869,7 @@ bool
|
||||||
ErrorOrWarnIfAnyObjectHasUnsupportedDependency(List *objectAddresses)
|
ErrorOrWarnIfAnyObjectHasUnsupportedDependency(List *objectAddresses)
|
||||||
{
|
{
|
||||||
ObjectAddress *objectAddress = NULL;
|
ObjectAddress *objectAddress = NULL;
|
||||||
foreach_ptr(objectAddress, objectAddresses)
|
foreach_declared_ptr(objectAddress, objectAddresses)
|
||||||
{
|
{
|
||||||
if (ErrorOrWarnIfObjectHasUnsupportedDependency(objectAddress))
|
if (ErrorOrWarnIfObjectHasUnsupportedDependency(objectAddress))
|
||||||
{
|
{
|
||||||
|
@ -962,7 +962,7 @@ DeferErrorIfAnyObjectHasUnsupportedDependency(const List *objectAddresses)
|
||||||
{
|
{
|
||||||
DeferredErrorMessage *deferredErrorMessage = NULL;
|
DeferredErrorMessage *deferredErrorMessage = NULL;
|
||||||
ObjectAddress *objectAddress = NULL;
|
ObjectAddress *objectAddress = NULL;
|
||||||
foreach_ptr(objectAddress, objectAddresses)
|
foreach_declared_ptr(objectAddress, objectAddresses)
|
||||||
{
|
{
|
||||||
deferredErrorMessage = DeferErrorIfHasUnsupportedDependency(objectAddress);
|
deferredErrorMessage = DeferErrorIfHasUnsupportedDependency(objectAddress);
|
||||||
if (deferredErrorMessage)
|
if (deferredErrorMessage)
|
||||||
|
@ -995,7 +995,7 @@ GetUndistributableDependency(const ObjectAddress *objectAddress)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach_ptr(dependency, dependencies)
|
foreach_declared_ptr(dependency, dependencies)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Objects with the id smaller than FirstNormalObjectId should be created within
|
* Objects with the id smaller than FirstNormalObjectId should be created within
|
||||||
|
@ -1172,7 +1172,7 @@ IsAnyObjectAddressOwnedByExtension(const List *targets,
|
||||||
ObjectAddress *extensionAddress)
|
ObjectAddress *extensionAddress)
|
||||||
{
|
{
|
||||||
ObjectAddress *target = NULL;
|
ObjectAddress *target = NULL;
|
||||||
foreach_ptr(target, targets)
|
foreach_declared_ptr(target, targets)
|
||||||
{
|
{
|
||||||
if (IsObjectAddressOwnedByExtension(target, extensionAddress))
|
if (IsObjectAddressOwnedByExtension(target, extensionAddress))
|
||||||
{
|
{
|
||||||
|
@ -1563,7 +1563,7 @@ ExpandCitusSupportedTypes(ObjectAddressCollector *collector, ObjectAddress targe
|
||||||
List *FDWOids = GetDependentFDWsToExtension(extensionId);
|
List *FDWOids = GetDependentFDWsToExtension(extensionId);
|
||||||
|
|
||||||
Oid FDWOid = InvalidOid;
|
Oid FDWOid = InvalidOid;
|
||||||
foreach_oid(FDWOid, FDWOids)
|
foreach_declared_oid(FDWOid, FDWOids)
|
||||||
{
|
{
|
||||||
List *dependentRoleIds = GetDependentRoleIdsFDW(FDWOid);
|
List *dependentRoleIds = GetDependentRoleIdsFDW(FDWOid);
|
||||||
List *dependencies =
|
List *dependencies =
|
||||||
|
@ -1716,13 +1716,11 @@ ExpandCitusSupportedTypes(ObjectAddressCollector *collector, ObjectAddress targe
|
||||||
/*
|
/*
|
||||||
* As of PostgreSQL 15, the same applies to schemas.
|
* As of PostgreSQL 15, the same applies to schemas.
|
||||||
*/
|
*/
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
List *schemaIdList =
|
List *schemaIdList =
|
||||||
GetPublicationSchemas(publicationId);
|
GetPublicationSchemas(publicationId);
|
||||||
List *schemaDependencyList =
|
List *schemaDependencyList =
|
||||||
CreateObjectAddressDependencyDefList(NamespaceRelationId, schemaIdList);
|
CreateObjectAddressDependencyDefList(NamespaceRelationId, schemaIdList);
|
||||||
result = list_concat(result, schemaDependencyList);
|
result = list_concat(result, schemaDependencyList);
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1849,7 +1847,7 @@ GetViewRuleReferenceDependencyList(Oid viewId)
|
||||||
List *nonInternalDependenciesOfDependingRules = NIL;
|
List *nonInternalDependenciesOfDependingRules = NIL;
|
||||||
|
|
||||||
HeapTuple depTup = NULL;
|
HeapTuple depTup = NULL;
|
||||||
foreach_ptr(depTup, dependencyTupleList)
|
foreach_declared_ptr(depTup, dependencyTupleList)
|
||||||
{
|
{
|
||||||
Form_pg_depend pg_depend = (Form_pg_depend) GETSTRUCT(depTup);
|
Form_pg_depend pg_depend = (Form_pg_depend) GETSTRUCT(depTup);
|
||||||
|
|
||||||
|
@ -1872,7 +1870,7 @@ GetViewRuleReferenceDependencyList(Oid viewId)
|
||||||
List *ruleDependencies = DependencyDefinitionFromPgDepend(ruleAddress);
|
List *ruleDependencies = DependencyDefinitionFromPgDepend(ruleAddress);
|
||||||
|
|
||||||
DependencyDefinition *dependencyDef = NULL;
|
DependencyDefinition *dependencyDef = NULL;
|
||||||
foreach_ptr(dependencyDef, ruleDependencies)
|
foreach_declared_ptr(dependencyDef, ruleDependencies)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Follow all dependencies of the internally dependent rule dependencies
|
* Follow all dependencies of the internally dependent rule dependencies
|
||||||
|
@ -1907,7 +1905,7 @@ GetRelationSequenceDependencyList(Oid relationId)
|
||||||
|
|
||||||
List *seqIdList = NIL;
|
List *seqIdList = NIL;
|
||||||
SequenceInfo *seqInfo = NULL;
|
SequenceInfo *seqInfo = NULL;
|
||||||
foreach_ptr(seqInfo, seqInfoList)
|
foreach_declared_ptr(seqInfo, seqInfoList)
|
||||||
{
|
{
|
||||||
seqIdList = lappend_oid(seqIdList, seqInfo->sequenceOid);
|
seqIdList = lappend_oid(seqIdList, seqInfo->sequenceOid);
|
||||||
}
|
}
|
||||||
|
@ -1980,7 +1978,7 @@ GetRelationTriggerFunctionDependencyList(Oid relationId)
|
||||||
|
|
||||||
List *triggerIdList = GetExplicitTriggerIdList(relationId);
|
List *triggerIdList = GetExplicitTriggerIdList(relationId);
|
||||||
Oid triggerId = InvalidOid;
|
Oid triggerId = InvalidOid;
|
||||||
foreach_oid(triggerId, triggerIdList)
|
foreach_declared_oid(triggerId, triggerIdList)
|
||||||
{
|
{
|
||||||
Oid functionId = GetTriggerFunctionId(triggerId);
|
Oid functionId = GetTriggerFunctionId(triggerId);
|
||||||
DependencyDefinition *dependency =
|
DependencyDefinition *dependency =
|
||||||
|
@ -2005,7 +2003,7 @@ GetPublicationRelationsDependencyList(Oid publicationId)
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
|
|
||||||
foreach_oid(relationId, allRelationIds)
|
foreach_declared_oid(relationId, allRelationIds)
|
||||||
{
|
{
|
||||||
if (!IsCitusTable(relationId))
|
if (!IsCitusTable(relationId))
|
||||||
{
|
{
|
||||||
|
@ -2087,7 +2085,7 @@ CreateObjectAddressDependencyDefList(Oid classId, List *objectIdList)
|
||||||
{
|
{
|
||||||
List *dependencyList = NIL;
|
List *dependencyList = NIL;
|
||||||
Oid objectId = InvalidOid;
|
Oid objectId = InvalidOid;
|
||||||
foreach_oid(objectId, objectIdList)
|
foreach_declared_oid(objectId, objectIdList)
|
||||||
{
|
{
|
||||||
DependencyDefinition *dependency =
|
DependencyDefinition *dependency =
|
||||||
CreateObjectAddressDependencyDef(classId, objectId);
|
CreateObjectAddressDependencyDef(classId, objectId);
|
||||||
|
@ -2161,7 +2159,7 @@ BuildViewDependencyGraph(Oid relationId, HTAB *nodeMap)
|
||||||
targetObjectId);
|
targetObjectId);
|
||||||
|
|
||||||
HeapTuple depTup = NULL;
|
HeapTuple depTup = NULL;
|
||||||
foreach_ptr(depTup, dependencyTupleList)
|
foreach_declared_ptr(depTup, dependencyTupleList)
|
||||||
{
|
{
|
||||||
Form_pg_depend pg_depend = (Form_pg_depend) GETSTRUCT(depTup);
|
Form_pg_depend pg_depend = (Form_pg_depend) GETSTRUCT(depTup);
|
||||||
|
|
||||||
|
@ -2240,7 +2238,7 @@ GetDependingViews(Oid relationId)
|
||||||
foreach_ptr_append(node, nodeQueue)
|
foreach_ptr_append(node, nodeQueue)
|
||||||
{
|
{
|
||||||
ViewDependencyNode *dependingNode = NULL;
|
ViewDependencyNode *dependingNode = NULL;
|
||||||
foreach_ptr(dependingNode, node->dependingNodes)
|
foreach_declared_ptr(dependingNode, node->dependingNodes)
|
||||||
{
|
{
|
||||||
ObjectAddress relationAddress = { 0 };
|
ObjectAddress relationAddress = { 0 };
|
||||||
ObjectAddressSet(relationAddress, RelationRelationId, dependingNode->id);
|
ObjectAddressSet(relationAddress, RelationRelationId, dependingNode->id);
|
||||||
|
|
|
@ -554,7 +554,7 @@ bool
|
||||||
IsAnyObjectDistributed(const List *addresses)
|
IsAnyObjectDistributed(const List *addresses)
|
||||||
{
|
{
|
||||||
ObjectAddress *address = NULL;
|
ObjectAddress *address = NULL;
|
||||||
foreach_ptr(address, addresses)
|
foreach_declared_ptr(address, addresses)
|
||||||
{
|
{
|
||||||
if (IsObjectDistributed(address))
|
if (IsObjectDistributed(address))
|
||||||
{
|
{
|
||||||
|
|
|
@ -661,6 +661,18 @@ GetTableTypeName(Oid tableId)
|
||||||
bool
|
bool
|
||||||
IsCitusTable(Oid relationId)
|
IsCitusTable(Oid relationId)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* PostgreSQL's OID generator assigns user operation OIDs starting
|
||||||
|
* from FirstNormalObjectId. This means no user object can have
|
||||||
|
* an OID lower than FirstNormalObjectId. Therefore, if the
|
||||||
|
* relationId is less than FirstNormalObjectId
|
||||||
|
* (i.e. in PostgreSQL's reserved range), we can immediately
|
||||||
|
* return false, since such objects cannot be Citus tables.
|
||||||
|
*/
|
||||||
|
if (relationId < FirstNormalObjectId)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return LookupCitusTableCacheEntry(relationId) != NULL;
|
return LookupCitusTableCacheEntry(relationId) != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -920,7 +932,7 @@ CitusTableList(void)
|
||||||
List *citusTableIdList = CitusTableTypeIdList(ANY_CITUS_TABLE_TYPE);
|
List *citusTableIdList = CitusTableTypeIdList(ANY_CITUS_TABLE_TYPE);
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, citusTableIdList)
|
foreach_declared_oid(relationId, citusTableIdList)
|
||||||
{
|
{
|
||||||
CitusTableCacheEntry *cacheEntry = GetCitusTableCacheEntry(relationId);
|
CitusTableCacheEntry *cacheEntry = GetCitusTableCacheEntry(relationId);
|
||||||
|
|
||||||
|
@ -1891,7 +1903,7 @@ BuildCachedShardList(CitusTableCacheEntry *cacheEntry)
|
||||||
sizeof(int));
|
sizeof(int));
|
||||||
|
|
||||||
HeapTuple shardTuple = NULL;
|
HeapTuple shardTuple = NULL;
|
||||||
foreach_ptr(shardTuple, distShardTupleList)
|
foreach_declared_ptr(shardTuple, distShardTupleList)
|
||||||
{
|
{
|
||||||
ShardInterval *shardInterval = TupleToShardInterval(shardTuple,
|
ShardInterval *shardInterval = TupleToShardInterval(shardTuple,
|
||||||
distShardTupleDesc,
|
distShardTupleDesc,
|
||||||
|
@ -2029,7 +2041,7 @@ BuildCachedShardList(CitusTableCacheEntry *cacheEntry)
|
||||||
GroupShardPlacement *placementArray = palloc0(numberOfPlacements *
|
GroupShardPlacement *placementArray = palloc0(numberOfPlacements *
|
||||||
sizeof(GroupShardPlacement));
|
sizeof(GroupShardPlacement));
|
||||||
GroupShardPlacement *srcPlacement = NULL;
|
GroupShardPlacement *srcPlacement = NULL;
|
||||||
foreach_ptr(srcPlacement, placementList)
|
foreach_declared_ptr(srcPlacement, placementList)
|
||||||
{
|
{
|
||||||
placementArray[placementOffset] = *srcPlacement;
|
placementArray[placementOffset] = *srcPlacement;
|
||||||
placementOffset++;
|
placementOffset++;
|
||||||
|
@ -4335,7 +4347,7 @@ InitializeWorkerNodeCache(void)
|
||||||
|
|
||||||
/* iterate over the worker node list */
|
/* iterate over the worker node list */
|
||||||
WorkerNode *currentNode = NULL;
|
WorkerNode *currentNode = NULL;
|
||||||
foreach_ptr(currentNode, workerNodeList)
|
foreach_declared_ptr(currentNode, workerNodeList)
|
||||||
{
|
{
|
||||||
bool handleFound = false;
|
bool handleFound = false;
|
||||||
|
|
||||||
|
@ -4512,7 +4524,7 @@ GetLocalNodeId(void)
|
||||||
List *workerNodeList = ReadDistNode(includeNodesFromOtherClusters);
|
List *workerNodeList = ReadDistNode(includeNodesFromOtherClusters);
|
||||||
|
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_declared_ptr(workerNode, workerNodeList)
|
||||||
{
|
{
|
||||||
if (workerNode->groupId == localGroupId &&
|
if (workerNode->groupId == localGroupId &&
|
||||||
workerNode->isActive)
|
workerNode->isActive)
|
||||||
|
@ -5100,7 +5112,7 @@ CitusTableCacheFlushInvalidatedEntries()
|
||||||
if (DistTableCacheHash != NULL && DistTableCacheExpired != NIL)
|
if (DistTableCacheHash != NULL && DistTableCacheExpired != NIL)
|
||||||
{
|
{
|
||||||
CitusTableCacheEntry *cacheEntry = NULL;
|
CitusTableCacheEntry *cacheEntry = NULL;
|
||||||
foreach_ptr(cacheEntry, DistTableCacheExpired)
|
foreach_declared_ptr(cacheEntry, DistTableCacheExpired)
|
||||||
{
|
{
|
||||||
ResetCitusTableCacheEntry(cacheEntry);
|
ResetCitusTableCacheEntry(cacheEntry);
|
||||||
}
|
}
|
||||||
|
|
|
@ -307,7 +307,7 @@ CreateDependingViewsOnWorkers(Oid relationId)
|
||||||
SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION);
|
SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION);
|
||||||
|
|
||||||
Oid viewOid = InvalidOid;
|
Oid viewOid = InvalidOid;
|
||||||
foreach_oid(viewOid, views)
|
foreach_declared_oid(viewOid, views)
|
||||||
{
|
{
|
||||||
if (!ShouldMarkRelationDistributed(viewOid))
|
if (!ShouldMarkRelationDistributed(viewOid))
|
||||||
{
|
{
|
||||||
|
@ -347,7 +347,7 @@ AddTableToPublications(Oid relationId)
|
||||||
|
|
||||||
SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION);
|
SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION);
|
||||||
|
|
||||||
foreach_oid(publicationId, publicationIds)
|
foreach_declared_oid(publicationId, publicationIds)
|
||||||
{
|
{
|
||||||
ObjectAddress *publicationAddress = palloc0(sizeof(ObjectAddress));
|
ObjectAddress *publicationAddress = palloc0(sizeof(ObjectAddress));
|
||||||
ObjectAddressSet(*publicationAddress, PublicationRelationId, publicationId);
|
ObjectAddressSet(*publicationAddress, PublicationRelationId, publicationId);
|
||||||
|
@ -818,7 +818,7 @@ NodeListInsertCommand(List *workerNodeList)
|
||||||
|
|
||||||
/* iterate over the worker nodes, add the values */
|
/* iterate over the worker nodes, add the values */
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_declared_ptr(workerNode, workerNodeList)
|
||||||
{
|
{
|
||||||
char *hasMetadataString = workerNode->hasMetadata ? "TRUE" : "FALSE";
|
char *hasMetadataString = workerNode->hasMetadata ? "TRUE" : "FALSE";
|
||||||
char *metadataSyncedString = workerNode->metadataSynced ? "TRUE" : "FALSE";
|
char *metadataSyncedString = workerNode->metadataSynced ? "TRUE" : "FALSE";
|
||||||
|
@ -946,7 +946,7 @@ MarkObjectsDistributedCreateCommand(List *addresses,
|
||||||
|
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
bool firstInNameLoop = true;
|
bool firstInNameLoop = true;
|
||||||
foreach_ptr(name, names)
|
foreach_declared_ptr(name, names)
|
||||||
{
|
{
|
||||||
if (!firstInNameLoop)
|
if (!firstInNameLoop)
|
||||||
{
|
{
|
||||||
|
@ -961,7 +961,7 @@ MarkObjectsDistributedCreateCommand(List *addresses,
|
||||||
|
|
||||||
char *arg;
|
char *arg;
|
||||||
bool firstInArgLoop = true;
|
bool firstInArgLoop = true;
|
||||||
foreach_ptr(arg, args)
|
foreach_declared_ptr(arg, args)
|
||||||
{
|
{
|
||||||
if (!firstInArgLoop)
|
if (!firstInArgLoop)
|
||||||
{
|
{
|
||||||
|
@ -1217,13 +1217,13 @@ ShardListInsertCommand(List *shardIntervalList)
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
bool firstPlacementProcessed = false;
|
bool firstPlacementProcessed = false;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
List *shardPlacementList = ActiveShardPlacementList(shardId);
|
List *shardPlacementList = ActiveShardPlacementList(shardId);
|
||||||
|
|
||||||
ShardPlacement *placement = NULL;
|
ShardPlacement *placement = NULL;
|
||||||
foreach_ptr(placement, shardPlacementList)
|
foreach_declared_ptr(placement, shardPlacementList)
|
||||||
{
|
{
|
||||||
if (firstPlacementProcessed)
|
if (firstPlacementProcessed)
|
||||||
{
|
{
|
||||||
|
@ -1257,7 +1257,7 @@ ShardListInsertCommand(List *shardIntervalList)
|
||||||
"WITH shard_data(relationname, shardid, storagetype, "
|
"WITH shard_data(relationname, shardid, storagetype, "
|
||||||
"shardminvalue, shardmaxvalue) AS (VALUES ");
|
"shardminvalue, shardmaxvalue) AS (VALUES ");
|
||||||
|
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
Oid distributedRelationId = shardInterval->relationId;
|
Oid distributedRelationId = shardInterval->relationId;
|
||||||
|
@ -1694,7 +1694,7 @@ GetDependentRelationsWithSequence(Oid sequenceOid, char depType)
|
||||||
Oid attrDefOid;
|
Oid attrDefOid;
|
||||||
List *attrDefOids = GetAttrDefsFromSequence(sequenceOid);
|
List *attrDefOids = GetAttrDefsFromSequence(sequenceOid);
|
||||||
|
|
||||||
foreach_oid(attrDefOid, attrDefOids)
|
foreach_declared_oid(attrDefOid, attrDefOids)
|
||||||
{
|
{
|
||||||
ObjectAddress columnAddress = GetAttrDefaultColumnAddress(attrDefOid);
|
ObjectAddress columnAddress = GetAttrDefaultColumnAddress(attrDefOid);
|
||||||
relations = lappend_oid(relations, columnAddress.objectId);
|
relations = lappend_oid(relations, columnAddress.objectId);
|
||||||
|
@ -1750,48 +1750,6 @@ GetSequencesFromAttrDef(Oid attrdefOid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if PG_VERSION_NUM < PG_VERSION_15
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Given a pg_attrdef OID, return the relation OID and column number of
|
|
||||||
* the owning column (represented as an ObjectAddress for convenience).
|
|
||||||
*
|
|
||||||
* Returns InvalidObjectAddress if there is no such pg_attrdef entry.
|
|
||||||
*/
|
|
||||||
ObjectAddress
|
|
||||||
GetAttrDefaultColumnAddress(Oid attrdefoid)
|
|
||||||
{
|
|
||||||
ObjectAddress result = InvalidObjectAddress;
|
|
||||||
ScanKeyData skey[1];
|
|
||||||
HeapTuple tup;
|
|
||||||
|
|
||||||
Relation attrdef = table_open(AttrDefaultRelationId, AccessShareLock);
|
|
||||||
ScanKeyInit(&skey[0],
|
|
||||||
Anum_pg_attrdef_oid,
|
|
||||||
BTEqualStrategyNumber, F_OIDEQ,
|
|
||||||
ObjectIdGetDatum(attrdefoid));
|
|
||||||
SysScanDesc scan = systable_beginscan(attrdef, AttrDefaultOidIndexId, true,
|
|
||||||
NULL, 1, skey);
|
|
||||||
|
|
||||||
if (HeapTupleIsValid(tup = systable_getnext(scan)))
|
|
||||||
{
|
|
||||||
Form_pg_attrdef atdform = (Form_pg_attrdef) GETSTRUCT(tup);
|
|
||||||
|
|
||||||
result.classId = RelationRelationId;
|
|
||||||
result.objectId = atdform->adrelid;
|
|
||||||
result.objectSubId = atdform->adnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
systable_endscan(scan);
|
|
||||||
table_close(attrdef, AccessShareLock);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GetAttrDefsFromSequence returns a list of attrdef OIDs that have
|
* GetAttrDefsFromSequence returns a list of attrdef OIDs that have
|
||||||
* a dependency on the given sequence
|
* a dependency on the given sequence
|
||||||
|
@ -1890,7 +1848,7 @@ GetDependentFunctionsWithRelation(Oid relationId)
|
||||||
table_close(depRel, AccessShareLock);
|
table_close(depRel, AccessShareLock);
|
||||||
|
|
||||||
ObjectAddress *referencingObject = NULL;
|
ObjectAddress *referencingObject = NULL;
|
||||||
foreach_ptr(referencingObject, referencingObjects)
|
foreach_declared_ptr(referencingObject, referencingObjects)
|
||||||
{
|
{
|
||||||
functionOids = list_concat(functionOids,
|
functionOids = list_concat(functionOids,
|
||||||
GetFunctionDependenciesForObjects(referencingObject));
|
GetFunctionDependenciesForObjects(referencingObject));
|
||||||
|
@ -2771,7 +2729,7 @@ HasMetadataWorkers(void)
|
||||||
List *workerNodeList = ActiveReadableNonCoordinatorNodeList();
|
List *workerNodeList = ActiveReadableNonCoordinatorNodeList();
|
||||||
|
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_declared_ptr(workerNode, workerNodeList)
|
||||||
{
|
{
|
||||||
if (workerNode->hasMetadata)
|
if (workerNode->hasMetadata)
|
||||||
{
|
{
|
||||||
|
@ -2804,7 +2762,7 @@ CreateInterTableRelationshipOfRelationOnWorkers(Oid relationId)
|
||||||
SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION);
|
SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION);
|
||||||
|
|
||||||
const char *command = NULL;
|
const char *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
SendCommandToWorkersWithMetadata(command);
|
SendCommandToWorkersWithMetadata(command);
|
||||||
}
|
}
|
||||||
|
@ -2857,14 +2815,14 @@ CreateShellTableOnWorkers(Oid relationId)
|
||||||
creatingShellTableOnRemoteNode);
|
creatingShellTableOnRemoteNode);
|
||||||
|
|
||||||
TableDDLCommand *tableDDLCommand = NULL;
|
TableDDLCommand *tableDDLCommand = NULL;
|
||||||
foreach_ptr(tableDDLCommand, tableDDLCommands)
|
foreach_declared_ptr(tableDDLCommand, tableDDLCommands)
|
||||||
{
|
{
|
||||||
Assert(CitusIsA(tableDDLCommand, TableDDLCommand));
|
Assert(CitusIsA(tableDDLCommand, TableDDLCommand));
|
||||||
commandList = lappend(commandList, GetTableDDLCommand(tableDDLCommand));
|
commandList = lappend(commandList, GetTableDDLCommand(tableDDLCommand));
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *command = NULL;
|
const char *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
SendCommandToWorkersWithMetadata(command);
|
SendCommandToWorkersWithMetadata(command);
|
||||||
}
|
}
|
||||||
|
@ -2888,7 +2846,7 @@ CreateTableMetadataOnWorkers(Oid relationId)
|
||||||
|
|
||||||
/* send the commands one by one */
|
/* send the commands one by one */
|
||||||
const char *command = NULL;
|
const char *command = NULL;
|
||||||
foreach_ptr(command, commandList)
|
foreach_declared_ptr(command, commandList)
|
||||||
{
|
{
|
||||||
SendCommandToWorkersWithMetadata(command);
|
SendCommandToWorkersWithMetadata(command);
|
||||||
}
|
}
|
||||||
|
@ -2912,7 +2870,7 @@ DetachPartitionCommandList(void)
|
||||||
|
|
||||||
/* we iterate over all distributed partitioned tables and DETACH their partitions */
|
/* we iterate over all distributed partitioned tables and DETACH their partitions */
|
||||||
CitusTableCacheEntry *cacheEntry = NULL;
|
CitusTableCacheEntry *cacheEntry = NULL;
|
||||||
foreach_ptr(cacheEntry, distributedTableList)
|
foreach_declared_ptr(cacheEntry, distributedTableList)
|
||||||
{
|
{
|
||||||
if (!PartitionedTable(cacheEntry->relationId))
|
if (!PartitionedTable(cacheEntry->relationId))
|
||||||
{
|
{
|
||||||
|
@ -2976,7 +2934,7 @@ SyncNodeMetadataToNodesOptional(void)
|
||||||
List *syncedWorkerList = NIL;
|
List *syncedWorkerList = NIL;
|
||||||
List *workerList = ActivePrimaryNonCoordinatorNodeList(NoLock);
|
List *workerList = ActivePrimaryNonCoordinatorNodeList(NoLock);
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerList)
|
foreach_declared_ptr(workerNode, workerList)
|
||||||
{
|
{
|
||||||
if (workerNode->hasMetadata && !workerNode->metadataSynced)
|
if (workerNode->hasMetadata && !workerNode->metadataSynced)
|
||||||
{
|
{
|
||||||
|
@ -2996,7 +2954,7 @@ SyncNodeMetadataToNodesOptional(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach_ptr(workerNode, syncedWorkerList)
|
foreach_declared_ptr(workerNode, syncedWorkerList)
|
||||||
{
|
{
|
||||||
SetWorkerColumnOptional(workerNode, Anum_pg_dist_node_metadatasynced,
|
SetWorkerColumnOptional(workerNode, Anum_pg_dist_node_metadatasynced,
|
||||||
BoolGetDatum(true));
|
BoolGetDatum(true));
|
||||||
|
@ -3041,7 +2999,7 @@ SyncNodeMetadataToNodes(void)
|
||||||
|
|
||||||
List *workerList = ActivePrimaryNonCoordinatorNodeList(NoLock);
|
List *workerList = ActivePrimaryNonCoordinatorNodeList(NoLock);
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerList)
|
foreach_declared_ptr(workerNode, workerList)
|
||||||
{
|
{
|
||||||
if (workerNode->hasMetadata)
|
if (workerNode->hasMetadata)
|
||||||
{
|
{
|
||||||
|
@ -3113,7 +3071,6 @@ SyncNodeMetadataToNodesMain(Datum main_arg)
|
||||||
|
|
||||||
PopActiveSnapshot();
|
PopActiveSnapshot();
|
||||||
CommitTransactionCommand();
|
CommitTransactionCommand();
|
||||||
ProcessCompletedNotifies();
|
|
||||||
|
|
||||||
if (syncedAllNodes)
|
if (syncedAllNodes)
|
||||||
{
|
{
|
||||||
|
@ -3280,7 +3237,7 @@ ShouldInitiateMetadataSync(bool *lockFailure)
|
||||||
|
|
||||||
List *workerList = ActivePrimaryNonCoordinatorNodeList(NoLock);
|
List *workerList = ActivePrimaryNonCoordinatorNodeList(NoLock);
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerList)
|
foreach_declared_ptr(workerNode, workerList)
|
||||||
{
|
{
|
||||||
if (workerNode->hasMetadata && !workerNode->metadataSynced)
|
if (workerNode->hasMetadata && !workerNode->metadataSynced)
|
||||||
{
|
{
|
||||||
|
@ -3638,7 +3595,7 @@ EnsureShardMetadataIsSane(Oid relationId, int64 shardId, char storageType,
|
||||||
GetFunctionInfo(intervalTypeId, BTREE_AM_OID, BTORDER_PROC);
|
GetFunctionInfo(intervalTypeId, BTREE_AM_OID, BTORDER_PROC);
|
||||||
|
|
||||||
HeapTuple shardTuple = NULL;
|
HeapTuple shardTuple = NULL;
|
||||||
foreach_ptr(shardTuple, distShardTupleList)
|
foreach_declared_ptr(shardTuple, distShardTupleList)
|
||||||
{
|
{
|
||||||
ShardInterval *shardInterval =
|
ShardInterval *shardInterval =
|
||||||
TupleToShardInterval(shardTuple, distShardTupleDesc,
|
TupleToShardInterval(shardTuple, distShardTupleDesc,
|
||||||
|
@ -3934,7 +3891,7 @@ citus_internal_delete_shard_metadata(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
List *shardPlacementList = ShardPlacementList(shardId);
|
List *shardPlacementList = ShardPlacementList(shardId);
|
||||||
ShardPlacement *shardPlacement = NULL;
|
ShardPlacement *shardPlacement = NULL;
|
||||||
foreach_ptr(shardPlacement, shardPlacementList)
|
foreach_declared_ptr(shardPlacement, shardPlacementList)
|
||||||
{
|
{
|
||||||
DeleteShardPlacementRow(shardPlacement->placementId);
|
DeleteShardPlacementRow(shardPlacement->placementId);
|
||||||
}
|
}
|
||||||
|
@ -4503,7 +4460,7 @@ SetMetadataSyncNodesFromNodeList(MetadataSyncContext *context, List *nodeList)
|
||||||
List *activatedWorkerNodeList = NIL;
|
List *activatedWorkerNodeList = NIL;
|
||||||
|
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
foreach_ptr(node, nodeList)
|
foreach_declared_ptr(node, nodeList)
|
||||||
{
|
{
|
||||||
if (NodeIsPrimary(node))
|
if (NodeIsPrimary(node))
|
||||||
{
|
{
|
||||||
|
@ -4538,7 +4495,7 @@ EstablishAndSetMetadataSyncBareConnections(MetadataSyncContext *context)
|
||||||
/* establish bare connections to activated worker nodes */
|
/* establish bare connections to activated worker nodes */
|
||||||
List *bareConnectionList = NIL;
|
List *bareConnectionList = NIL;
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
foreach_ptr(node, context->activatedWorkerNodeList)
|
foreach_declared_ptr(node, context->activatedWorkerNodeList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = GetNodeUserDatabaseConnection(connectionFlags,
|
MultiConnection *connection = GetNodeUserDatabaseConnection(connectionFlags,
|
||||||
node->workerName,
|
node->workerName,
|
||||||
|
@ -5147,7 +5104,7 @@ SendDependencyCreationCommands(MetadataSyncContext *context)
|
||||||
ALLOCSET_DEFAULT_SIZES);
|
ALLOCSET_DEFAULT_SIZES);
|
||||||
MemoryContextSwitchTo(commandsContext);
|
MemoryContextSwitchTo(commandsContext);
|
||||||
ObjectAddress *dependency = NULL;
|
ObjectAddress *dependency = NULL;
|
||||||
foreach_ptr(dependency, dependencies)
|
foreach_declared_ptr(dependency, dependencies)
|
||||||
{
|
{
|
||||||
if (!MetadataSyncCollectsCommands(context))
|
if (!MetadataSyncCollectsCommands(context))
|
||||||
{
|
{
|
||||||
|
|
|
@ -420,7 +420,7 @@ OpenConnectionToNodes(List *workerNodeList)
|
||||||
{
|
{
|
||||||
List *connectionList = NIL;
|
List *connectionList = NIL;
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_declared_ptr(workerNode, workerNodeList)
|
||||||
{
|
{
|
||||||
const char *nodeName = workerNode->workerName;
|
const char *nodeName = workerNode->workerName;
|
||||||
int nodePort = workerNode->workerPort;
|
int nodePort = workerNode->workerPort;
|
||||||
|
@ -444,7 +444,7 @@ GenerateShardStatisticsQueryList(List *workerNodeList, List *citusTableIds)
|
||||||
{
|
{
|
||||||
List *shardStatisticsQueryList = NIL;
|
List *shardStatisticsQueryList = NIL;
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_declared_ptr(workerNode, workerNodeList)
|
||||||
{
|
{
|
||||||
char *shardStatisticsQuery =
|
char *shardStatisticsQuery =
|
||||||
GenerateAllShardStatisticsQueryForNode(workerNode, citusTableIds);
|
GenerateAllShardStatisticsQueryForNode(workerNode, citusTableIds);
|
||||||
|
@ -465,7 +465,7 @@ ReceiveShardIdAndSizeResults(List *connectionList, Tuplestorestate *tupleStore,
|
||||||
TupleDesc tupleDescriptor)
|
TupleDesc tupleDescriptor)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = NULL;
|
MultiConnection *connection = NULL;
|
||||||
foreach_ptr(connection, connectionList)
|
foreach_declared_ptr(connection, connectionList)
|
||||||
{
|
{
|
||||||
bool raiseInterrupts = true;
|
bool raiseInterrupts = true;
|
||||||
Datum values[SHARD_SIZES_COLUMN_COUNT];
|
Datum values[SHARD_SIZES_COLUMN_COUNT];
|
||||||
|
@ -559,7 +559,7 @@ DistributedRelationSize(Oid relationId, SizeQueryType sizeQueryType,
|
||||||
|
|
||||||
List *workerNodeList = ActiveReadableNodeList();
|
List *workerNodeList = ActiveReadableNodeList();
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_declared_ptr(workerNode, workerNodeList)
|
||||||
{
|
{
|
||||||
uint64 relationSizeOnNode = 0;
|
uint64 relationSizeOnNode = 0;
|
||||||
|
|
||||||
|
@ -780,7 +780,7 @@ GenerateSizeQueryOnMultiplePlacements(List *shardIntervalList,
|
||||||
List *nonPartitionedShardNames = NIL;
|
List *nonPartitionedShardNames = NIL;
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
if (optimizePartitionCalculations && PartitionTable(shardInterval->relationId))
|
if (optimizePartitionCalculations && PartitionTable(shardInterval->relationId))
|
||||||
{
|
{
|
||||||
|
@ -859,7 +859,7 @@ GenerateSizeQueryForRelationNameList(List *quotedShardNames, char *sizeFunction)
|
||||||
|
|
||||||
bool addComma = false;
|
bool addComma = false;
|
||||||
char *quotedShardName = NULL;
|
char *quotedShardName = NULL;
|
||||||
foreach_ptr(quotedShardName, quotedShardNames)
|
foreach_declared_ptr(quotedShardName, quotedShardNames)
|
||||||
{
|
{
|
||||||
if (addComma)
|
if (addComma)
|
||||||
{
|
{
|
||||||
|
@ -960,7 +960,7 @@ GenerateAllShardStatisticsQueryForNode(WorkerNode *workerNode, List *citusTableI
|
||||||
appendStringInfoString(allShardStatisticsQuery, " FROM (VALUES ");
|
appendStringInfoString(allShardStatisticsQuery, " FROM (VALUES ");
|
||||||
|
|
||||||
Oid relationId = InvalidOid;
|
Oid relationId = InvalidOid;
|
||||||
foreach_oid(relationId, citusTableIds)
|
foreach_declared_oid(relationId, citusTableIds)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Ensure the table still exists by trying to acquire a lock on it
|
* Ensure the table still exists by trying to acquire a lock on it
|
||||||
|
@ -1007,7 +1007,7 @@ GenerateShardIdNameValuesForShardList(List *shardIntervalList, bool firstValue)
|
||||||
StringInfo selectQuery = makeStringInfo();
|
StringInfo selectQuery = makeStringInfo();
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
if (!firstValue)
|
if (!firstValue)
|
||||||
{
|
{
|
||||||
|
@ -1147,7 +1147,7 @@ TableShardReplicationFactor(Oid relationId)
|
||||||
|
|
||||||
List *shardIntervalList = LoadShardIntervalList(relationId);
|
List *shardIntervalList = LoadShardIntervalList(relationId);
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_declared_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
|
|
||||||
|
@ -1238,7 +1238,7 @@ LoadUnsortedShardIntervalListViaCatalog(Oid relationId)
|
||||||
&intervalTypeMod);
|
&intervalTypeMod);
|
||||||
|
|
||||||
HeapTuple distShardTuple = NULL;
|
HeapTuple distShardTuple = NULL;
|
||||||
foreach_ptr(distShardTuple, distShardTuples)
|
foreach_declared_ptr(distShardTuple, distShardTuples)
|
||||||
{
|
{
|
||||||
ShardInterval *interval = TupleToShardInterval(distShardTuple,
|
ShardInterval *interval = TupleToShardInterval(distShardTuple,
|
||||||
distShardTupleDesc,
|
distShardTupleDesc,
|
||||||
|
@ -1487,7 +1487,7 @@ FilterShardPlacementList(List *shardPlacementList, bool (*filter)(ShardPlacement
|
||||||
List *filteredShardPlacementList = NIL;
|
List *filteredShardPlacementList = NIL;
|
||||||
ShardPlacement *shardPlacement = NULL;
|
ShardPlacement *shardPlacement = NULL;
|
||||||
|
|
||||||
foreach_ptr(shardPlacement, shardPlacementList)
|
foreach_declared_ptr(shardPlacement, shardPlacementList)
|
||||||
{
|
{
|
||||||
if (filter(shardPlacement))
|
if (filter(shardPlacement))
|
||||||
{
|
{
|
||||||
|
@ -1511,7 +1511,7 @@ FilterActiveShardPlacementListByNode(List *shardPlacementList, WorkerNode *worke
|
||||||
List *filteredShardPlacementList = NIL;
|
List *filteredShardPlacementList = NIL;
|
||||||
ShardPlacement *shardPlacement = NULL;
|
ShardPlacement *shardPlacement = NULL;
|
||||||
|
|
||||||
foreach_ptr(shardPlacement, activeShardPlacementList)
|
foreach_declared_ptr(shardPlacement, activeShardPlacementList)
|
||||||
{
|
{
|
||||||
if (IsPlacementOnWorkerNode(shardPlacement, workerNode))
|
if (IsPlacementOnWorkerNode(shardPlacement, workerNode))
|
||||||
{
|
{
|
||||||
|
@ -1535,7 +1535,7 @@ ActiveShardPlacementListOnGroup(uint64 shardId, int32 groupId)
|
||||||
|
|
||||||
List *activePlacementList = ActiveShardPlacementList(shardId);
|
List *activePlacementList = ActiveShardPlacementList(shardId);
|
||||||
ShardPlacement *shardPlacement = NULL;
|
ShardPlacement *shardPlacement = NULL;
|
||||||
foreach_ptr(shardPlacement, activePlacementList)
|
foreach_declared_ptr(shardPlacement, activePlacementList)
|
||||||
{
|
{
|
||||||
if (shardPlacement->groupId == groupId)
|
if (shardPlacement->groupId == groupId)
|
||||||
{
|
{
|
||||||
|
@ -3331,7 +3331,7 @@ ResetRunningBackgroundTasks(void)
|
||||||
|
|
||||||
/* there are tasks that need to release their lock before we can continue */
|
/* there are tasks that need to release their lock before we can continue */
|
||||||
int64 *taskId = NULL;
|
int64 *taskId = NULL;
|
||||||
foreach_ptr(taskId, taskIdsToWait)
|
foreach_declared_ptr(taskId, taskIdsToWait)
|
||||||
{
|
{
|
||||||
LOCKTAG locktag = { 0 };
|
LOCKTAG locktag = { 0 };
|
||||||
SET_LOCKTAG_BACKGROUND_TASK(locktag, *taskId);
|
SET_LOCKTAG_BACKGROUND_TASK(locktag, *taskId);
|
||||||
|
|
|
@ -990,7 +990,7 @@ MarkNodesNotSyncedInLoopBackConnection(MetadataSyncContext *context,
|
||||||
|
|
||||||
List *commandList = NIL;
|
List *commandList = NIL;
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, context->activatedWorkerNodeList)
|
foreach_declared_ptr(workerNode, context->activatedWorkerNodeList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We need to prevent self deadlock when we access pg_dist_node using separate
|
* We need to prevent self deadlock when we access pg_dist_node using separate
|
||||||
|
@ -1023,7 +1023,7 @@ SetNodeMetadata(MetadataSyncContext *context, bool localOnly)
|
||||||
List *updatedActivatedNodeList = NIL;
|
List *updatedActivatedNodeList = NIL;
|
||||||
|
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
foreach_ptr(node, context->activatedWorkerNodeList)
|
foreach_declared_ptr(node, context->activatedWorkerNodeList)
|
||||||
{
|
{
|
||||||
node = SetWorkerColumnLocalOnly(node, Anum_pg_dist_node_isactive,
|
node = SetWorkerColumnLocalOnly(node, Anum_pg_dist_node_isactive,
|
||||||
BoolGetDatum(true));
|
BoolGetDatum(true));
|
||||||
|
@ -1042,7 +1042,7 @@ SetNodeMetadata(MetadataSyncContext *context, bool localOnly)
|
||||||
if (!localOnly && EnableMetadataSync)
|
if (!localOnly && EnableMetadataSync)
|
||||||
{
|
{
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
foreach_ptr(node, context->activatedWorkerNodeList)
|
foreach_declared_ptr(node, context->activatedWorkerNodeList)
|
||||||
{
|
{
|
||||||
SetNodeStateViaMetadataContext(context, node, BoolGetDatum(true));
|
SetNodeStateViaMetadataContext(context, node, BoolGetDatum(true));
|
||||||
}
|
}
|
||||||
|
@ -1847,7 +1847,7 @@ FindNodeAnyClusterByNodeId(uint32 nodeId)
|
||||||
List *nodeList = ReadDistNode(includeNodesFromOtherClusters);
|
List *nodeList = ReadDistNode(includeNodesFromOtherClusters);
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
|
|
||||||
foreach_ptr(node, nodeList)
|
foreach_declared_ptr(node, nodeList)
|
||||||
{
|
{
|
||||||
if (node->nodeId == nodeId)
|
if (node->nodeId == nodeId)
|
||||||
{
|
{
|
||||||
|
@ -1869,7 +1869,7 @@ FindNodeWithNodeId(int nodeId, bool missingOk)
|
||||||
List *nodeList = ActiveReadableNodeList();
|
List *nodeList = ActiveReadableNodeList();
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
|
|
||||||
foreach_ptr(node, nodeList)
|
foreach_declared_ptr(node, nodeList)
|
||||||
{
|
{
|
||||||
if (node->nodeId == nodeId)
|
if (node->nodeId == nodeId)
|
||||||
{
|
{
|
||||||
|
@ -1897,7 +1897,7 @@ FindCoordinatorNodeId()
|
||||||
List *nodeList = ReadDistNode(includeNodesFromOtherClusters);
|
List *nodeList = ReadDistNode(includeNodesFromOtherClusters);
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
|
|
||||||
foreach_ptr(node, nodeList)
|
foreach_declared_ptr(node, nodeList)
|
||||||
{
|
{
|
||||||
if (NodeIsCoordinator(node))
|
if (NodeIsCoordinator(node))
|
||||||
{
|
{
|
||||||
|
@ -2027,7 +2027,7 @@ ErrorIfNodeContainsNonRemovablePlacements(WorkerNode *workerNode)
|
||||||
shardPlacements = SortList(shardPlacements, CompareGroupShardPlacements);
|
shardPlacements = SortList(shardPlacements, CompareGroupShardPlacements);
|
||||||
|
|
||||||
GroupShardPlacement *placement = NULL;
|
GroupShardPlacement *placement = NULL;
|
||||||
foreach_ptr(placement, shardPlacements)
|
foreach_declared_ptr(placement, shardPlacements)
|
||||||
{
|
{
|
||||||
if (!PlacementHasActivePlacementOnAnotherGroup(placement))
|
if (!PlacementHasActivePlacementOnAnotherGroup(placement))
|
||||||
{
|
{
|
||||||
|
@ -2063,7 +2063,7 @@ PlacementHasActivePlacementOnAnotherGroup(GroupShardPlacement *sourcePlacement)
|
||||||
|
|
||||||
bool foundActivePlacementOnAnotherGroup = false;
|
bool foundActivePlacementOnAnotherGroup = false;
|
||||||
ShardPlacement *activePlacement = NULL;
|
ShardPlacement *activePlacement = NULL;
|
||||||
foreach_ptr(activePlacement, activePlacementList)
|
foreach_declared_ptr(activePlacement, activePlacementList)
|
||||||
{
|
{
|
||||||
if (activePlacement->groupId != sourcePlacement->groupId)
|
if (activePlacement->groupId != sourcePlacement->groupId)
|
||||||
{
|
{
|
||||||
|
@ -2414,7 +2414,7 @@ SetWorkerColumnOptional(WorkerNode *workerNode, int columnIndex, Datum value)
|
||||||
|
|
||||||
/* open connections in parallel */
|
/* open connections in parallel */
|
||||||
WorkerNode *worker = NULL;
|
WorkerNode *worker = NULL;
|
||||||
foreach_ptr(worker, workerNodeList)
|
foreach_declared_ptr(worker, workerNodeList)
|
||||||
{
|
{
|
||||||
bool success = SendOptionalMetadataCommandListToWorkerInCoordinatedTransaction(
|
bool success = SendOptionalMetadataCommandListToWorkerInCoordinatedTransaction(
|
||||||
worker->workerName, worker->workerPort,
|
worker->workerName, worker->workerPort,
|
||||||
|
@ -3147,7 +3147,7 @@ static void
|
||||||
ErrorIfAnyNodeNotExist(List *nodeList)
|
ErrorIfAnyNodeNotExist(List *nodeList)
|
||||||
{
|
{
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
foreach_ptr(node, nodeList)
|
foreach_declared_ptr(node, nodeList)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* First, locally mark the node is active, if everything goes well,
|
* First, locally mark the node is active, if everything goes well,
|
||||||
|
@ -3196,7 +3196,7 @@ static void
|
||||||
SendDeletionCommandsForReplicatedTablePlacements(MetadataSyncContext *context)
|
SendDeletionCommandsForReplicatedTablePlacements(MetadataSyncContext *context)
|
||||||
{
|
{
|
||||||
WorkerNode *node = NULL;
|
WorkerNode *node = NULL;
|
||||||
foreach_ptr(node, context->activatedWorkerNodeList)
|
foreach_declared_ptr(node, context->activatedWorkerNodeList)
|
||||||
{
|
{
|
||||||
if (!node->isActive)
|
if (!node->isActive)
|
||||||
{
|
{
|
||||||
|
|
|
@ -283,9 +283,7 @@ PgGetObjectAddress(char *ttype, ArrayType *namearr, ArrayType *argsarr)
|
||||||
case OBJECT_FDW:
|
case OBJECT_FDW:
|
||||||
case OBJECT_FOREIGN_SERVER:
|
case OBJECT_FOREIGN_SERVER:
|
||||||
case OBJECT_LANGUAGE:
|
case OBJECT_LANGUAGE:
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
case OBJECT_PARAMETER_ACL:
|
case OBJECT_PARAMETER_ACL:
|
||||||
#endif
|
|
||||||
case OBJECT_PUBLICATION:
|
case OBJECT_PUBLICATION:
|
||||||
case OBJECT_ROLE:
|
case OBJECT_ROLE:
|
||||||
case OBJECT_SCHEMA:
|
case OBJECT_SCHEMA:
|
||||||
|
@ -323,9 +321,7 @@ PgGetObjectAddress(char *ttype, ArrayType *namearr, ArrayType *argsarr)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PG_VERSION_NUM >= PG_VERSION_15
|
|
||||||
case OBJECT_PUBLICATION_NAMESPACE:
|
case OBJECT_PUBLICATION_NAMESPACE:
|
||||||
#endif
|
|
||||||
case OBJECT_USER_MAPPING:
|
case OBJECT_USER_MAPPING:
|
||||||
{
|
{
|
||||||
objnode = (Node *) list_make2(linitial(name), linitial(args));
|
objnode = (Node *) list_make2(linitial(name), linitial(args));
|
||||||
|
|
|
@ -122,7 +122,7 @@ OpenConnectionsToAllWorkerNodes(LOCKMODE lockMode)
|
||||||
List *workerNodeList = ActivePrimaryNonCoordinatorNodeList(lockMode);
|
List *workerNodeList = ActivePrimaryNonCoordinatorNodeList(lockMode);
|
||||||
|
|
||||||
WorkerNode *workerNode = NULL;
|
WorkerNode *workerNode = NULL;
|
||||||
foreach_ptr(workerNode, workerNodeList)
|
foreach_declared_ptr(workerNode, workerNodeList)
|
||||||
{
|
{
|
||||||
MultiConnection *connection = StartNodeConnection(connectionFlags,
|
MultiConnection *connection = StartNodeConnection(connectionFlags,
|
||||||
workerNode->workerName,
|
workerNode->workerName,
|
||||||
|
@ -164,7 +164,7 @@ CreateRemoteRestorePoints(char *restoreName, List *connectionList)
|
||||||
const char *parameterValues[1] = { restoreName };
|
const char *parameterValues[1] = { restoreName };
|
||||||
|
|
||||||
MultiConnection *connection = NULL;
|
MultiConnection *connection = NULL;
|
||||||
foreach_ptr(connection, connectionList)
|
foreach_declared_ptr(connection, connectionList)
|
||||||
{
|
{
|
||||||
int querySent = SendRemoteCommandParams(connection, CREATE_RESTORE_POINT_COMMAND,
|
int querySent = SendRemoteCommandParams(connection, CREATE_RESTORE_POINT_COMMAND,
|
||||||
parameterCount, parameterTypes,
|
parameterCount, parameterTypes,
|
||||||
|
@ -175,7 +175,7 @@ CreateRemoteRestorePoints(char *restoreName, List *connectionList)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach_ptr(connection, connectionList)
|
foreach_declared_ptr(connection, connectionList)
|
||||||
{
|
{
|
||||||
PGresult *result = GetRemoteCommandResult(connection, true);
|
PGresult *result = GetRemoteCommandResult(connection, true);
|
||||||
if (!IsResponseOK(result))
|
if (!IsResponseOK(result))
|
||||||
|
|
|
@ -200,7 +200,7 @@ CreateShardsWithRoundRobinPolicy(Oid distributedTableId, int32 shardCount,
|
||||||
* each placement insertion.
|
* each placement insertion.
|
||||||
*/
|
*/
|
||||||
uint64 *shardIdPtr;
|
uint64 *shardIdPtr;
|
||||||
foreach_ptr(shardIdPtr, insertedShardIds)
|
foreach_declared_ptr(shardIdPtr, insertedShardIds)
|
||||||
{
|
{
|
||||||
List *placementsForShard = ShardPlacementList(*shardIdPtr);
|
List *placementsForShard = ShardPlacementList(*shardIdPtr);
|
||||||
insertedShardPlacements = list_concat(insertedShardPlacements,
|
insertedShardPlacements = list_concat(insertedShardPlacements,
|
||||||
|
@ -258,7 +258,7 @@ CreateColocatedShards(Oid targetRelationId, Oid sourceRelationId, bool
|
||||||
char targetShardStorageType = ShardStorageType(targetRelationId);
|
char targetShardStorageType = ShardStorageType(targetRelationId);
|
||||||
|
|
||||||
ShardInterval *sourceShardInterval = NULL;
|
ShardInterval *sourceShardInterval = NULL;
|
||||||
foreach_ptr(sourceShardInterval, sourceShardIntervalList)
|
foreach_declared_ptr(sourceShardInterval, sourceShardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 sourceShardId = sourceShardInterval->shardId;
|
uint64 sourceShardId = sourceShardInterval->shardId;
|
||||||
uint64 *newShardIdPtr = (uint64 *) palloc0(sizeof(uint64));
|
uint64 *newShardIdPtr = (uint64 *) palloc0(sizeof(uint64));
|
||||||
|
@ -286,7 +286,7 @@ CreateColocatedShards(Oid targetRelationId, Oid sourceRelationId, bool
|
||||||
shardMinValueText, shardMaxValueText);
|
shardMinValueText, shardMaxValueText);
|
||||||
|
|
||||||
ShardPlacement *sourcePlacement = NULL;
|
ShardPlacement *sourcePlacement = NULL;
|
||||||
foreach_ptr(sourcePlacement, sourceShardPlacementList)
|
foreach_declared_ptr(sourcePlacement, sourceShardPlacementList)
|
||||||
{
|
{
|
||||||
int32 groupId = sourcePlacement->groupId;
|
int32 groupId = sourcePlacement->groupId;
|
||||||
const uint64 shardSize = 0;
|
const uint64 shardSize = 0;
|
||||||
|
@ -304,7 +304,7 @@ CreateColocatedShards(Oid targetRelationId, Oid sourceRelationId, bool
|
||||||
* each placement insertion.
|
* each placement insertion.
|
||||||
*/
|
*/
|
||||||
uint64 *shardIdPtr;
|
uint64 *shardIdPtr;
|
||||||
foreach_ptr(shardIdPtr, insertedShardIds)
|
foreach_declared_ptr(shardIdPtr, insertedShardIds)
|
||||||
{
|
{
|
||||||
List *placementsForShard = ShardPlacementList(*shardIdPtr);
|
List *placementsForShard = ShardPlacementList(*shardIdPtr);
|
||||||
insertedShardPlacements = list_concat(insertedShardPlacements,
|
insertedShardPlacements = list_concat(insertedShardPlacements,
|
||||||
|
|
|
@ -250,12 +250,12 @@ DropShards(Oid relationId, char *schemaName, char *relationName,
|
||||||
bool shouldExecuteTasksLocally = ShouldExecuteTasksLocally(dropTaskList);
|
bool shouldExecuteTasksLocally = ShouldExecuteTasksLocally(dropTaskList);
|
||||||
|
|
||||||
Task *task = NULL;
|
Task *task = NULL;
|
||||||
foreach_ptr(task, dropTaskList)
|
foreach_declared_ptr(task, dropTaskList)
|
||||||
{
|
{
|
||||||
uint64 shardId = task->anchorShardId;
|
uint64 shardId = task->anchorShardId;
|
||||||
|
|
||||||
ShardPlacement *shardPlacement = NULL;
|
ShardPlacement *shardPlacement = NULL;
|
||||||
foreach_ptr(shardPlacement, task->taskPlacementList)
|
foreach_declared_ptr(shardPlacement, task->taskPlacementList)
|
||||||
{
|
{
|
||||||
uint64 shardPlacementId = shardPlacement->placementId;
|
uint64 shardPlacementId = shardPlacement->placementId;
|
||||||
int32 shardPlacementGroupId = shardPlacement->groupId;
|
int32 shardPlacementGroupId = shardPlacement->groupId;
|
||||||
|
@ -350,7 +350,7 @@ DropTaskList(Oid relationId, char *schemaName, char *relationName,
|
||||||
int taskId = 1;
|
int taskId = 1;
|
||||||
|
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
foreach_ptr(shardInterval, deletableShardIntervalList)
|
foreach_declared_ptr(shardInterval, deletableShardIntervalList)
|
||||||
{
|
{
|
||||||
Assert(shardInterval->relationId == relationId);
|
Assert(shardInterval->relationId == relationId);
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue