aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/dblink/dblink.c125
-rw-r--r--contrib/tablefunc/tablefunc.c51
-rw-r--r--contrib/xml2/xpath.c11
3 files changed, 87 insertions, 100 deletions
diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c
index 4fd17c32271..b1b863ea1e4 100644
--- a/contrib/dblink/dblink.c
+++ b/contrib/dblink/dblink.c
@@ -301,11 +301,12 @@ dblink_open(PG_FUNCTION_ARGS)
char *curname = NULL;
char *sql = NULL;
char *conname = NULL;
- StringInfo str = makeStringInfo();
+ StringInfoData buf;
remoteConn *rconn = NULL;
bool fail = true; /* default to backward compatible behavior */
DBLINK_INIT;
+ initStringInfo(&buf);
if (PG_NARGS() == 2)
{
@@ -361,8 +362,8 @@ dblink_open(PG_FUNCTION_ARGS)
if (rconn->newXactForCursor)
(rconn->openCursorCount)++;
- appendStringInfo(str, "DECLARE %s CURSOR FOR %s", curname, sql);
- res = PQexec(conn, str->data);
+ appendStringInfo(&buf, "DECLARE %s CURSOR FOR %s", curname, sql);
+ res = PQexec(conn, buf.data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
{
if (fail)
@@ -389,12 +390,13 @@ dblink_close(PG_FUNCTION_ARGS)
PGresult *res = NULL;
char *curname = NULL;
char *conname = NULL;
- StringInfo str = makeStringInfo();
+ StringInfoData buf;
char *msg;
remoteConn *rconn = NULL;
bool fail = true; /* default to backward compatible behavior */
DBLINK_INIT;
+ initStringInfo(&buf);
if (PG_NARGS() == 1)
{
@@ -432,10 +434,10 @@ dblink_close(PG_FUNCTION_ARGS)
else
conn = rconn->conn;
- appendStringInfo(str, "CLOSE %s", curname);
+ appendStringInfo(&buf, "CLOSE %s", curname);
/* close the cursor */
- res = PQexec(conn, str->data);
+ res = PQexec(conn, buf.data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
{
if (fail)
@@ -493,7 +495,7 @@ dblink_fetch(PG_FUNCTION_ARGS)
if (SRF_IS_FIRSTCALL())
{
PGconn *conn = NULL;
- StringInfo str = makeStringInfo();
+ StringInfoData buf;
char *curname = NULL;
int howmany = 0;
bool fail = true; /* default to backward compatible */
@@ -542,6 +544,9 @@ dblink_fetch(PG_FUNCTION_ARGS)
if (!conn)
DBLINK_CONN_NOT_AVAIL;
+ initStringInfo(&buf);
+ appendStringInfo(&buf, "FETCH %d FROM %s", howmany, curname);
+
/* create a function context for cross-call persistence */
funcctx = SRF_FIRSTCALL_INIT();
@@ -550,9 +555,7 @@ dblink_fetch(PG_FUNCTION_ARGS)
*/
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- appendStringInfo(str, "FETCH %d FROM %s", howmany, curname);
-
- res = PQexec(conn, str->data);
+ res = PQexec(conn, buf.data);
if (!res ||
(PQresultStatus(res) != PGRES_COMMAND_OK &&
PQresultStatus(res) != PGRES_TUPLES_OK))
@@ -1547,13 +1550,14 @@ get_sql_insert(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
HeapTuple tuple;
TupleDesc tupdesc;
int natts;
- StringInfo str = makeStringInfo();
- char *sql;
+ StringInfoData buf;
char *val;
int16 key;
int i;
bool needComma;
+ initStringInfo(&buf);
+
/* get relation name including any needed schema prefix and quoting */
relname = generate_relation_name(relid);
@@ -1570,7 +1574,7 @@ get_sql_insert(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
(errcode(ERRCODE_CARDINALITY_VIOLATION),
errmsg("source row not found")));
- appendStringInfo(str, "INSERT INTO %s(", relname);
+ appendStringInfo(&buf, "INSERT INTO %s(", relname);
needComma = false;
for (i = 0; i < natts; i++)
@@ -1579,14 +1583,14 @@ get_sql_insert(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
continue;
if (needComma)
- appendStringInfo(str, ",");
+ appendStringInfo(&buf, ",");
- appendStringInfo(str, "%s",
+ appendStringInfoString(&buf,
quote_ident_cstr(NameStr(tupdesc->attrs[i]->attname)));
needComma = true;
}
- appendStringInfo(str, ") VALUES(");
+ appendStringInfo(&buf, ") VALUES(");
/*
* remember attvals are 1 based
@@ -1598,7 +1602,7 @@ get_sql_insert(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
continue;
if (needComma)
- appendStringInfo(str, ",");
+ appendStringInfo(&buf, ",");
if (tgt_pkattvals != NULL)
key = get_attnum_pk_pos(pkattnums, pknumatts, i + 1);
@@ -1612,21 +1616,17 @@ get_sql_insert(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
if (val != NULL)
{
- appendStringInfo(str, "%s", quote_literal_cstr(val));
+ appendStringInfoString(&buf, quote_literal_cstr(val));
pfree(val);
}
else
- appendStringInfo(str, "NULL");
+ appendStringInfo(&buf, "NULL");
needComma = true;
}
- appendStringInfo(str, ")");
+ appendStringInfo(&buf, ")");
- sql = pstrdup(str->data);
- pfree(str->data);
- pfree(str);
relation_close(rel, AccessShareLock);
-
- return (sql);
+ return (buf.data);
}
static char *
@@ -1636,10 +1636,11 @@ get_sql_delete(Oid relid, int2vector *pkattnums, int16 pknumatts, char **tgt_pka
char *relname;
TupleDesc tupdesc;
int natts;
- StringInfo str = makeStringInfo();
- char *sql;
+ StringInfoData buf;
int i;
+ initStringInfo(&buf);
+
/* get relation name including any needed schema prefix and quoting */
relname = generate_relation_name(relid);
@@ -1650,15 +1651,15 @@ get_sql_delete(Oid relid, int2vector *pkattnums, int16 pknumatts, char **tgt_pka
tupdesc = rel->rd_att;
natts = tupdesc->natts;
- appendStringInfo(str, "DELETE FROM %s WHERE ", relname);
+ appendStringInfo(&buf, "DELETE FROM %s WHERE ", relname);
for (i = 0; i < pknumatts; i++)
{
int16 pkattnum = pkattnums->values[i];
if (i > 0)
- appendStringInfo(str, " AND ");
+ appendStringInfo(&buf, " AND ");
- appendStringInfo(str, "%s",
+ appendStringInfoString(&buf,
quote_ident_cstr(NameStr(tupdesc->attrs[pkattnum - 1]->attname)));
if (tgt_pkattvals == NULL)
@@ -1666,18 +1667,14 @@ get_sql_delete(Oid relid, int2vector *pkattnums, int16 pknumatts, char **tgt_pka
elog(ERROR, "target key array must not be NULL");
if (tgt_pkattvals[i] != NULL)
- appendStringInfo(str, " = %s",
+ appendStringInfo(&buf, " = %s",
quote_literal_cstr(tgt_pkattvals[i]));
else
- appendStringInfo(str, " IS NULL");
+ appendStringInfo(&buf, " IS NULL");
}
- sql = pstrdup(str->data);
- pfree(str->data);
- pfree(str);
relation_close(rel, AccessShareLock);
-
- return (sql);
+ return (buf.data);
}
static char *
@@ -1688,13 +1685,14 @@ get_sql_update(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
HeapTuple tuple;
TupleDesc tupdesc;
int natts;
- StringInfo str = makeStringInfo();
- char *sql;
+ StringInfoData buf;
char *val;
int16 key;
int i;
bool needComma;
+ initStringInfo(&buf);
+
/* get relation name including any needed schema prefix and quoting */
relname = generate_relation_name(relid);
@@ -1711,7 +1709,7 @@ get_sql_update(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
(errcode(ERRCODE_CARDINALITY_VIOLATION),
errmsg("source row not found")));
- appendStringInfo(str, "UPDATE %s SET ", relname);
+ appendStringInfo(&buf, "UPDATE %s SET ", relname);
needComma = false;
for (i = 0; i < natts; i++)
@@ -1720,9 +1718,9 @@ get_sql_update(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
continue;
if (needComma)
- appendStringInfo(str, ", ");
+ appendStringInfo(&buf, ", ");
- appendStringInfo(str, "%s = ",
+ appendStringInfo(&buf, "%s = ",
quote_ident_cstr(NameStr(tupdesc->attrs[i]->attname)));
if (tgt_pkattvals != NULL)
@@ -1737,24 +1735,24 @@ get_sql_update(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
if (val != NULL)
{
- appendStringInfo(str, "%s", quote_literal_cstr(val));
+ appendStringInfoString(&buf, quote_literal_cstr(val));
pfree(val);
}
else
- appendStringInfo(str, "NULL");
+ appendStringInfoString(&buf, "NULL");
needComma = true;
}
- appendStringInfo(str, " WHERE ");
+ appendStringInfo(&buf, " WHERE ");
for (i = 0; i < pknumatts; i++)
{
int16 pkattnum = pkattnums->values[i];
if (i > 0)
- appendStringInfo(str, " AND ");
+ appendStringInfo(&buf, " AND ");
- appendStringInfo(str, "%s",
+ appendStringInfo(&buf, "%s",
quote_ident_cstr(NameStr(tupdesc->attrs[pkattnum - 1]->attname)));
if (tgt_pkattvals != NULL)
@@ -1764,19 +1762,15 @@ get_sql_update(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka
if (val != NULL)
{
- appendStringInfo(str, " = %s", quote_literal_cstr(val));
+ appendStringInfo(&buf, " = %s", quote_literal_cstr(val));
pfree(val);
}
else
- appendStringInfo(str, " IS NULL");
+ appendStringInfo(&buf, " IS NULL");
}
- sql = pstrdup(str->data);
- pfree(str->data);
- pfree(str);
relation_close(rel, AccessShareLock);
-
- return (sql);
+ return (buf.data);
}
/*
@@ -1836,12 +1830,13 @@ get_tuple_of_interest(Oid relid, int2vector *pkattnums, int16 pknumatts, char **
Relation rel;
char *relname;
TupleDesc tupdesc;
- StringInfo str = makeStringInfo();
- char *sql = NULL;
+ StringInfoData buf;
int ret;
HeapTuple tuple;
int i;
+ initStringInfo(&buf);
+
/* get relation name including any needed schema prefix and quoting */
relname = generate_relation_name(relid);
@@ -1863,34 +1858,30 @@ get_tuple_of_interest(Oid relid, int2vector *pkattnums, int16 pknumatts, char **
* Build sql statement to look up tuple of interest Use src_pkattvals as
* the criteria.
*/
- appendStringInfo(str, "SELECT * FROM %s WHERE ", relname);
+ appendStringInfo(&buf, "SELECT * FROM %s WHERE ", relname);
for (i = 0; i < pknumatts; i++)
{
int16 pkattnum = pkattnums->values[i];
if (i > 0)
- appendStringInfo(str, " AND ");
+ appendStringInfo(&buf, " AND ");
- appendStringInfo(str, "%s",
+ appendStringInfoString(&buf,
quote_ident_cstr(NameStr(tupdesc->attrs[pkattnum - 1]->attname)));
if (src_pkattvals[i] != NULL)
- appendStringInfo(str, " = %s",
+ appendStringInfo(&buf, " = %s",
quote_literal_cstr(src_pkattvals[i]));
else
- appendStringInfo(str, " IS NULL");
+ appendStringInfo(&buf, " IS NULL");
}
- sql = pstrdup(str->data);
- pfree(str->data);
- pfree(str);
-
/*
* Retrieve the desired tuple
*/
- ret = SPI_exec(sql, 0);
- pfree(sql);
+ ret = SPI_exec(buf.data, 0);
+ pfree(buf.data);
/*
* Only allow one qualifying tuple
diff --git a/contrib/tablefunc/tablefunc.c b/contrib/tablefunc/tablefunc.c
index 0beb44f5845..aacc949ff28 100644
--- a/contrib/tablefunc/tablefunc.c
+++ b/contrib/tablefunc/tablefunc.c
@@ -1260,13 +1260,10 @@ build_tuplestore_recursively(char *key_fld,
{
TupleDesc tupdesc = attinmeta->tupdesc;
MemoryContext oldcontext;
- StringInfo sql = makeStringInfo();
int ret;
int proc;
int serial_column;
- StringInfo branchstr = NULL;
- StringInfo chk_branchstr = NULL;
- StringInfo chk_current_key = NULL;
+ StringInfoData sql;
char **values;
char *current_key;
char *current_key_parent;
@@ -1278,17 +1275,12 @@ build_tuplestore_recursively(char *key_fld,
if (max_depth > 0 && level > max_depth)
return tupstore;
- /* start a new branch */
- branchstr = makeStringInfo();
-
- /* need these to check for recursion */
- chk_branchstr = makeStringInfo();
- chk_current_key = makeStringInfo();
+ initStringInfo(&sql);
/* Build initial sql statement */
if (!show_serial)
{
- appendStringInfo(sql, "SELECT %s, %s FROM %s WHERE %s = %s AND %s IS NOT NULL AND %s <> %s",
+ appendStringInfo(&sql, "SELECT %s, %s FROM %s WHERE %s = %s AND %s IS NOT NULL AND %s <> %s",
key_fld,
parent_key_fld,
relname,
@@ -1299,7 +1291,7 @@ build_tuplestore_recursively(char *key_fld,
}
else
{
- appendStringInfo(sql, "SELECT %s, %s FROM %s WHERE %s = %s AND %s IS NOT NULL AND %s <> %s ORDER BY %s",
+ appendStringInfo(&sql, "SELECT %s, %s FROM %s WHERE %s = %s AND %s IS NOT NULL AND %s <> %s ORDER BY %s",
key_fld,
parent_key_fld,
relname,
@@ -1359,7 +1351,7 @@ build_tuplestore_recursively(char *key_fld,
}
/* Retrieve the desired rows */
- ret = SPI_execute(sql->data, true, 0);
+ ret = SPI_execute(sql.data, true, 0);
proc = SPI_processed;
/* Check for qualifying tuples */
@@ -1369,6 +1361,9 @@ build_tuplestore_recursively(char *key_fld,
SPITupleTable *tuptable = SPI_tuptable;
TupleDesc spi_tupdesc = tuptable->tupdesc;
int i;
+ StringInfoData branchstr;
+ StringInfoData chk_branchstr;
+ StringInfoData chk_current_key;
/* First time through, do a little more setup */
if (level == 0)
@@ -1389,28 +1384,35 @@ build_tuplestore_recursively(char *key_fld,
for (i = 0; i < proc; i++)
{
+ /* start a new branch */
+ initStringInfo(&branchstr);
+
+ /* need these to check for recursion */
+ initStringInfo(&chk_branchstr);
+ initStringInfo(&chk_current_key);
+
/* initialize branch for this pass */
- appendStringInfo(branchstr, "%s", branch);
- appendStringInfo(chk_branchstr, "%s%s%s", branch_delim, branch, branch_delim);
+ appendStringInfo(&branchstr, "%s", branch);
+ appendStringInfo(&chk_branchstr, "%s%s%s", branch_delim, branch, branch_delim);
/* get the next sql result tuple */
spi_tuple = tuptable->vals[i];
/* get the current key and parent */
current_key = SPI_getvalue(spi_tuple, spi_tupdesc, 1);
- appendStringInfo(chk_current_key, "%s%s%s", branch_delim, current_key, branch_delim);
+ appendStringInfo(&chk_current_key, "%s%s%s", branch_delim, current_key, branch_delim);
current_key_parent = pstrdup(SPI_getvalue(spi_tuple, spi_tupdesc, 2));
/* get the current level */
sprintf(current_level, "%d", level);
/* check to see if this key is also an ancestor */
- if (strstr(chk_branchstr->data, chk_current_key->data))
+ if (strstr(chk_branchstr.data, chk_current_key.data))
elog(ERROR, "infinite recursion detected");
/* OK, extend the branch */
- appendStringInfo(branchstr, "%s%s", branch_delim, current_key);
- current_branch = branchstr->data;
+ appendStringInfo(&branchstr, "%s%s", branch_delim, current_key);
+ current_branch = branchstr.data;
/* build a tuple */
values[0] = pstrdup(current_key);
@@ -1461,14 +1463,9 @@ build_tuplestore_recursively(char *key_fld,
tupstore);
/* reset branch for next pass */
- xpfree(branchstr->data);
- initStringInfo(branchstr);
-
- xpfree(chk_branchstr->data);
- initStringInfo(chk_branchstr);
-
- xpfree(chk_current_key->data);
- initStringInfo(chk_current_key);
+ xpfree(branchstr.data);
+ xpfree(chk_branchstr.data);
+ xpfree(chk_current_key.data);
}
}
diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c
index 662731b5c04..3dfcdadf96b 100644
--- a/contrib/xml2/xpath.c
+++ b/contrib/xml2/xpath.c
@@ -668,7 +668,7 @@ xpath_table(PG_FUNCTION_ARGS)
* document */
int had_values; /* To determine end of nodeset results */
- StringInfo querysql;
+ StringInfoData query_buf;
/* We only have a valid tuple description in table function mode */
if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo))
@@ -746,11 +746,10 @@ xpath_table(PG_FUNCTION_ARGS)
} while ((pos != NULL) && (numpaths < (ret_tupdesc->natts - 1)));
/* Now build query */
-
- querysql = makeStringInfo();
+ initStringInfo(&query_buf);
/* Build initial sql statement */
- appendStringInfo(querysql, "SELECT %s, %s FROM %s WHERE %s",
+ appendStringInfo(&query_buf, "SELECT %s, %s FROM %s WHERE %s",
pkeyfield,
xmlfield,
relname,
@@ -761,8 +760,8 @@ xpath_table(PG_FUNCTION_ARGS)
if ((ret = SPI_connect()) < 0)
elog(ERROR, "xpath_table: SPI_connect returned %d", ret);
- if ((ret = SPI_exec(querysql->data, 0)) != SPI_OK_SELECT)
- elog(ERROR, "xpath_table: SPI execution failed for query %s", querysql->data);
+ if ((ret = SPI_exec(query_buf.data, 0)) != SPI_OK_SELECT)
+ elog(ERROR, "xpath_table: SPI execution failed for query %s", query_buf.data);
proc = SPI_processed;
/* elog(DEBUG1,"xpath_table: SPI returned %d rows",proc); */