Skip to content

pg_query Parser Patches for Postgres 13.1 #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 7 commits into from

Conversation

lfittl
Copy link
Owner

@lfittl lfittl commented Jan 4, 2021

Do not merge. This PR only exists to track the patches that are applied for pg_query (13-latest branch) on top of Postgres 13.1.

lfittl added 7 commits January 3, 2021 15:39
Due to pg_stat_statements using $1, etc for substitution of constants, the
parser needs to support additional locations where these values are
allowed to be passed in.

Examples:

CREATE USER test PASSWORD $1;
ALTER USER test ENCRYPTED PASSWORD $2;
SET SCHEMA $3;
SET ROLE $4;
SET SESSION AUTHORIZATION $5;
SET TIME ZONE $6;
SELECT EXTRACT($1 FROM TIMESTAMP $2);
SELECT DATE $1;
SELECT INTERVAL $1;
SELECT INTERVAL $1 YEAR;
SELECT INTERVAL (6) $1;
This is for compatibility with Postgres 9.6 and older, which used ?
as the replacement character in pg_stat_statements.

Note that this intentionally breaks use of ? as an operator in some
uncommon cases.

This patch will likely be removed with the next major parser release, and
should be considered deprecated.
This is helpful for tracking the extent of tokens in the scan output,
as this is made available by pg_query for uses such as syntax highlighting.
For syntax highlighting and extracting comments from a query, its very
helpful to know the exact locations of a comment in the query string.

Previously the lexer discarded all comments as whitespace, making it
impossible to determine where they are located in the query string. With
this change, the lexer returns them as SQL_COMMENT/C_COMMENT tokens.
This seems like an oversight in the commit that added support for
FETCH FIRST... WITH TIES, and causes the parsetree to always have
limitOption = LIMIT_OPTION_COUNT, even when no LIMIT/OFFSET is specified.
This frees up the memory allocated to memory contexts that are kept
for future allocations. This behaves similar to changing aset.c's
MAX_FREE_CONTEXTS to 0, but only does the cleanup when called, and
allows the freelist approach to be used during Postgres operations.
This allows other source units to have the accompanying functions for
the already exported plpgsql_adddatum.
@lfittl lfittl force-pushed the lfittl/pg-query-pg13.1 branch from a41ac04 to e559545 Compare January 10, 2021 10:57
@lfittl
Copy link
Owner Author

lfittl commented Feb 20, 2021

Superseded by #3.

@lfittl lfittl closed this Feb 20, 2021
lfittl pushed a commit that referenced this pull request Nov 2, 2022
Due to how pg_size_pretty(bigint) was implemented, it's possible that when
given a negative number of bytes that the returning value would not match
the equivalent positive return value when given the equivalent positive
number of bytes.  This was due to two separate issues.

1. The function used bit shifting to convert the number of bytes into
larger units.  The rounding performed by bit shifting is not the same as
dividing.  For example -3 >> 1 = -2, but -3 / 2 = -1.  These two
operations are only equivalent with positive numbers.

2. The half_rounded() macro rounded towards positive infinity.  This meant
that negative numbers rounded towards zero and positive numbers rounded
away from zero.

Here we fix #1 by dividing the values instead of bit shifting.  We fix #2
by adjusting the half_rounded macro always to round away from zero.

Additionally, adjust the pg_size_pretty(numeric) function to be more
explicit that it's using division rather than bit shifting.  A casual
observer might have believed bit shifting was used due to a static
function being named numeric_shift_right.  However, that function was
calculating the divisor from the number of bits and performed division.
Here we make that more clear.  This change is just cosmetic and does not
affect the return value of the numeric version of the function.

Here we also add a set of regression tests both versions of
pg_size_pretty() which test the values directly before and after the
function switches to the next unit.

This bug was introduced in 8a1fab3. Prior to that negative values were
always displayed in bytes.

Author: Dean Rasheed, David Rowley
Discussion: https://postgr.es/m/CAEZATCXnNW4HsmZnxhfezR5FuiGgp+mkY4AzcL5eRGO4fuadWg@mail.gmail.com
Backpatch-through: 9.6, where the bug was introduced.
lfittl pushed a commit that referenced this pull request Nov 21, 2023
Commit e7cb7ee, which introduced the infrastructure for FDWs and
custom scan providers to replace joins with scans, failed to add support
handling of pseudoconstant quals assigned to replaced joins in
createplan.c, leading to an incorrect plan without a gating Result node
when postgres_fdw replaced a join with such a qual.

To fix, we could add the support by 1) modifying the ForeignPath and
CustomPath structs to store the list of RestrictInfo nodes to apply to
the join, as in JoinPaths, if they represent foreign and custom scans
replacing a join with a scan, and by 2) modifying create_scan_plan() in
createplan.c to use that list in that case, instead of the
baserestrictinfo list, to get pseudoconstant quals assigned to the join;
but #1 would cause an ABI break.  So fix by modifying the infrastructure
to just disallow replacing joins with such quals.

Back-patch to all supported branches.

Reported by Nishant Sharma.  Patch by me, reviewed by Nishant Sharma and
Richard Guo.

Discussion: https://postgr.es/m/CADrsxdbcN1vejBaf8a%2BQhrZY5PXL-04mCd4GDu6qm6FigDZd6Q%40mail.gmail.com
lfittl pushed a commit that referenced this pull request Nov 21, 2023
Default privileges are represented as NULL::aclitem[] in catalog ACL
columns, while revoking all privileges leaves an empty aclitem[].
These two cases used to produce identical output in psql meta-commands
like \dp.  Using something like "\pset null '(default)'" as a
workaround for spotting the difference did not work, because null
values were always displayed as empty strings by describe.c's
meta-commands.

This patch improves that with two changes:

1. Print "(none)" for empty privileges so that the user is able to
   distinguish them from default privileges, even without special
   workarounds.

2. Remove the special handling of null values in describe.c,
   so that "\pset null" is honored like everywhere else.
   (This affects all output from these commands, not only ACLs.)

The privileges shown by \dconfig+ and \ddp as well as the column
privileges shown by \dp are not affected by change #1, because the
respective aclitem[] is reset to NULL or deleted from the catalog
instead of leaving an empty array.

Erik Wienhold and Laurenz Albe

Discussion: https://postgr.es/m/1966228777.127452.1694979110595@office.mailbox.org
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant