v3-0003-Remove-quoteOneName-and-related-buffer-sizing-mac.patch
application/octet-stream
Filename: v3-0003-Remove-quoteOneName-and-related-buffer-sizing-mac.patch
Type: application/octet-stream
Part: 1
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v3-0003
Subject: Remove quoteOneName() and related buffer-sizing macros from ri_triggers.c
| File | + | − |
|---|---|---|
| src/backend/utils/adt/ri_triggers.c | 30 | 82 |
From 1ea040c6761a91d807c8e63887a05ac01bb93b0a Mon Sep 17 00:00:00 2001
From: "Chao Li (Evan)" <lic@highgo.com>
Date: Tue, 18 Nov 2025 17:13:07 +0800
Subject: [PATCH v3 3/4] Remove quoteOneName() and related buffer-sizing macros
from ri_triggers.c
After the previous refactoring, quoteOneName() and its callers are no longer
needed. Remove the function along with MAX_QUOTED_NAME_LEN,
MAX_QUOTED_REL_NAME_LEN, and quoteRelationName(), and introduce
appendRelationName() as the remaining helper for writing qualified relation
names using appendStringInfoQualifiedIdentifier().
This reduces redundant quoting code and centralizes identifier handling in
appendStringInfoIdentifier() / appendStringInfoQualifiedIdentifier(), making
RI triggers consistent with other code that generates SQL fragments.
No functional behavior change is expected.
Author: Chao Li <lic@highgo.com>
Discussion: https://postgr.es/m/CAEoWx2=g2RVkxXB=JzWphgfg4QGV+spaA3PQ1rBM2iMehrVvjg@mail.gmail.com
---
src/backend/utils/adt/ri_triggers.c | 112 ++++++++--------------------
1 file changed, 30 insertions(+), 82 deletions(-)
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3cc4dc2b7c8..d676930aca2 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -80,9 +80,6 @@
#define RI_PLAN_SETDEFAULT_ONDELETE 9
#define RI_PLAN_SETDEFAULT_ONUPDATE 10
-#define MAX_QUOTED_NAME_LEN (NAMEDATALEN*2+3)
-#define MAX_QUOTED_REL_NAME_LEN (MAX_QUOTED_NAME_LEN*2)
-
#define RIAttName(rel, attnum) NameStr(*attnumAttName(rel, attnum))
#define RIAttType(rel, attnum) attnumTypeId(rel, attnum)
#define RIAttCollation(rel, attnum) attnumCollationId(rel, attnum)
@@ -192,8 +189,7 @@ static bool ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
const RI_ConstraintInfo *riinfo);
static Datum ri_restrict(TriggerData *trigdata, bool is_no_action);
static Datum ri_set(TriggerData *trigdata, bool is_set_null, int tgkind);
-static void quoteOneName(char *buffer, const char *name);
-static void quoteRelationName(char *buffer, Relation rel);
+static void appendRelationName(StringInfo buffer, Relation rel, const char *prefix, const char *suffix);
static void ri_GenerateQual(StringInfo buf,
const char *sep,
const char *leftopprefix, const char *leftop, Oid leftoptype, bool quoteleftop,
@@ -357,7 +353,6 @@ RI_FKey_check(TriggerData *trigdata)
if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
{
StringInfoData querybuf;
- char pkrelname[MAX_QUOTED_REL_NAME_LEN];
const char *attname;
char paramname[16];
const char *querysep;
@@ -390,19 +385,16 @@ RI_FKey_check(TriggerData *trigdata)
initStringInfo(&querybuf);
pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
- quoteRelationName(pkrelname, pk_rel);
if (riinfo->hasperiod)
{
attname = RIAttName(pk_rel, riinfo->pk_attnums[riinfo->nkeys - 1]);
appendStringInfoIdentifier(&querybuf, "SELECT 1 FROM (SELECT ", attname, " AS r FROM ");
- appendStringInfo(&querybuf,
- "%s%s x",
- pk_only, pkrelname);
+ appendRelationName(&querybuf, pk_rel, pk_only, " x");
}
else
{
- appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
- pk_only, pkrelname);
+ appendStringInfoString(&querybuf, "SELECT 1 FROM ");
+ appendRelationName(&querybuf, pk_rel, pk_only, " x");
}
querysep = "WHERE";
for (int i = 0; i < riinfo->nkeys; i++)
@@ -526,7 +518,6 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
{
StringInfoData querybuf;
- char pkrelname[MAX_QUOTED_REL_NAME_LEN];
const char *attname;
char paramname[16];
const char *querysep;
@@ -559,19 +550,16 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
initStringInfo(&querybuf);
pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
- quoteRelationName(pkrelname, pk_rel);
if (riinfo->hasperiod)
{
attname = RIAttName(pk_rel, riinfo->pk_attnums[riinfo->nkeys - 1]);
appendStringInfoIdentifier(&querybuf, "SELECT 1 FROM (SELECT ", attname, " AS r FROM ");
- appendStringInfo(&querybuf,
- "%s%s x",
- pk_only, pkrelname);
+ appendRelationName(&querybuf, pk_rel, pk_only, " x");
}
else
{
- appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
- pk_only, pkrelname);
+ appendStringInfoString(&querybuf, "SELECT 1 FROM ");
+ appendRelationName(&querybuf, pk_rel, pk_only, " x");
}
querysep = "WHERE";
for (int i = 0; i < riinfo->nkeys; i++)
@@ -753,10 +741,7 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
{
StringInfoData querybuf;
- char pkrelname[MAX_QUOTED_REL_NAME_LEN];
- char fkrelname[MAX_QUOTED_REL_NAME_LEN];
const char *attname;
- char periodattname[MAX_QUOTED_NAME_LEN];
char paramname[16];
const char *querysep;
Oid queryoids[RI_MAX_NUMKEYS];
@@ -773,9 +758,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
initStringInfo(&querybuf);
fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
- quoteRelationName(fkrelname, fk_rel);
- appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
- fk_only, fkrelname);
+ appendStringInfoString(&querybuf, "SELECT 1 FROM ");
+ appendRelationName(&querybuf, fk_rel, fk_only, " x");
querysep = "WHERE";
for (int i = 0; i < riinfo->nkeys; i++)
{
@@ -843,10 +827,8 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
initStringInfo(&replacementsbuf);
appendStringInfoString(&replacementsbuf, "(SELECT pg_catalog.range_agg(r) FROM ");
- quoteOneName(periodattname, RIAttName(pk_rel, riinfo->pk_attnums[riinfo->nkeys - 1]));
- quoteRelationName(pkrelname, pk_rel);
- appendStringInfo(&replacementsbuf, "(SELECT y.%s r FROM %s%s y",
- periodattname, pk_only, pkrelname);
+ appendStringInfoIdentifier(&replacementsbuf, "(SELECT y.", RIAttName(pk_rel, riinfo->pk_attnums[riinfo->nkeys - 1]), " r FROM ");
+ appendRelationName(&replacementsbuf, pk_rel, pk_only, " y");
/* Restrict pk rows to what matches */
querysep = "WHERE";
@@ -939,7 +921,6 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
{
StringInfoData querybuf;
- char fkrelname[MAX_QUOTED_REL_NAME_LEN];
const char *attname;
char paramname[16];
const char *querysep;
@@ -956,9 +937,8 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
initStringInfo(&querybuf);
fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
- quoteRelationName(fkrelname, fk_rel);
- appendStringInfo(&querybuf, "DELETE FROM %s%s",
- fk_only, fkrelname);
+ appendStringInfoString(&querybuf, "DELETE FROM ");
+ appendRelationName(&querybuf, fk_rel, fk_only, NULL);
querysep = "WHERE";
for (int i = 0; i < riinfo->nkeys; i++)
{
@@ -1044,7 +1024,6 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
{
StringInfoData querybuf;
StringInfoData qualbuf;
- char fkrelname[MAX_QUOTED_REL_NAME_LEN];
const char *attname;
char paramname[16];
const char *querysep;
@@ -1066,9 +1045,8 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
initStringInfo(&qualbuf);
fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
- quoteRelationName(fkrelname, fk_rel);
- appendStringInfo(&querybuf, "UPDATE %s%s SET",
- fk_only, fkrelname);
+ appendStringInfoString(&querybuf, "UPDATE ");
+ appendRelationName(&querybuf, fk_rel, fk_only, " SET");
querysep = "";
qualsep = "WHERE";
for (int i = 0, j = riinfo->nkeys; i < riinfo->nkeys; i++, j++)
@@ -1232,7 +1210,6 @@ ri_set(TriggerData *trigdata, bool is_set_null, int tgkind)
if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
{
StringInfoData querybuf;
- char fkrelname[MAX_QUOTED_REL_NAME_LEN];
const char *attname;
char paramname[16];
const char *querysep;
@@ -1281,9 +1258,8 @@ ri_set(TriggerData *trigdata, bool is_set_null, int tgkind)
initStringInfo(&querybuf);
fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
- quoteRelationName(fkrelname, fk_rel);
- appendStringInfo(&querybuf, "UPDATE %s%s SET",
- fk_only, fkrelname);
+ appendStringInfo(&querybuf, "UPDATE ");
+ appendRelationName(&querybuf, fk_rel, fk_only, " SET");
/*
* Add assignment clauses
@@ -1509,8 +1485,6 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
{
const RI_ConstraintInfo *riinfo;
StringInfoData querybuf;
- char pkrelname[MAX_QUOTED_REL_NAME_LEN];
- char fkrelname[MAX_QUOTED_REL_NAME_LEN];
const char *pkattname;
const char *fkattname;
RangeTblEntry *rte;
@@ -1613,15 +1587,13 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
sep = ", ";
}
- quoteRelationName(pkrelname, pk_rel);
- quoteRelationName(fkrelname, fk_rel);
fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
- appendStringInfo(&querybuf,
- " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
- fk_only, fkrelname, pk_only, pkrelname);
+ appendStringInfoString(&querybuf, " FROM ");
+ appendRelationName(&querybuf, fk_rel, fk_only, " fk LEFT OUTER JOIN ");
+ appendRelationName(&querybuf, pk_rel, pk_only, " pk ON");
sep = "(";
for (int i = 0; i < riinfo->nkeys; i++)
@@ -1799,8 +1771,6 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
const RI_ConstraintInfo *riinfo;
StringInfoData querybuf;
char *constraintDef;
- char pkrelname[MAX_QUOTED_REL_NAME_LEN];
- char fkrelname[MAX_QUOTED_REL_NAME_LEN];
const char *pkattname;
const char *fkattname;
const char *sep;
@@ -1845,13 +1815,12 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
sep = ", ";
}
- quoteRelationName(pkrelname, pk_rel);
- quoteRelationName(fkrelname, fk_rel);
fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
"" : "ONLY ";
- appendStringInfo(&querybuf,
- " FROM %s%s fk JOIN %s pk ON",
- fk_only, fkrelname, pkrelname);
+ appendStringInfoString(&querybuf, " FROM ");
+ appendRelationName(&querybuf, fk_rel, fk_only, " fk JOIN ");
+ appendRelationName(&querybuf, pk_rel, NULL, " pk ON");
+
/* strcpy(pkattname, "pk."); */
/* strcpy(fkattname, "fk."); */
sep = "(";
@@ -2004,37 +1973,16 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
/*
- * quoteOneName --- safely quote a single SQL name
- *
- * buffer must be MAX_QUOTED_NAME_LEN long (includes room for \0)
- */
-static void
-quoteOneName(char *buffer, const char *name)
-{
- /* Rather than trying to be smart, just always quote it. */
- *buffer++ = '"';
- while (*name)
- {
- if (*name == '"')
- *buffer++ = '"';
- *buffer++ = *name++;
- }
- *buffer++ = '"';
- *buffer = '\0';
-}
+ * appendRelationName --- safely append a quoted fully qualified relation name
-/*
- * quoteRelationName --- safely quote a fully qualified relation name
- *
- * buffer must be MAX_QUOTED_REL_NAME_LEN long (includes room for \0)
*/
static void
-quoteRelationName(char *buffer, Relation rel)
+appendRelationName(StringInfo buffer, Relation rel,
+ const char *prefix, const char *suffix)
{
- quoteOneName(buffer, get_namespace_name(RelationGetNamespace(rel)));
- buffer += strlen(buffer);
- *buffer++ = '.';
- quoteOneName(buffer, RelationGetRelationName(rel));
+ appendStringInfoQualifiedIdentifier(buffer, prefix,
+ get_namespace_name(RelationGetNamespace(rel)),
+ RelationGetRelationName(rel), suffix);
}
/*
--
2.39.5 (Apple Git-154)