diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2008-03-25 22:42:46 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2008-03-25 22:42:46 +0000 |
commit | 220db7ccd8c88aafea4629f00e8be6f9f073ed00 (patch) | |
tree | 772c9dca19736eb9d417cb665a281686c3570b4c /src/backend/commands | |
parent | f948197b4055bb0e22e508e9d6966217b7dbea3d (diff) | |
download | postgresql-220db7ccd8c88aafea4629f00e8be6f9f073ed00.tar.gz postgresql-220db7ccd8c88aafea4629f00e8be6f9f073ed00.zip |
Simplify and standardize conversions between TEXT datums and ordinary C
strings. This patch introduces four support functions cstring_to_text,
cstring_to_text_with_len, text_to_cstring, and text_to_cstring_buffer, and
two macros CStringGetTextDatum and TextDatumGetCString. A number of
existing macros that provided variants on these themes were removed.
Most of the places that need to make such conversions now require just one
function or macro call, in place of the multiple notational layers that used
to be needed. There are no longer any direct calls of textout or textin,
and we got most of the places that were using handmade conversions via
memcpy (there may be a few still lurking, though).
This commit doesn't make any serious effort to eliminate transient memory
leaks caused by detoasting toasted text objects before they reach
text_to_cstring. We changed PG_GETARG_TEXT_P to PG_GETARG_TEXT_PP in a few
places where it was easy, but much more could be done.
Brendan Jurd and Tom Lane
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/comment.c | 6 | ||||
-rw-r--r-- | src/backend/commands/functioncmds.c | 8 | ||||
-rw-r--r-- | src/backend/commands/prepare.c | 8 | ||||
-rw-r--r-- | src/backend/commands/proclang.c | 11 | ||||
-rw-r--r-- | src/backend/commands/tablecmds.c | 4 | ||||
-rw-r--r-- | src/backend/commands/tablespace.c | 4 | ||||
-rw-r--r-- | src/backend/commands/tsearchcmds.c | 8 | ||||
-rw-r--r-- | src/backend/commands/typecmds.c | 16 | ||||
-rw-r--r-- | src/backend/commands/user.c | 12 |
9 files changed, 33 insertions, 44 deletions
diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 76c74cae1b6..ec7923d7673 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -7,7 +7,7 @@ * Copyright (c) 1996-2008, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.100 2008/01/01 19:45:48 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.101 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -215,7 +215,7 @@ CreateComments(Oid oid, Oid classoid, int32 subid, char *comment) values[i++] = ObjectIdGetDatum(oid); values[i++] = ObjectIdGetDatum(classoid); values[i++] = Int32GetDatum(subid); - values[i++] = DirectFunctionCall1(textin, CStringGetDatum(comment)); + values[i++] = CStringGetTextDatum(comment); } /* Use the index to search for a matching old tuple */ @@ -314,7 +314,7 @@ CreateSharedComments(Oid oid, Oid classoid, char *comment) i = 0; values[i++] = ObjectIdGetDatum(oid); values[i++] = ObjectIdGetDatum(classoid); - values[i++] = DirectFunctionCall1(textin, CStringGetDatum(comment)); + values[i++] = CStringGetTextDatum(comment); } /* Use the index to search for a matching old tuple */ diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 066a8c9898e..c04ca079bdf 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.88 2008/01/01 19:45:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.89 2008/03/25 22:42:42 tgl Exp $ * * DESCRIPTION * These routines take the parse tree and pick out the @@ -237,8 +237,7 @@ examine_parameter_list(List *parameters, Oid languageOid, if (fp->name && fp->name[0]) { - paramNames[i] = DirectFunctionCall1(textin, - CStringGetDatum(fp->name)); + paramNames[i] = CStringGetTextDatum(fp->name); have_names = true; } @@ -269,8 +268,7 @@ examine_parameter_list(List *parameters, Oid languageOid, for (i = 0; i < parameterCount; i++) { if (paramNames[i] == PointerGetDatum(NULL)) - paramNames[i] = DirectFunctionCall1(textin, - CStringGetDatum("")); + paramNames[i] = CStringGetTextDatum(""); } *parameterNames = construct_array(paramNames, parameterCount, TEXTOID, -1, false, 'i'); diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 9db486581ed..e9a0aaf050d 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -10,7 +10,7 @@ * Copyright (c) 2002-2008, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.81 2008/03/25 19:26:53 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.82 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -772,14 +772,12 @@ pg_prepared_statement(PG_FUNCTION_ARGS) MemSet(nulls, 0, sizeof(nulls)); - values[0] = DirectFunctionCall1(textin, - CStringGetDatum(prep_stmt->stmt_name)); + values[0] = CStringGetTextDatum(prep_stmt->stmt_name); if (prep_stmt->plansource->query_string == NULL) nulls[1] = true; else - values[1] = DirectFunctionCall1(textin, - CStringGetDatum(prep_stmt->plansource->query_string)); + values[1] = CStringGetTextDatum(prep_stmt->plansource->query_string); values[2] = TimestampTzGetDatum(prep_stmt->prepare_time); values[3] = build_regtype_array(prep_stmt->plansource->param_types, diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index fa79f55950b..8e90db37081 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.74 2008/01/01 19:45:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.75 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -360,20 +360,17 @@ find_language_template(const char *languageName) datum = heap_getattr(tup, Anum_pg_pltemplate_tmplhandler, RelationGetDescr(rel), &isnull); if (!isnull) - result->tmplhandler = - DatumGetCString(DirectFunctionCall1(textout, datum)); + result->tmplhandler = TextDatumGetCString(datum); datum = heap_getattr(tup, Anum_pg_pltemplate_tmplvalidator, RelationGetDescr(rel), &isnull); if (!isnull) - result->tmplvalidator = - DatumGetCString(DirectFunctionCall1(textout, datum)); + result->tmplvalidator = TextDatumGetCString(datum); datum = heap_getattr(tup, Anum_pg_pltemplate_tmpllibrary, RelationGetDescr(rel), &isnull); if (!isnull) - result->tmpllibrary = - DatumGetCString(DirectFunctionCall1(textout, datum)); + result->tmpllibrary = TextDatumGetCString(datum); /* Ignore template if handler or library info is missing */ if (!result->tmplhandler || !result->tmpllibrary) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index bd7786a918d..a11a6844cbd 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.243 2008/03/19 18:38:30 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.244 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -6183,7 +6183,7 @@ decompile_conbin(HeapTuple contup, TupleDesc tupdesc) expr = DirectFunctionCall2(pg_get_expr, attr, ObjectIdGetDatum(con->conrelid)); - return DatumGetCString(DirectFunctionCall1(textout, expr)); + return TextDatumGetCString(expr); } /* diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index d8bff7c3220..8845bae8427 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.53 2008/01/01 19:45:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.54 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -282,7 +282,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) values[Anum_pg_tablespace_spcowner - 1] = ObjectIdGetDatum(ownerId); values[Anum_pg_tablespace_spclocation - 1] = - DirectFunctionCall1(textin, CStringGetDatum(location)); + CStringGetTextDatum(location); nulls[Anum_pg_tablespace_spcacl - 1] = 'n'; tuple = heap_formtuple(rel->rd_att, values, nulls); diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c index 1ec63114ab5..c1e63260a3b 100644 --- a/src/backend/commands/tsearchcmds.c +++ b/src/backend/commands/tsearchcmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/tsearchcmds.c,v 1.9 2008/01/01 19:45:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tsearchcmds.c,v 1.10 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1999,7 +1999,7 @@ serialize_deflist(List *deflist) appendStringInfo(&buf, ", "); } - result = CStringGetTextP(buf.data); + result = cstring_to_text_with_len(buf.data, buf.len); pfree(buf.data); return result; } @@ -2099,7 +2099,7 @@ deserialize_deflist(Datum txt) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("invalid parameter list format: \"%s\"", - TextPGetCString(in)))); + text_to_cstring(in)))); break; case CS_WAITVALUE: if (*ptr == '\'') @@ -2210,7 +2210,7 @@ deserialize_deflist(Datum txt) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("invalid parameter list format: \"%s\"", - TextPGetCString(in)))); + text_to_cstring(in)))); pfree(workspace); diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 982588e04a6..d67ae2c2db8 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.114 2008/03/19 18:38:30 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.115 2008/03/25 22:42:43 tgl Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -697,13 +697,13 @@ DefineDomain(CreateDomainStmt *stmt) datum = SysCacheGetAttr(TYPEOID, typeTup, Anum_pg_type_typdefault, &isnull); if (!isnull) - defaultValue = DatumGetCString(DirectFunctionCall1(textout, datum)); + defaultValue = TextDatumGetCString(datum); /* Inherited default binary value */ datum = SysCacheGetAttr(TYPEOID, typeTup, Anum_pg_type_typdefaultbin, &isnull); if (!isnull) - defaultValueBin = DatumGetCString(DirectFunctionCall1(textout, datum)); + defaultValueBin = TextDatumGetCString(datum); /* * Run through constraints manually to avoid the additional processing @@ -1497,12 +1497,10 @@ AlterDomainDefault(List *names, Node *defaultRaw) /* * Form an updated tuple with the new default and write it back. */ - new_record[Anum_pg_type_typdefaultbin - 1] = DirectFunctionCall1(textin, - CStringGetDatum(nodeToString(defaultExpr))); + new_record[Anum_pg_type_typdefaultbin - 1] = CStringGetTextDatum(nodeToString(defaultExpr)); new_record_repl[Anum_pg_type_typdefaultbin - 1] = 'r'; - new_record[Anum_pg_type_typdefault - 1] = DirectFunctionCall1(textin, - CStringGetDatum(defaultValue)); + new_record[Anum_pg_type_typdefault - 1] = CStringGetTextDatum(defaultValue); new_record_repl[Anum_pg_type_typdefault - 1] = 'r'; } } @@ -2292,9 +2290,7 @@ GetDomainConstraints(Oid typeOid) elog(ERROR, "domain \"%s\" constraint \"%s\" has NULL conbin", NameStr(typTup->typname), NameStr(c->conname)); - check_expr = (Expr *) - stringToNode(DatumGetCString(DirectFunctionCall1(textout, - val))); + check_expr = (Expr *) stringToNode(TextDatumGetCString(val)); /* ExecInitExpr assumes we already fixed opfuncids */ fix_opfuncids((Node *) check_expr); diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index 2b790227f32..77432927d3d 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.179 2008/03/24 19:47:35 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.180 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -311,14 +311,14 @@ CreateRole(CreateRoleStmt *stmt) { if (!encrypt_password || isMD5(password)) new_record[Anum_pg_authid_rolpassword - 1] = - DirectFunctionCall1(textin, CStringGetDatum(password)); + CStringGetTextDatum(password); else { if (!pg_md5_encrypt(password, stmt->role, strlen(stmt->role), encrypted_password)) elog(ERROR, "password encryption failed"); new_record[Anum_pg_authid_rolpassword - 1] = - DirectFunctionCall1(textin, CStringGetDatum(encrypted_password)); + CStringGetTextDatum(encrypted_password); } } else @@ -639,14 +639,14 @@ AlterRole(AlterRoleStmt *stmt) { if (!encrypt_password || isMD5(password)) new_record[Anum_pg_authid_rolpassword - 1] = - DirectFunctionCall1(textin, CStringGetDatum(password)); + CStringGetTextDatum(password); else { if (!pg_md5_encrypt(password, stmt->role, strlen(stmt->role), encrypted_password)) elog(ERROR, "password encryption failed"); new_record[Anum_pg_authid_rolpassword - 1] = - DirectFunctionCall1(textin, CStringGetDatum(encrypted_password)); + CStringGetTextDatum(encrypted_password); } new_record_repl[Anum_pg_authid_rolpassword - 1] = 'r'; } @@ -1060,7 +1060,7 @@ RenameRole(const char *oldname, const char *newname) datum = heap_getattr(oldtuple, Anum_pg_authid_rolpassword, dsc, &isnull); - if (!isnull && isMD5(DatumGetCString(DirectFunctionCall1(textout, datum)))) + if (!isnull && isMD5(TextDatumGetCString(datum))) { /* MD5 uses the username as salt, so just clear it on a rename */ repl_repl[Anum_pg_authid_rolpassword - 1] = 'r'; |