agora inbox for pgsql-hackers@postgresql.orghelp / color / mirror / Atom feed
[PATCH v44 04/10] Fix crash caused by involuntary decoding of unrelated relations 476+ messages / 2 participants [nested] [flat]
* [PATCH v44 04/10] Fix crash caused by involuntary decoding of unrelated relations @ 2026-03-19 18:48 Álvaro Herrera <alvherre@kurilemu.de> 0 siblings, 0 replies; 476+ messages in thread From: Álvaro Herrera @ 2026-03-19 18:48 UTC (permalink / raw) Author: Srinath Reddy Sadipiralla <srinath2133@gmail.com> --- src/backend/commands/cluster.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index edb515d4b3e..b4acaeb6b93 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -2666,6 +2666,21 @@ repack_setup_logical_decoding(Oid relid) */ Assert(!ctx->fast_forward); + /* Avoid logical decoding of other relations. */ + rel = table_open(relid, AccessShareLock); + repacked_rel_locator = rel->rd_locator; + toastrelid = rel->rd_rel->reltoastrelid; + if (OidIsValid(toastrelid)) + { + Relation toastrel; + + /* Avoid logical decoding of other TOAST relations. */ + toastrel = table_open(toastrelid, AccessShareLock); + repacked_rel_toast_locator = toastrel->rd_locator; + table_close(toastrel, AccessShareLock); + } + table_close(rel, AccessShareLock); + DecodingContextFindStartpoint(ctx); /* @@ -2702,21 +2717,6 @@ repack_setup_logical_decoding(Oid relid) "REPACK - change", ALLOCSET_DEFAULT_SIZES); - /* Avoid logical decoding of other relations. */ - rel = table_open(relid, AccessShareLock); - repacked_rel_locator = rel->rd_locator; - toastrelid = rel->rd_rel->reltoastrelid; - if (OidIsValid(toastrelid)) - { - Relation toastrel; - - /* Avoid logical decoding of other TOAST relations. */ - toastrel = table_open(toastrelid, AccessShareLock); - repacked_rel_toast_locator = toastrel->rd_locator; - table_close(toastrel, AccessShareLock); - } - table_close(rel, AccessShareLock); - /* The file will be set as soon as we have it opened. */ dstate->file = NULL; -- 2.47.3 --gwom7bl7ogtszo4k Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="v44-0005-Rename-ChangeDest-to-ChangeContext-and-absorb-In.patch" ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
* [PATCH v1 1/1] expand refint docs with usage info @ 2026-05-26 16:46 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 476+ messages in thread From: Nathan Bossart @ 2026-05-26 16:46 UTC (permalink / raw) --- doc/src/sgml/contrib-spi.sgml | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/contrib-spi.sgml b/doc/src/sgml/contrib-spi.sgml index 6fa9479d1b9..7e4e580bc74 100644 --- a/doc/src/sgml/contrib-spi.sgml +++ b/doc/src/sgml/contrib-spi.sgml @@ -34,6 +34,14 @@ key mechanism, of course, but the module is still useful as an example.) </para> + <note> + <para> + <filename>refint</filename> requires a + <link linkend="ddl-schemas-patterns">secure schema usage pattern</link> and + data types where the equality operator is named <literal>=</literal>. + </para> + </note> + <para> <function>check_primary_key()</function> checks the referencing table. To use, create an <literal>AFTER INSERT OR UPDATE</literal> trigger using this @@ -44,6 +52,29 @@ keys, create a trigger for each reference. </para> + <note> + <para> + The <emphasis>referenced</emphasis> table name and column name arguments to + <function>check_primary_key()</function> are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the <command>CREATE TRIGGER</command> command. See + <xref linkend="sql-syntax-identifiers"/> for more information about quoting + SQL identifiers. Conversely, the <emphasis>referencing</emphasis> table + column name arguments should not be double quoted. See the following mock + example of proper use of <function>check_primary_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); +</programlisting> + </para> + </note> + <para> <function>check_foreign_key()</function> checks the referenced table. To use, create an <literal>AFTER DELETE OR UPDATE</literal> trigger using this @@ -53,13 +84,38 @@ (<literal>cascade</literal> — to delete the referencing row, <literal>restrict</literal> — to abort transaction if referencing keys exist, <literal>setnull</literal> — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. </para> + <note> + <para> + The <emphasis>referencing</emphasis> table name and column name arguments + to <function>check_foreign_key()</function> are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the <command>CREATE TRIGGER</command> command. + See <xref linkend="sql-syntax-identifiers"/> for more information about + quoting SQL identifiers. Conversely, the <emphasis>referenced</emphasis> + table column name arguments should not be double quoted. See the following + mock example of proper use of <function>check_foreign_key()</function>: +<programlisting> +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); +</programlisting> + </para> + </note> + <para> Note that if these triggers are executed from another <literal>BEFORE</literal> trigger, they can fail unexpectedly. For -- 2.50.1 (Apple Git-155) --3pMPqxRi+4qCFlgd-- ^ permalink raw reply [nested|flat] 476+ messages in thread
end of thread, other threads:[~2026-05-26 16:46 UTC | newest] Thread overview: 476+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2026-03-19 18:48 [PATCH v44 04/10] Fix crash caused by involuntary decoding of unrelated relations Álvaro Herrera <alvherre@kurilemu.de> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org> 2026-05-26 16:46 [PATCH v1 1/1] expand refint docs with usage info Nathan Bossart <nathan@postgresql.org>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox