Compare commits

..

No commits in common. "cf352ddcdd84d959774766347b24f4e800ffdd3c" and "3b0f20f6ce145b0cd5aefa147a7e425b60601a58" have entirely different histories.

18 changed files with 34 additions and 85 deletions

3
configure vendored
View File

@ -14179,9 +14179,6 @@ $as_echo_n "checking for OPENSSL... " >&6; }
$as_echo "$OPENSSL" >&6; }
fi
pgac_openssl_version="$($OPENSSL version 2> /dev/null || echo openssl not found)"
{ $as_echo "$as_me:${as_lineno-$LINENO}: using openssl: $pgac_openssl_version" >&5
$as_echo "$as_me: using openssl: $pgac_openssl_version" >&6;}
if test "$with_ssl" = openssl ; then
ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default"
if test "x$ac_cv_header_openssl_ssl_h" = xyes; then :

View File

@ -1571,8 +1571,6 @@ if test "$with_gssapi" = yes ; then
fi
PGAC_PATH_PROGS(OPENSSL, openssl)
pgac_openssl_version="$($OPENSSL version 2> /dev/null || echo openssl not found)"
AC_MSG_NOTICE([using openssl: $pgac_openssl_version])
if test "$with_ssl" = openssl ; then
AC_CHECK_HEADER(openssl/ssl.h, [], [AC_MSG_ERROR([header file <openssl/ssl.h> is required for OpenSSL])])
AC_CHECK_HEADER(openssl/err.h, [], [AC_MSG_ERROR([header file <openssl/err.h> is required for OpenSSL])])

View File

@ -1158,7 +1158,7 @@ SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true
<para>
<xref linkend="icu-collation-levels"/> shows which textual feature
differences are considered significant when determining equality at the
given level. The Unicode character <literal>U+2063</literal> is an
given level. The unicode character <literal>U+2063</literal> is an
invisible separator, and as seen in the table, is ignored for at all
levels of comparison less than <literal>identic</literal>.
</para>

View File

@ -984,7 +984,7 @@ mymap /^(.*)@otherdomain\.com$ guest
a slash (<literal>/</literal>), the remainder of the field is treated
as a regular expression (see <xref linkend="posix-syntax-details"/>
for details of <productname>PostgreSQL</productname>'s regular
expression syntax). It is not possible to use <literal>\1</literal>
expression syntax. It is not possible to use <literal>\1</literal>
to use a capture from regular expression on
<replaceable>system-username</replaceable> for a regular expression
on <replaceable>database-username</replaceable>.

View File

@ -332,13 +332,9 @@ aminsert (Relation indexRelation,
modify any columns covered by the index, but nevertheless requires a
new version in the index. The index AM may use this hint to decide
to apply bottom-up index deletion in parts of the index where many
versions of the same logical row accumulate. Note that updating a non-key
column or a column that only appears in a partial index predicate does not
affect the value of <literal>indexUnchanged</literal>. The core code
determines each tuple's <literal>indexUnchanged</literal> value using a low
overhead approach that allows both false positives and false negatives.
Index AMs must not treat <literal>indexUnchanged</literal> as an
authoritative source of information about tuple visibility or versioning.
versions of the same logical row accumulate. Note that updating a
non-key column does not affect the value of
<literal>indexUnchanged</literal>.
</para>
<para>

View File

@ -2103,9 +2103,9 @@ ninja
configure with the <option>--backend</option> option to select the one you
want to use and then build using <literal>meson compile</literal>. To
learn more about these backends and other arguments you can provide to
ninja, you can refer to the <ulink
ninja, you can refer to the meson <ulink
url="https://mesonbuild.com/Running-Meson.html#building-from-the-source">
Meson documentation</ulink>.
documentation</ulink>.
</para>
</step>

View File

@ -205,7 +205,7 @@ make update-po
<para>
The PO files can be edited with a regular text editor. There are also
several specialized editors for PO files which can help the process with
translation-specific features.
translation specific features.
There is (unsurprisingly) a PO mode for Emacs, which can be quite
useful.
</para>

View File

@ -209,7 +209,7 @@ block_fpi_data |
<para>
The <function>pg_filenode_relation</function> function (see
<xref linkend="functions-admin-dblocation"/>) can help you to
determine which relation was modified during original execution.
determine which relation was modified during original execution
</para>
</tip>
<para>

View File

@ -376,7 +376,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
an <command>UPDATE</command> that changes the partition key value can
cause a row to be moved from a local partition to a foreign-table
partition, provided the foreign data wrapper supports tuple routing.
However, it is not currently possible to move a row from a
However it is not currently possible to move a row from a
foreign-table partition to another partition.
An <command>UPDATE</command> that would require doing that will fail
due to the partitioning constraint, assuming that that is properly

View File

@ -1603,7 +1603,7 @@
<para>
Apply transaction locks are used in parallel mode to apply the transaction
in logical replication. The remote transaction ID is displayed in the
in logical replication. The remote transaction id is displayed in the
<structfield>transactionid</structfield> column. The <structfield>objsubid</structfield>
displays the lock subtype which is 0 for the lock used to synchronize the
set of changes, and 1 for the lock used to wait for the transaction to

View File

@ -156,7 +156,7 @@
<para>
When a top-level transaction with an xid commits, all of its
subcommitted child subtransactions are also persistently recorded
as committed in the <filename>pg_xact</filename> subdirectory. If the
as committed in the <filename>pg_xact</filename> directory. If the
top-level transaction aborts, all its subtransactions are also aborted,
even if they were subcommitted.
</para>

View File

@ -3966,10 +3966,10 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
* must be converted, and
* - the root partitioned table used for tuple routing.
*
* If it's a partitioned or inherited table, the root partition or
* appendrel RTE doesn't appear elsewhere in the plan and its RT index is
* given explicitly in node->rootRelation. Otherwise, the target relation
* is the sole relation in the node->resultRelations list.
* If it's a partitioned table, the root partition doesn't appear
* elsewhere in the plan and its RT index is given explicitly in
* node->rootRelation. Otherwise (i.e. table inheritance) the target
* relation is the first relation in the node->resultRelations list.
*----------
*/
if (node->rootRelation > 0)
@ -3980,7 +3980,6 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
}
else
{
Assert(list_length(node->resultRelations) == 1);
mtstate->rootResultRelInfo = mtstate->resultRelInfo;
ExecInitResultRelation(estate, mtstate->resultRelInfo,
linitial_int(node->resultRelations));

View File

@ -1780,9 +1780,6 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
parse->resultRelation);
int resultRelation = -1;
/* Pass the root result rel forward to the executor. */
rootRelation = parse->resultRelation;
/* Add only leaf children to ModifyTable. */
while ((resultRelation = bms_next_member(root->leaf_result_relids,
resultRelation)) >= 0)
@ -1906,7 +1903,6 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
else
{
/* Single-relation INSERT/UPDATE/DELETE/MERGE. */
rootRelation = 0; /* there's no separate root rel */
resultRelations = list_make1_int(parse->resultRelation);
if (parse->commandType == CMD_UPDATE)
updateColnosLists = list_make1(root->update_colnos);
@ -1918,6 +1914,16 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
mergeActionLists = list_make1(parse->mergeActionList);
}
/*
* If target is a partition root table, we need to mark the
* ModifyTable node appropriately for that.
*/
if (rt_fetch(parse->resultRelation, parse->rtable)->relkind ==
RELKIND_PARTITIONED_TABLE)
rootRelation = parse->resultRelation;
else
rootRelation = 0;
/*
* If there was a FOR [KEY] UPDATE/SHARE clause, the LockRows node
* will have dealt with fetching non-locked marked rows, else we

View File

@ -3646,7 +3646,7 @@ create_lockrows_path(PlannerInfo *root, RelOptInfo *rel,
* 'operation' is the operation type
* 'canSetTag' is true if we set the command tag/es_processed
* 'nominalRelation' is the parent RT index for use of EXPLAIN
* 'rootRelation' is the partitioned/inherited table root RTI, or 0 if none
* 'rootRelation' is the partitioned table root RT index, or 0 if none
* 'partColsUpdated' is true if any partitioning columns are being updated,
* either from the target relation or a descendent partitioned table.
* 'resultRelations' is an integer list of actual RT indexes of target rel(s)

View File

@ -2334,7 +2334,7 @@ typedef struct ModifyTablePath
CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
bool canSetTag; /* do we set the command tag/es_processed? */
Index nominalRelation; /* Parent RT index for use of EXPLAIN */
Index rootRelation; /* Root RT index, if partitioned/inherited */
Index rootRelation; /* Root RT index, if target is partitioned */
bool partColsUpdated; /* some part key in hierarchy updated? */
List *resultRelations; /* integer list of RT indexes */
List *updateColnosLists; /* per-target-table update_colnos lists */

View File

@ -216,12 +216,11 @@ typedef struct ProjectSet
* Apply rows produced by outer plan to result table(s),
* by inserting, updating, or deleting.
*
* If the originally named target table is a partitioned table or inheritance
* tree, both nominalRelation and rootRelation contain the RT index of the
* partition root or appendrel RTE, which is not otherwise mentioned in the
* plan. Otherwise rootRelation is zero. However, nominalRelation will
* always be set, as it's the rel that EXPLAIN should claim is the
* INSERT/UPDATE/DELETE/MERGE target.
* If the originally named target table is a partitioned table, both
* nominalRelation and rootRelation contain the RT index of the partition
* root, which is not otherwise mentioned in the plan. Otherwise rootRelation
* is zero. However, nominalRelation will always be set, as it's the rel that
* EXPLAIN should claim is the INSERT/UPDATE/DELETE/MERGE target.
*
* Note that rowMarks and epqParam are presumed to be valid for all the
* table(s); they can't contain any info that varies across tables.
@ -233,7 +232,7 @@ typedef struct ModifyTable
CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
bool canSetTag; /* do we set the command tag/es_processed? */
Index nominalRelation; /* Parent RT index for use of EXPLAIN */
Index rootRelation; /* Root RT index, if partitioned/inherited */
Index rootRelation; /* Root RT index, if target is partitioned */
bool partColsUpdated; /* some part key in hierarchy updated? */
List *resultRelations; /* integer list of RT indexes */
List *updateColnosLists; /* per-target-table update_colnos lists */

View File

@ -539,33 +539,6 @@ CREATE TEMP TABLE z (b TEXT, PRIMARY KEY(aa, b)) inherits (a);
INSERT INTO z VALUES (NULL, 'text'); -- should fail
ERROR: null value in column "aa" of relation "z" violates not-null constraint
DETAIL: Failing row contains (null, text).
-- Check inherited UPDATE with first child excluded
create table some_tab (f1 int, f2 int, f3 int, check (f1 < 10) no inherit);
create table some_tab_child () inherits(some_tab);
insert into some_tab_child select i, i+1, 0 from generate_series(1,1000) i;
create index on some_tab_child(f1, f2);
-- while at it, also check that statement-level triggers fire
create function some_tab_stmt_trig_func() returns trigger as
$$begin raise notice 'updating some_tab'; return NULL; end;$$
language plpgsql;
create trigger some_tab_stmt_trig
before update on some_tab execute function some_tab_stmt_trig_func();
explain (costs off)
update some_tab set f3 = 11 where f1 = 12 and f2 = 13;
QUERY PLAN
------------------------------------------------------------------------------------
Update on some_tab
Update on some_tab_child some_tab_1
-> Result
-> Index Scan using some_tab_child_f1_f2_idx on some_tab_child some_tab_1
Index Cond: ((f1 = 12) AND (f2 = 13))
(5 rows)
update some_tab set f3 = 11 where f1 = 12 and f2 = 13;
NOTICE: updating some_tab
drop table some_tab cascade;
NOTICE: drop cascades to table some_tab_child
drop function some_tab_stmt_trig_func();
-- Check inherited UPDATE with all children excluded
create table some_tab (a int, b int);
create table some_tab_child () inherits (some_tab);

View File

@ -97,25 +97,6 @@ SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
CREATE TEMP TABLE z (b TEXT, PRIMARY KEY(aa, b)) inherits (a);
INSERT INTO z VALUES (NULL, 'text'); -- should fail
-- Check inherited UPDATE with first child excluded
create table some_tab (f1 int, f2 int, f3 int, check (f1 < 10) no inherit);
create table some_tab_child () inherits(some_tab);
insert into some_tab_child select i, i+1, 0 from generate_series(1,1000) i;
create index on some_tab_child(f1, f2);
-- while at it, also check that statement-level triggers fire
create function some_tab_stmt_trig_func() returns trigger as
$$begin raise notice 'updating some_tab'; return NULL; end;$$
language plpgsql;
create trigger some_tab_stmt_trig
before update on some_tab execute function some_tab_stmt_trig_func();
explain (costs off)
update some_tab set f3 = 11 where f1 = 12 and f2 = 13;
update some_tab set f3 = 11 where f1 = 12 and f2 = 13;
drop table some_tab cascade;
drop function some_tab_stmt_trig_func();
-- Check inherited UPDATE with all children excluded
create table some_tab (a int, b int);
create table some_tab_child () inherits (some_tab);