diff options
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/dblink/dblink.c | 125 | ||||
-rw-r--r-- | contrib/tablefunc/tablefunc.c | 51 | ||||
-rw-r--r-- | contrib/xml2/xpath.c | 11 |
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); */ |