diff options
Diffstat (limited to 'src')
72 files changed, 545 insertions, 816 deletions
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 48e9080b60d..fc5b6ebdcac 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.8 2008/01/01 19:45:46 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.9 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -180,7 +180,7 @@ untransformRelOptions(Datum options) char *p; Node *val = NULL; - s = DatumGetCString(DirectFunctionCall1(textout, optiondatums[i])); + s = TextDatumGetCString(optiondatums[i]); p = strchr(s, '='); if (p) { @@ -266,7 +266,7 @@ parseRelOptions(Datum options, int numkeywords, const char *const * keywords, char *s; char *p; - s = DatumGetCString(DirectFunctionCall1(textout, optiondatums[i])); + s = TextDatumGetCString(optiondatums[i]); p = strchr(s, '='); if (p) *p = '\0'; diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index a51f884c116..b8d3913cd03 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/transam/twophase.c,v 1.40 2008/03/17 02:18:55 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/twophase.c,v 1.41 2008/03/25 22:42:42 tgl Exp $ * * NOTES * Each global transaction is associated with a global transaction @@ -623,7 +623,7 @@ pg_prepared_xact(PG_FUNCTION_ARGS) MemSet(nulls, 0, sizeof(nulls)); values[0] = TransactionIdGetDatum(gxact->proc.xid); - values[1] = DirectFunctionCall1(textin, CStringGetDatum(gxact->gid)); + values[1] = CStringGetTextDatum(gxact->gid); values[2] = TimestampTzGetDatum(gxact->prepared_at); values[3] = ObjectIdGetDatum(gxact->owner); values[4] = ObjectIdGetDatum(gxact->proc.databaseId); diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 3990f1d863e..1b6a58f6616 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.294 2008/03/10 02:13:22 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.295 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -6380,7 +6380,6 @@ Datum pg_start_backup(PG_FUNCTION_ARGS) { text *backupid = PG_GETARG_TEXT_P(0); - text *result; char *backupidstr; XLogRecPtr checkpointloc; XLogRecPtr startpoint; @@ -6410,8 +6409,7 @@ pg_start_backup(PG_FUNCTION_ARGS) errhint("archive_command must be defined before " "online backups can be made safely."))); - backupidstr = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(backupid))); + backupidstr = text_to_cstring(backupid); /* * Mark backup active in shared memory. We must do full-page WAL writes @@ -6531,9 +6529,7 @@ pg_start_backup(PG_FUNCTION_ARGS) */ snprintf(xlogfilename, sizeof(xlogfilename), "%X/%X", startpoint.xlogid, startpoint.xrecoff); - result = DatumGetTextP(DirectFunctionCall1(textin, - CStringGetDatum(xlogfilename))); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(xlogfilename)); } /* @@ -6547,7 +6543,6 @@ pg_start_backup(PG_FUNCTION_ARGS) Datum pg_stop_backup(PG_FUNCTION_ARGS) { - text *result; XLogRecPtr startpoint; XLogRecPtr stoppoint; pg_time_t stamp_time; @@ -6669,9 +6664,7 @@ pg_stop_backup(PG_FUNCTION_ARGS) */ snprintf(stopxlogfilename, sizeof(stopxlogfilename), "%X/%X", stoppoint.xlogid, stoppoint.xrecoff); - result = DatumGetTextP(DirectFunctionCall1(textin, - CStringGetDatum(stopxlogfilename))); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(stopxlogfilename)); } /* @@ -6680,7 +6673,6 @@ pg_stop_backup(PG_FUNCTION_ARGS) Datum pg_switch_xlog(PG_FUNCTION_ARGS) { - text *result; XLogRecPtr switchpoint; char location[MAXFNAMELEN]; @@ -6696,9 +6688,7 @@ pg_switch_xlog(PG_FUNCTION_ARGS) */ snprintf(location, sizeof(location), "%X/%X", switchpoint.xlogid, switchpoint.xrecoff); - result = DatumGetTextP(DirectFunctionCall1(textin, - CStringGetDatum(location))); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(location)); } /* @@ -6711,7 +6701,6 @@ pg_switch_xlog(PG_FUNCTION_ARGS) Datum pg_current_xlog_location(PG_FUNCTION_ARGS) { - text *result; char location[MAXFNAMELEN]; /* Make sure we have an up-to-date local LogwrtResult */ @@ -6726,10 +6715,7 @@ pg_current_xlog_location(PG_FUNCTION_ARGS) snprintf(location, sizeof(location), "%X/%X", LogwrtResult.Write.xlogid, LogwrtResult.Write.xrecoff); - - result = DatumGetTextP(DirectFunctionCall1(textin, - CStringGetDatum(location))); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(location)); } /* @@ -6740,7 +6726,6 @@ pg_current_xlog_location(PG_FUNCTION_ARGS) Datum pg_current_xlog_insert_location(PG_FUNCTION_ARGS) { - text *result; XLogCtlInsert *Insert = &XLogCtl->Insert; XLogRecPtr current_recptr; char location[MAXFNAMELEN]; @@ -6754,10 +6739,7 @@ pg_current_xlog_insert_location(PG_FUNCTION_ARGS) snprintf(location, sizeof(location), "%X/%X", current_recptr.xlogid, current_recptr.xrecoff); - - result = DatumGetTextP(DirectFunctionCall1(textin, - CStringGetDatum(location))); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(location)); } /* @@ -6789,8 +6771,7 @@ pg_xlogfile_name_offset(PG_FUNCTION_ARGS) /* * Read input and parse */ - locationstr = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(location))); + locationstr = text_to_cstring(location); if (sscanf(locationstr, "%X/%X", &uxlogid, &uxrecoff) != 2) ereport(ERROR, @@ -6819,8 +6800,7 @@ pg_xlogfile_name_offset(PG_FUNCTION_ARGS) XLByteToPrevSeg(locationpoint, xlogid, xlogseg); XLogFileName(xlogfilename, ThisTimeLineID, xlogid, xlogseg); - values[0] = DirectFunctionCall1(textin, - CStringGetDatum(xlogfilename)); + values[0] = CStringGetTextDatum(xlogfilename); isnull[0] = false; /* @@ -6849,7 +6829,6 @@ Datum pg_xlogfile_name(PG_FUNCTION_ARGS) { text *location = PG_GETARG_TEXT_P(0); - text *result; char *locationstr; unsigned int uxlogid; unsigned int uxrecoff; @@ -6858,8 +6837,7 @@ pg_xlogfile_name(PG_FUNCTION_ARGS) XLogRecPtr locationpoint; char xlogfilename[MAXFNAMELEN]; - locationstr = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(location))); + locationstr = text_to_cstring(location); if (sscanf(locationstr, "%X/%X", &uxlogid, &uxrecoff) != 2) ereport(ERROR, @@ -6873,9 +6851,7 @@ pg_xlogfile_name(PG_FUNCTION_ARGS) XLByteToPrevSeg(locationpoint, xlogid, xlogseg); XLogFileName(xlogfilename, ThisTimeLineID, xlogid, xlogseg); - result = DatumGetTextP(DirectFunctionCall1(textin, - CStringGetDatum(xlogfilename))); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(xlogfilename)); } /* diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 3f8c7eab47b..974eec8a06a 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.327 2008/01/01 19:45:48 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.328 2008/03/25 22:42:42 tgl Exp $ * * * INTERFACE ROUTINES @@ -1459,10 +1459,8 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin) */ values[Anum_pg_attrdef_adrelid - 1] = RelationGetRelid(rel); values[Anum_pg_attrdef_adnum - 1] = attnum; - values[Anum_pg_attrdef_adbin - 1] = DirectFunctionCall1(textin, - CStringGetDatum(adbin)); - values[Anum_pg_attrdef_adsrc - 1] = DirectFunctionCall1(textin, - CStringGetDatum(adsrc)); + values[Anum_pg_attrdef_adbin - 1] = CStringGetTextDatum(adbin); + values[Anum_pg_attrdef_adsrc - 1] = CStringGetTextDatum(adsrc); adrel = heap_open(AttrDefaultRelationId, RowExclusiveLock); diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index ed30b09b42a..4188eec289c 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.292 2008/01/30 19:46:48 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.293 2008/03/25 22:42:42 tgl Exp $ * * * INTERFACE ROUTINES @@ -374,8 +374,7 @@ UpdateIndexRelation(Oid indexoid, char *exprsString; exprsString = nodeToString(indexInfo->ii_Expressions); - exprsDatum = DirectFunctionCall1(textin, - CStringGetDatum(exprsString)); + exprsDatum = CStringGetTextDatum(exprsString); pfree(exprsString); } else @@ -390,8 +389,7 @@ UpdateIndexRelation(Oid indexoid, char *predString; predString = nodeToString(make_ands_explicit(indexInfo->ii_Predicate)); - predDatum = DirectFunctionCall1(textin, - CStringGetDatum(predString)); + predDatum = CStringGetTextDatum(predString); pfree(predString); } else diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c index bfdd429b23a..c88f9973b97 100644 --- a/src/backend/catalog/pg_aggregate.c +++ b/src/backend/catalog/pg_aggregate.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.90 2008/01/11 18:39:40 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.91 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -232,8 +232,7 @@ AggregateCreate(const char *aggName, values[Anum_pg_aggregate_aggsortop - 1] = ObjectIdGetDatum(sortop); values[Anum_pg_aggregate_aggtranstype - 1] = ObjectIdGetDatum(aggTransType); if (agginitval) - values[Anum_pg_aggregate_agginitval - 1] = - DirectFunctionCall1(textin, CStringGetDatum(agginitval)); + values[Anum_pg_aggregate_agginitval - 1] = CStringGetTextDatum(agginitval); else nulls[Anum_pg_aggregate_agginitval - 1] = 'n'; diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c index c25cfaab35b..2de30557801 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.38 2008/01/17 18:56:54 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.39 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -174,8 +174,7 @@ CreateConstraintEntry(const char *constraintName, * initialize the binary form of the check constraint. */ if (conBin) - values[Anum_pg_constraint_conbin - 1] = DirectFunctionCall1(textin, - CStringGetDatum(conBin)); + values[Anum_pg_constraint_conbin - 1] = CStringGetTextDatum(conBin); else nulls[Anum_pg_constraint_conbin - 1] = 'n'; @@ -183,8 +182,7 @@ CreateConstraintEntry(const char *constraintName, * initialize the text form of the check constraint */ if (conSrc) - values[Anum_pg_constraint_consrc - 1] = DirectFunctionCall1(textin, - CStringGetDatum(conSrc)); + values[Anum_pg_constraint_consrc - 1] = CStringGetTextDatum(conSrc); else nulls[Anum_pg_constraint_consrc - 1] = 'n'; diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index f86b742cada..c099d95c059 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.149 2008/03/18 22:04:14 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.150 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -248,10 +248,8 @@ ProcedureCreate(const char *procedureName, values[Anum_pg_proc_proargnames - 1] = parameterNames; else nulls[Anum_pg_proc_proargnames - 1] = 'n'; - values[Anum_pg_proc_prosrc - 1] = DirectFunctionCall1(textin, - CStringGetDatum(prosrc)); - values[Anum_pg_proc_probin - 1] = DirectFunctionCall1(textin, - CStringGetDatum(probin)); + values[Anum_pg_proc_prosrc - 1] = CStringGetTextDatum(prosrc); + values[Anum_pg_proc_probin - 1] = CStringGetTextDatum(probin); if (proconfig != PointerGetDatum(NULL)) values[Anum_pg_proc_proconfig - 1] = proconfig; else @@ -449,7 +447,7 @@ fmgr_internal_validator(PG_FUNCTION_ARGS) tmp = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc"); - prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp)); + prosrc = TextDatumGetCString(tmp); if (fmgr_internal_function(prosrc) == InvalidOid) ereport(ERROR, @@ -499,12 +497,12 @@ fmgr_c_validator(PG_FUNCTION_ARGS) tmp = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc"); - prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp)); + prosrc = TextDatumGetCString(tmp); tmp = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_probin, &isnull); if (isnull) elog(ERROR, "null probin"); - probin = DatumGetCString(DirectFunctionCall1(textout, tmp)); + probin = TextDatumGetCString(tmp); (void) load_external_function(probin, prosrc, true, &libraryhandle); (void) fetch_finfo_record(libraryhandle, prosrc); @@ -576,7 +574,7 @@ fmgr_sql_validator(PG_FUNCTION_ARGS) if (isnull) elog(ERROR, "null prosrc"); - prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp)); + prosrc = TextDatumGetCString(tmp); /* * Setup error traceback support for ereport(). @@ -631,7 +629,7 @@ sql_function_parse_error_callback(void *arg) tmp = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc"); - prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp)); + prosrc = TextDatumGetCString(tmp); if (!function_parse_error_transpose(prosrc)) { diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index a654f19dbbd..cdbd55c5292 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.116 2008/03/19 18:38:30 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.117 2008/03/25 22:42:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -275,8 +275,7 @@ TypeCreate(Oid newTypeOid, * course. */ if (defaultTypeBin) - values[i] = DirectFunctionCall1(textin, - CStringGetDatum(defaultTypeBin)); + values[i] = CStringGetTextDatum(defaultTypeBin); else nulls[i] = 'n'; i++; /* typdefaultbin */ @@ -285,8 +284,7 @@ TypeCreate(Oid newTypeOid, * initialize the default value for this type. */ if (defaultTypeValue) - values[i] = DirectFunctionCall1(textin, - CStringGetDatum(defaultTypeValue)); + values[i] = CStringGetTextDatum(defaultTypeValue); else nulls[i] = 'n'; i++; /* typdefault */ 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'; diff --git a/src/backend/executor/execCurrent.c b/src/backend/executor/execCurrent.c index 3523ac7ae90..f775092896d 100644 --- a/src/backend/executor/execCurrent.c +++ b/src/backend/executor/execCurrent.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/executor/execCurrent.c,v 1.5 2008/01/01 19:45:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execCurrent.c,v 1.6 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -150,8 +150,7 @@ fetch_param_value(ExprContext *econtext, int paramId) { Assert(prm->ptype == REFCURSOROID); /* We know that refcursor uses text's I/O routines */ - return DatumGetCString(DirectFunctionCall1(textout, - prm->value)); + return TextDatumGetCString(prm->value); } } diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 97d22dc2cd3..d142796815b 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.227 2008/03/25 19:26:53 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.228 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -3039,13 +3039,7 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, if (*isNull) result = NULL; else - { - int len = buf.len + VARHDRSZ; - - result = palloc(len); - SET_VARSIZE(result, len); - memcpy(VARDATA(result), buf.data, buf.len); - } + result = cstring_to_text_with_len(buf.data, buf.len); pfree(buf.data); return PointerGetDatum(result); diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index da6976b62f7..678b43927d7 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.121 2008/03/18 22:04:14 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.122 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -244,7 +244,7 @@ init_sql_fcache(FmgrInfo *finfo) &isNull); if (isNull) elog(ERROR, "null prosrc for function %u", foid); - fcache->src = DatumGetCString(DirectFunctionCall1(textout, tmp)); + fcache->src = TextDatumGetCString(tmp); /* * Parse and rewrite the queries in the function text. @@ -777,7 +777,7 @@ sql_exec_error_callback(void *arg) &isnull); if (isnull) elog(ERROR, "null prosrc"); - prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp)); + prosrc = TextDatumGetCString(tmp); errposition(0); internalerrposition(syntaxerrposition); internalerrquery(prosrc); diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 0fac11a5371..8ddcf868699 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -61,7 +61,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.156 2008/01/11 18:39:40 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.157 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1549,7 +1549,7 @@ GetAggInitVal(Datum textInitVal, Oid transtype) Datum initVal; getTypeInputInfo(transtype, &typinput, &typioparam); - strInitVal = DatumGetCString(DirectFunctionCall1(textout, textInitVal)); + strInitVal = TextDatumGetCString(textInitVal); initVal = OidInputFunctionCall(typinput, strInitVal, typioparam, -1); pfree(strInitVal); diff --git a/src/backend/libpq/be-fsstubs.c b/src/backend/libpq/be-fsstubs.c index e2477a1dd14..a7d746ae58c 100644 --- a/src/backend/libpq/be-fsstubs.c +++ b/src/backend/libpq/be-fsstubs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/libpq/be-fsstubs.c,v 1.88 2008/03/22 01:55:14 ishii Exp $ + * $PostgreSQL: pgsql/src/backend/libpq/be-fsstubs.c,v 1.89 2008/03/25 22:42:43 tgl Exp $ * * NOTES * This should be moved to a more appropriate place. It is here @@ -47,6 +47,7 @@ #include "miscadmin.h" #include "storage/fd.h" #include "storage/large_object.h" +#include "utils/builtins.h" #include "utils/memutils.h" @@ -320,7 +321,7 @@ lowrite(PG_FUNCTION_ARGS) Datum lo_import(PG_FUNCTION_ARGS) { - text *filename = PG_GETARG_TEXT_P(0); + text *filename = PG_GETARG_TEXT_PP(0); PG_RETURN_OID(lo_import_internal(filename, InvalidOid)); } @@ -332,7 +333,7 @@ lo_import(PG_FUNCTION_ARGS) Datum lo_import_with_oid(PG_FUNCTION_ARGS) { - text *filename = PG_GETARG_TEXT_P(0); + text *filename = PG_GETARG_TEXT_PP(0); Oid oid = PG_GETARG_OID(1); PG_RETURN_OID(lo_import_internal(filename, oid)); @@ -362,11 +363,7 @@ lo_import_internal(text *filename, Oid lobjOid) /* * open the file to be read in */ - nbytes = VARSIZE(filename) - VARHDRSZ; - if (nbytes >= MAXPGPATH) - nbytes = MAXPGPATH - 1; - memcpy(fnamebuf, VARDATA(filename), nbytes); - fnamebuf[nbytes] = '\0'; + text_to_cstring_buffer(filename, fnamebuf, sizeof(fnamebuf)); fd = PathNameOpenFile(fnamebuf, O_RDONLY | PG_BINARY, 0666); if (fd < 0) ereport(ERROR, @@ -410,7 +407,7 @@ Datum lo_export(PG_FUNCTION_ARGS) { Oid lobjId = PG_GETARG_OID(0); - text *filename = PG_GETARG_TEXT_P(1); + text *filename = PG_GETARG_TEXT_PP(1); File fd; int nbytes, tmp; @@ -441,11 +438,7 @@ lo_export(PG_FUNCTION_ARGS) * 022. This code used to drop it all the way to 0, but creating * world-writable export files doesn't seem wise. */ - nbytes = VARSIZE(filename) - VARHDRSZ; - if (nbytes >= MAXPGPATH) - nbytes = MAXPGPATH - 1; - memcpy(fnamebuf, VARDATA(filename), nbytes); - fnamebuf[nbytes] = '\0'; + text_to_cstring_buffer(filename, fnamebuf, sizeof(fnamebuf)); oumask = umask((mode_t) 0022); fd = PathNameOpenFile(fnamebuf, O_CREAT | O_WRONLY | O_TRUNC | PG_BINARY, 0666); umask(oumask); diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 8a2e808cc30..189793c2cc7 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.227 2008/02/07 17:53:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.228 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2711,8 +2711,7 @@ prefix_quals(Node *leftop, Oid opfamily, switch (prefix_const->consttype) { case TEXTOID: - prefix = DatumGetCString(DirectFunctionCall1(textout, - prefix_const->constvalue)); + prefix = TextDatumGetCString(prefix_const->constvalue); break; case BYTEAOID: prefix = DatumGetCString(DirectFunctionCall1(byteaout, @@ -2868,15 +2867,15 @@ static Datum string_to_datum(const char *str, Oid datatype) { /* - * We cheat a little by assuming that textin() will do for bpchar and - * varchar constants too... + * We cheat a little by assuming that CStringGetTextDatum() will do for + * bpchar and varchar constants too... */ if (datatype == NAMEOID) return DirectFunctionCall1(namein, CStringGetDatum(str)); else if (datatype == BYTEAOID) return DirectFunctionCall1(byteain, CStringGetDatum(str)); else - return DirectFunctionCall1(textin, CStringGetDatum(str)); + return CStringGetTextDatum(str); } /* diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 818894886a5..95e5077d38c 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.255 2008/03/18 22:04:14 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.256 2008/03/25 22:42:43 tgl Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -3002,7 +3002,7 @@ inline_function(Oid funcid, Oid result_type, List *args, &isNull); if (isNull) elog(ERROR, "null prosrc for function %u", funcid); - src = DatumGetCString(DirectFunctionCall1(textout, tmp)); + src = TextDatumGetCString(tmp); /* * We just do parsing and parse analysis, not rewriting, because rewriting @@ -3227,7 +3227,7 @@ sql_inline_error_callback(void *arg) &isnull); if (isnull) elog(ERROR, "null prosrc"); - prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp)); + prosrc = TextDatumGetCString(tmp); errposition(0); internalerrposition(syntaxerrposition); internalerrquery(prosrc); @@ -3454,7 +3454,7 @@ inline_set_returning_function(PlannerInfo *root, Node *node) &isNull); if (isNull) elog(ERROR, "null prosrc for function %u", fexpr->funcid); - src = DatumGetCString(DirectFunctionCall1(textout, tmp)); + src = TextDatumGetCString(tmp); /* * Parse, analyze, and rewrite (unlike inline_function(), we can't diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index e2699592970..88fba239cdb 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -19,7 +19,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.10 2008/03/21 22:10:56 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.11 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -811,7 +811,7 @@ generateClonedIndexStmt(CreateStmtContext *cxt, Relation source_idx, { char *exprsString; - exprsString = DatumGetCString(DirectFunctionCall1(textout, datum)); + exprsString = TextDatumGetCString(datum); indexprs = (List *) stringToNode(exprsString); } else @@ -904,7 +904,7 @@ generateClonedIndexStmt(CreateStmtContext *cxt, Relation source_idx, char *pred_str; /* Convert text string to node tree */ - pred_str = DatumGetCString(DirectFunctionCall1(textout, datum)); + pred_str = TextDatumGetCString(datum); index->whereClause = (Node *) stringToNode(pred_str); /* Adjust attribute numbers */ change_varattnos_of_a_node(index->whereClause, attmap); diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 75a2e0b824b..c96512ef31c 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.124 2008/01/01 19:45:51 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.125 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -83,8 +83,8 @@ InsertRule(char *rulname, values[i++] = CharGetDatum(evtype + '0'); /* ev_type */ values[i++] = CharGetDatum(RULE_FIRES_ON_ORIGIN); /* ev_enabled */ values[i++] = BoolGetDatum(evinstead); /* is_instead */ - values[i++] = DirectFunctionCall1(textin, CStringGetDatum(evqual)); /* ev_qual */ - values[i++] = DirectFunctionCall1(textin, CStringGetDatum(actiontree)); /* ev_action */ + values[i++] = CStringGetTextDatum(evqual); /* ev_qual */ + values[i++] = CStringGetTextDatum(actiontree); /* ev_action */ /* * Ready to store new pg_rewrite tuple diff --git a/src/backend/tsearch/dict.c b/src/backend/tsearch/dict.c index c17194f689c..34b26528afa 100644 --- a/src/backend/tsearch/dict.c +++ b/src/backend/tsearch/dict.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tsearch/dict.c,v 1.4 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/tsearch/dict.c,v 1.5 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -64,7 +64,7 @@ ts_lexize(PG_FUNCTION_ARGS) ptr = res; while (ptr->lexeme) { - da[ptr - res] = DirectFunctionCall1(textin, CStringGetDatum(ptr->lexeme)); + da[ptr - res] = CStringGetTextDatum(ptr->lexeme); ptr++; } diff --git a/src/backend/tsearch/to_tsany.c b/src/backend/tsearch/to_tsany.c index 5e1f82ba59c..a217ff0c5bc 100644 --- a/src/backend/tsearch/to_tsany.c +++ b/src/backend/tsearch/to_tsany.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tsearch/to_tsany.c,v 1.10 2008/03/07 14:30:20 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/tsearch/to_tsany.c,v 1.11 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -337,7 +337,7 @@ to_tsquery_byid(PG_FUNCTION_ARGS) QueryItem *res; int4 len; - query = parse_tsquery(TextPGetCString(in), pushval_morph, ObjectIdGetDatum(cfgid), false); + query = parse_tsquery(text_to_cstring(in), pushval_morph, ObjectIdGetDatum(cfgid), false); if (query->size == 0) PG_RETURN_TSQUERY(query); @@ -387,7 +387,7 @@ plainto_tsquery_byid(PG_FUNCTION_ARGS) QueryItem *res; int4 len; - query = parse_tsquery(TextPGetCString(in), pushval_morph, ObjectIdGetDatum(cfgid), true); + query = parse_tsquery(text_to_cstring(in), pushval_morph, ObjectIdGetDatum(cfgid), true); if (query->size == 0) PG_RETURN_TSQUERY(query); diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 65d7794b4e4..3cf54e58750 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.139 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.140 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1313,10 +1313,7 @@ makeaclitem(PG_FUNCTION_ARGS) static AclMode convert_priv_string(text *priv_type_text) { - char *priv_type; - - priv_type = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(priv_type_text))); + char *priv_type = text_to_cstring(priv_type_text); if (pg_strcasecmp(priv_type, "SELECT") == 0) return ACL_SELECT; @@ -1526,10 +1523,7 @@ convert_table_name(text *tablename) static AclMode convert_table_priv_string(text *priv_type_text) { - char *priv_type; - - priv_type = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(priv_type_text))); + char *priv_type = text_to_cstring(priv_type_text); /* * Return mode from priv_type string @@ -1736,12 +1730,9 @@ has_database_privilege_id_id(PG_FUNCTION_ARGS) static Oid convert_database_name(text *databasename) { - char *dbname; + char *dbname = text_to_cstring(databasename); Oid oid; - dbname = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(databasename))); - oid = get_database_oid(dbname); if (!OidIsValid(oid)) ereport(ERROR, @@ -1758,10 +1749,7 @@ convert_database_name(text *databasename) static AclMode convert_database_priv_string(text *priv_type_text) { - char *priv_type; - - priv_type = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(priv_type_text))); + char *priv_type = text_to_cstring(priv_type_text); /* * Return mode from priv_type string @@ -1953,12 +1941,9 @@ has_function_privilege_id_id(PG_FUNCTION_ARGS) static Oid convert_function_name(text *functionname) { - char *funcname; + char *funcname = text_to_cstring(functionname); Oid oid; - funcname = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(functionname))); - oid = DatumGetObjectId(DirectFunctionCall1(regprocedurein, CStringGetDatum(funcname))); @@ -1977,10 +1962,7 @@ convert_function_name(text *functionname) static AclMode convert_function_priv_string(text *priv_type_text) { - char *priv_type; - - priv_type = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(priv_type_text))); + char *priv_type = text_to_cstring(priv_type_text); /* * Return mode from priv_type string @@ -2157,12 +2139,9 @@ has_language_privilege_id_id(PG_FUNCTION_ARGS) static Oid convert_language_name(text *languagename) { - char *langname; + char *langname = text_to_cstring(languagename); Oid oid; - langname = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(languagename))); - oid = GetSysCacheOid(LANGNAME, CStringGetDatum(langname), 0, 0, 0); @@ -2181,10 +2160,7 @@ convert_language_name(text *languagename) static AclMode convert_language_priv_string(text *priv_type_text) { - char *priv_type; - - priv_type = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(priv_type_text))); + char *priv_type = text_to_cstring(priv_type_text); /* * Return mode from priv_type string @@ -2361,12 +2337,9 @@ has_schema_privilege_id_id(PG_FUNCTION_ARGS) static Oid convert_schema_name(text *schemaname) { - char *nspname; + char *nspname = text_to_cstring(schemaname); Oid oid; - nspname = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(schemaname))); - oid = GetSysCacheOid(NAMESPACENAME, CStringGetDatum(nspname), 0, 0, 0); @@ -2385,10 +2358,7 @@ convert_schema_name(text *schemaname) static AclMode convert_schema_priv_string(text *priv_type_text) { - char *priv_type; - - priv_type = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(priv_type_text))); + char *priv_type = text_to_cstring(priv_type_text); /* * Return mode from priv_type string @@ -2569,11 +2539,9 @@ has_tablespace_privilege_id_id(PG_FUNCTION_ARGS) static Oid convert_tablespace_name(text *tablespacename) { - char *spcname; + char *spcname = text_to_cstring(tablespacename); Oid oid; - spcname = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(tablespacename))); oid = get_tablespace_oid(spcname); if (!OidIsValid(oid)) @@ -2591,10 +2559,7 @@ convert_tablespace_name(text *tablespacename) static AclMode convert_tablespace_priv_string(text *priv_type_text) { - char *priv_type; - - priv_type = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(priv_type_text))); + char *priv_type = text_to_cstring(priv_type_text); /* * Return mode from priv_type string @@ -2777,10 +2742,7 @@ pg_has_role_id_id(PG_FUNCTION_ARGS) static AclMode convert_role_priv_string(text *priv_type_text) { - char *priv_type; - - priv_type = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(priv_type_text))); + char *priv_type = text_to_cstring(priv_type_text); /* * Return mode from priv_type string diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index b2beb18bc5f..f34ee3b773e 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.141 2008/02/29 20:58:33 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.142 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1533,39 +1533,33 @@ Datum array_dims(PG_FUNCTION_ARGS) { ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); - text *result; char *p; - int nbytes, - i; + int i; int *dimv, *lb; - /* Sanity check: does it look like an array at all? */ - if (ARR_NDIM(v) <= 0 || ARR_NDIM(v) > MAXDIM) - PG_RETURN_NULL(); - - nbytes = ARR_NDIM(v) * 33 + 1; - /* * 33 since we assume 15 digits per number + ':' +'[]' * - * +1 allows for temp trailing null + * +1 for trailing null */ + char buf[MAXDIM * 33 + 1]; - result = (text *) palloc(nbytes + VARHDRSZ); - p = VARDATA(result); + /* Sanity check: does it look like an array at all? */ + if (ARR_NDIM(v) <= 0 || ARR_NDIM(v) > MAXDIM) + PG_RETURN_NULL(); dimv = ARR_DIMS(v); lb = ARR_LBOUND(v); + p = buf; for (i = 0; i < ARR_NDIM(v); i++) { sprintf(p, "[%d:%d]", lb[i], dimv[i] + lb[i] - 1); p += strlen(p); } - SET_VARSIZE(result, strlen(VARDATA(result)) + VARHDRSZ); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(buf)); } /* diff --git a/src/backend/utils/adt/bool.c b/src/backend/utils/adt/bool.c index 7261ab3e406..4ba234c62c6 100644 --- a/src/backend/utils/adt/bool.c +++ b/src/backend/utils/adt/bool.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/bool.c,v 1.42 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/bool.c,v 1.43 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -152,14 +152,14 @@ Datum booltext(PG_FUNCTION_ARGS) { bool arg1 = PG_GETARG_BOOL(0); - char *str; + const char *str; if (arg1) str = "true"; else str = "false"; - PG_RETURN_DATUM(DirectFunctionCall1(textin, CStringGetDatum(str))); + PG_RETURN_TEXT_P(cstring_to_text(str)); } diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c index df5d7bf8629..84e8c742ec5 100644 --- a/src/backend/utils/adt/cash.c +++ b/src/backend/utils/adt/cash.c @@ -13,7 +13,7 @@ * this version handles 64 bit numbers and so can hold values up to * $92,233,720,368,547,758.07. * - * $PostgreSQL: pgsql/src/backend/utils/adt/cash.c,v 1.77 2007/11/24 16:18:48 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/cash.c,v 1.78 2008/03/25 22:42:43 tgl Exp $ */ #include "postgres.h" @@ -24,6 +24,7 @@ #include <locale.h> #include "libpq/pqformat.h" +#include "utils/builtins.h" #include "utils/cash.h" #include "utils/pg_locale.h" @@ -796,7 +797,6 @@ cash_words(PG_FUNCTION_ARGS) Cash m4; Cash m5; Cash m6; - text *result; /* work with positive numbers */ if (value < 0) @@ -862,10 +862,6 @@ cash_words(PG_FUNCTION_ARGS) /* capitalize output */ buf[0] = pg_toupper((unsigned char) buf[0]); - /* make a text type for output */ - result = (text *) palloc(strlen(buf) + VARHDRSZ); - SET_VARSIZE(result, strlen(buf) + VARHDRSZ); - memcpy(VARDATA(result), buf, strlen(buf)); - - PG_RETURN_TEXT_P(result); + /* return as text datum */ + PG_RETURN_TEXT_P(cstring_to_text(buf)); } diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index 5b6b9ebfa97..e7374388dd1 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.140 2008/03/21 01:31:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.141 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1594,15 +1594,15 @@ time_mi_interval(PG_FUNCTION_ARGS) Datum time_part(PG_FUNCTION_ARGS) { - text *units = PG_GETARG_TEXT_P(0); + text *units = PG_GETARG_TEXT_PP(0); TimeADT time = PG_GETARG_TIMEADT(1); float8 result; int type, val; char *lowunits; - lowunits = downcase_truncate_identifier(VARDATA(units), - VARSIZE(units) - VARHDRSZ, + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), + VARSIZE_ANY_EXHDR(units), false); type = DecodeUnits(0, lowunits, &val); @@ -1666,9 +1666,7 @@ time_part(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("\"time\" units \"%s\" not recognized", - DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(units)))))); - + lowunits))); result = 0; } } @@ -1685,8 +1683,7 @@ time_part(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("\"time\" units \"%s\" not recognized", - DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(units)))))); + lowunits))); result = 0; } @@ -2323,15 +2320,15 @@ datetimetz_timestamptz(PG_FUNCTION_ARGS) Datum timetz_part(PG_FUNCTION_ARGS) { - text *units = PG_GETARG_TEXT_P(0); + text *units = PG_GETARG_TEXT_PP(0); TimeTzADT *time = PG_GETARG_TIMETZADT_P(1); float8 result; int type, val; char *lowunits; - lowunits = downcase_truncate_identifier(VARDATA(units), - VARSIZE(units) - VARHDRSZ, + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), + VARSIZE_ANY_EXHDR(units), false); type = DecodeUnits(0, lowunits, &val); @@ -2408,9 +2405,7 @@ timetz_part(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("\"time with time zone\" units \"%s\" not recognized", - DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(units)))))); - + lowunits))); result = 0; } } @@ -2427,9 +2422,7 @@ timetz_part(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("\"time with time zone\" units \"%s\" not recognized", - DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(units)))))); - + lowunits))); result = 0; } @@ -2443,12 +2436,11 @@ timetz_part(PG_FUNCTION_ARGS) Datum timetz_zone(PG_FUNCTION_ARGS) { - text *zone = PG_GETARG_TEXT_P(0); + text *zone = PG_GETARG_TEXT_PP(0); TimeTzADT *t = PG_GETARG_TIMETZADT_P(1); TimeTzADT *result; int tz; char tzname[TZ_STRLEN_MAX + 1]; - int len; pg_tz *tzp; /* @@ -2456,9 +2448,7 @@ timetz_zone(PG_FUNCTION_ARGS) * (to handle cases like "America/New_York"), and if that fails, we look * in the date token table (to handle cases like "EST"). */ - len = Min(VARSIZE(zone) - VARHDRSZ, TZ_STRLEN_MAX); - memcpy(tzname, VARDATA(zone), len); - tzname[len] = '\0'; + text_to_cstring_buffer(zone, tzname, sizeof(tzname)); tzp = pg_tzset(tzname); if (tzp) { @@ -2475,8 +2465,8 @@ timetz_zone(PG_FUNCTION_ARGS) int type, val; - lowzone = downcase_truncate_identifier(VARDATA(zone), - VARSIZE(zone) - VARHDRSZ, + lowzone = downcase_truncate_identifier(tzname, + strlen(tzname), false); type = DecodeSpecial(0, lowzone, &val); diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 08f21b46b0a..ef6a87d3a83 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.187 2008/02/25 23:36:28 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.188 2008/03/25 22:42:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -3910,7 +3910,7 @@ pg_timezone_abbrevs(PG_FUNCTION_ARGS) for (p = (unsigned char *) buffer; *p; p++) *p = pg_toupper(*p); - values[0] = DirectFunctionCall1(textin, CStringGetDatum(buffer)); + values[0] = CStringGetTextDatum(buffer); MemSet(&tm, 0, sizeof(struct pg_tm)); tm.tm_min = (-1) * FROMVAL(&timezonetktbl[*pindex]); @@ -4020,11 +4020,8 @@ pg_timezone_names(PG_FUNCTION_ARGS) MemSet(nulls, 0, sizeof(nulls)); - values[0] = DirectFunctionCall1(textin, - CStringGetDatum(pg_get_timezone_name(tz))); - - values[1] = DirectFunctionCall1(textin, - CStringGetDatum(tzn ? tzn : "")); + values[0] = CStringGetTextDatum(pg_get_timezone_name(tz)); + values[1] = CStringGetTextDatum(tzn ? tzn : ""); MemSet(&itm, 0, sizeof(struct pg_tm)); itm.tm_sec = -tzoff; diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index 00ac3b0e094..72807321ae3 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -5,7 +5,7 @@ * Copyright (c) 2002-2008, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.16 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.17 2008/03/25 22:42:44 tgl Exp $ * */ @@ -393,41 +393,39 @@ Datum pg_size_pretty(PG_FUNCTION_ARGS) { int64 size = PG_GETARG_INT64(0); - char *result = palloc(50 + VARHDRSZ); + char buf[64]; int64 limit = 10 * 1024; int64 mult = 1; if (size < limit * mult) - snprintf(VARDATA(result), 50, INT64_FORMAT " bytes", size); + snprintf(buf, sizeof(buf), INT64_FORMAT " bytes", size); else { mult *= 1024; if (size < limit * mult) - snprintf(VARDATA(result), 50, INT64_FORMAT " kB", + snprintf(buf, sizeof(buf), INT64_FORMAT " kB", (size + mult / 2) / mult); else { mult *= 1024; if (size < limit * mult) - snprintf(VARDATA(result), 50, INT64_FORMAT " MB", + snprintf(buf, sizeof(buf), INT64_FORMAT " MB", (size + mult / 2) / mult); else { mult *= 1024; if (size < limit * mult) - snprintf(VARDATA(result), 50, INT64_FORMAT " GB", + snprintf(buf, sizeof(buf), INT64_FORMAT " GB", (size + mult / 2) / mult); else { mult *= 1024; - snprintf(VARDATA(result), 50, INT64_FORMAT " TB", + snprintf(buf, sizeof(buf), INT64_FORMAT " TB", (size + mult / 2) / mult); } } } } - SET_VARSIZE(result, strlen(VARDATA(result)) + VARHDRSZ); - - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(buf)); } diff --git a/src/backend/utils/adt/encode.c b/src/backend/utils/adt/encode.c index cbbc4b69a2f..290888f996f 100644 --- a/src/backend/utils/adt/encode.c +++ b/src/backend/utils/adt/encode.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/encode.c,v 1.21 2008/02/26 02:54:08 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/encode.c,v 1.22 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -46,7 +46,7 @@ binary_encode(PG_FUNCTION_ARGS) datalen = VARSIZE(data) - VARHDRSZ; - namebuf = DatumGetCString(DirectFunctionCall1(textout, name)); + namebuf = TextDatumGetCString(name); enc = pg_find_encoding(namebuf); if (enc == NULL) @@ -82,7 +82,7 @@ binary_decode(PG_FUNCTION_ARGS) datalen = VARSIZE(data) - VARHDRSZ; - namebuf = DatumGetCString(DirectFunctionCall1(textout, name)); + namebuf = TextDatumGetCString(name); enc = pg_find_encoding(namebuf); if (enc == NULL) diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index 86314e1a751..1ca2462c793 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/format_type.c,v 1.49 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/format_type.c,v 1.50 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -26,7 +26,6 @@ #include "mb/pg_wchar.h" #define MAX_INT32_LEN 11 -#define _textin(str) DirectFunctionCall1(textin, CStringGetDatum(str)) static char *format_type_internal(Oid type_oid, int32 typemod, bool typemod_given, bool allow_invalid); @@ -84,7 +83,7 @@ format_type(PG_FUNCTION_ARGS) result = format_type_internal(type_oid, typemod, true, true); } - PG_RETURN_DATUM(_textin(result)); + PG_RETURN_TEXT_P(cstring_to_text(result)); } /* @@ -454,7 +453,7 @@ oidvectortypes(PG_FUNCTION_ARGS) left -= slen; } - PG_RETURN_DATUM(_textin(result)); + PG_RETURN_TEXT_P(cstring_to_text(result)); } diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index d1cc69a7322..103543817d2 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- * formatting.c * - * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.138 2008/03/22 22:32:19 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.139 2008/03/25 22:42:44 tgl Exp $ * * * Portions Copyright (c) 1999-2008, PostgreSQL Global Development Group @@ -924,7 +924,7 @@ static int seq_search(char *name, char **array, int type, int max, int *len); static void do_to_timestamp(text *date_txt, text *fmt, struct pg_tm * tm, fsec_t *fsec); static char *fill_str(char *str, int c, int max); -static FormatNode *NUM_cache(int len, NUMDesc *Num, char *pars_str, bool *shouldFree); +static FormatNode *NUM_cache(int len, NUMDesc *Num, text *pars_str, bool *shouldFree); static char *int_to_roman(int number); static void NUM_prepare_locale(NUMProc *Np); static char *get_last_relevant_decnum(char *num); @@ -2709,16 +2709,14 @@ datetime_to_char_body(TmToChar *tmtc, text *fmt, bool is_interval) char *fmt_str, *result; bool incache; - int fmt_len = VARSIZE(fmt) - VARHDRSZ; - int reslen; + int fmt_len; text *res; /* * Convert fmt to C string */ - fmt_str = (char *) palloc(fmt_len + 1); - memcpy(fmt_str, VARDATA(fmt), fmt_len); - *(fmt_str + fmt_len) = '\0'; + fmt_str = text_to_cstring(fmt); + fmt_len = strlen(fmt_str); /* * Allocate workspace for result as C string @@ -2779,10 +2777,7 @@ datetime_to_char_body(TmToChar *tmtc, text *fmt, bool is_interval) pfree(fmt_str); /* convert C-string result to TEXT format */ - reslen = strlen(result); - res = (text *) palloc(reslen + VARHDRSZ); - memcpy(VARDATA(res), result, reslen); - SET_VARSIZE(res, reslen + VARHDRSZ); + res = cstring_to_text(result); pfree(result); return res; @@ -3135,18 +3130,15 @@ do_to_timestamp(text *date_txt, text *fmt, ZERO_tm(tm); *fsec = 0; - fmt_len = VARSIZE(fmt) - VARHDRSZ; + fmt_len = VARSIZE_ANY_EXHDR(fmt); if (fmt_len) { - int date_len; char *fmt_str; char *date_str; bool incache; - fmt_str = (char *) palloc(fmt_len + 1); - memcpy(fmt_str, VARDATA(fmt), fmt_len); - *(fmt_str + fmt_len) = '\0'; + fmt_str = text_to_cstring(fmt); /* * Allocate new memory if format picture is bigger than static cache @@ -3195,13 +3187,7 @@ do_to_timestamp(text *date_txt, text *fmt, /* dump_node(format, fmt_len); */ #endif - /* - * Convert date to C string - */ - date_len = VARSIZE(date_txt) - VARHDRSZ; - date_str = (char *) palloc(date_len + 1); - memcpy(date_str, VARDATA(date_txt), date_len); - *(date_str + date_len) = '\0'; + date_str = text_to_cstring(date_txt); DCH_from_char(format, date_str, &tmfc); @@ -3548,17 +3534,12 @@ NUM_cache_remove(NUMCacheEntry *ent) * ---------- */ static FormatNode * -NUM_cache(int len, NUMDesc *Num, char *pars_str, bool *shouldFree) +NUM_cache(int len, NUMDesc *Num, text *pars_str, bool *shouldFree) { FormatNode *format = NULL; char *str; - /* - * Convert VARDATA() to string - */ - str = (char *) palloc(len + 1); - memcpy(str, pars_str, len); - *(str + len) = '\0'; + str = text_to_cstring(pars_str); /* * Allocate new memory if format picture is bigger than static cache and @@ -4597,11 +4578,11 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, */ #define NUM_TOCHAR_prepare \ do { \ - len = VARSIZE(fmt) - VARHDRSZ; \ + len = VARSIZE_ANY_EXHDR(fmt); \ if (len <= 0 || len >= (INT_MAX-VARHDRSZ)/NUM_MAX_ITEM_SIZ) \ - return DirectFunctionCall1(textin, CStringGetDatum("")); \ + PG_RETURN_TEXT_P(cstring_to_text("")); \ result = (text *) palloc0((len * NUM_MAX_ITEM_SIZ) + 1 + VARHDRSZ); \ - format = NUM_cache(len, &Num, VARDATA(fmt), &shouldFree); \ + format = NUM_cache(len, &Num, fmt, &shouldFree); \ } while (0) /* ---------- @@ -4647,7 +4628,7 @@ numeric_to_number(PG_FUNCTION_ARGS) if (len <= 0 || len >= INT_MAX / NUM_MAX_ITEM_SIZ) PG_RETURN_NULL(); - format = NUM_cache(len, &Num, VARDATA(fmt), &shouldFree); + format = NUM_cache(len, &Num, fmt, &shouldFree); numstr = (char *) palloc((len * NUM_MAX_ITEM_SIZ) + 1); diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index a3a16bcfa50..86408859f22 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -9,7 +9,7 @@ * Author: Andreas Pflug <pgadmin@pse-consulting.de> * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/genfile.c,v 1.17 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/genfile.c,v 1.18 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -46,12 +46,9 @@ typedef struct static char * convert_and_check_filename(text *arg) { - int input_len = VARSIZE(arg) - VARHDRSZ; - char *filename = palloc(input_len + 1); - - memcpy(filename, VARDATA(arg), input_len); - filename[input_len] = '\0'; + char *filename; + filename = text_to_cstring(arg); canonicalize_path(filename); /* filename can change length here */ /* Disallow ".." in the path */ @@ -253,18 +250,11 @@ pg_ls_dir(PG_FUNCTION_ARGS) while ((de = ReadDir(fctx->dirdesc, fctx->location)) != NULL) { - int len = strlen(de->d_name); - text *result; - if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) continue; - result = palloc(len + VARHDRSZ); - SET_VARSIZE(result, len + VARHDRSZ); - memcpy(VARDATA(result), de->d_name, len); - - SRF_RETURN_NEXT(funcctx, PointerGetDatum(result)); + SRF_RETURN_NEXT(funcctx, CStringGetTextDatum(de->d_name)); } FreeDir(fctx->dirdesc); diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c index de5420e7719..55a6adaa5fa 100644 --- a/src/backend/utils/adt/lockfuncs.c +++ b/src/backend/utils/adt/lockfuncs.c @@ -6,7 +6,7 @@ * Copyright (c) 2002-2008, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.32 2008/01/08 23:18:51 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.33 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -57,7 +57,7 @@ VXIDGetDatum(BackendId bid, LocalTransactionId lxid) snprintf(vxidstr, sizeof(vxidstr), "%d/%u", bid, lxid); - return DirectFunctionCall1(textin, CStringGetDatum(vxidstr)); + return CStringGetTextDatum(vxidstr); } @@ -214,8 +214,7 @@ pg_lock_status(PG_FUNCTION_ARGS) (int) lock->tag.locktag_type); locktypename = tnbuf; } - values[0] = DirectFunctionCall1(textin, - CStringGetDatum(locktypename)); + values[0] = CStringGetTextDatum(locktypename); switch ((LockTagType) lock->tag.locktag_type) { @@ -297,9 +296,7 @@ pg_lock_status(PG_FUNCTION_ARGS) values[11] = Int32GetDatum(proc->pid); else nulls[11] = 'n'; - values[12] = DirectFunctionCall1(textin, - CStringGetDatum(GetLockmodeName(LOCK_LOCKMETHOD(*lock), - mode))); + values[12] = CStringGetTextDatum(GetLockmodeName(LOCK_LOCKMETHOD(*lock), mode)); values[13] = BoolGetDatum(granted); tuple = heap_formtuple(funcctx->tuple_desc, values, nulls); diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c index c1a484d9bb6..a40ca5edd05 100644 --- a/src/backend/utils/adt/nabstime.c +++ b/src/backend/utils/adt/nabstime.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.154 2008/03/21 01:31:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.155 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1576,8 +1576,6 @@ timeofday(PG_FUNCTION_ARGS) struct timeval tp; char templ[128]; char buf[128]; - text *result; - int len; pg_time_t tt; gettimeofday(&tp, NULL); @@ -1586,9 +1584,5 @@ timeofday(PG_FUNCTION_ARGS) pg_localtime(&tt, session_timezone)); snprintf(buf, sizeof(buf), templ, tp.tv_usec); - len = VARHDRSZ + strlen(buf); - result = (text *) palloc(len); - SET_VARSIZE(result, len); - memcpy(VARDATA(result), buf, len - VARHDRSZ); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(buf)); } diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c index 7eb6ffe306f..8e58374e9b1 100644 --- a/src/backend/utils/adt/network.c +++ b/src/backend/utils/adt/network.c @@ -1,7 +1,7 @@ /* * PostgreSQL type definitions for the INET and CIDR types. * - * $PostgreSQL: pgsql/src/backend/utils/adt/network.c,v 1.72 2007/11/15 21:14:39 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/network.c,v 1.73 2008/03/25 22:42:44 tgl Exp $ * * Jon Postel RIP 16 Oct 1998 */ @@ -601,8 +601,6 @@ Datum network_host(PG_FUNCTION_ARGS) { inet *ip = PG_GETARG_INET_P(0); - text *ret; - int len; char *ptr; char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")]; @@ -617,12 +615,7 @@ network_host(PG_FUNCTION_ARGS) if ((ptr = strchr(tmp, '/')) != NULL) *ptr = '\0'; - /* Return string as a text datum */ - len = strlen(tmp); - ret = (text *) palloc(len + VARHDRSZ); - SET_VARSIZE(ret, len + VARHDRSZ); - memcpy(VARDATA(ret), tmp, len); - PG_RETURN_TEXT_P(ret); + PG_RETURN_TEXT_P(cstring_to_text(tmp)); } /* @@ -634,7 +627,6 @@ Datum network_show(PG_FUNCTION_ARGS) { inet *ip = PG_GETARG_INET_P(0); - text *ret; int len; char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")]; @@ -651,21 +643,14 @@ network_show(PG_FUNCTION_ARGS) snprintf(tmp + len, sizeof(tmp) - len, "/%u", ip_bits(ip)); } - /* Return string as a text datum */ - len = strlen(tmp); - ret = (text *) palloc(len + VARHDRSZ); - SET_VARSIZE(ret, len + VARHDRSZ); - memcpy(VARDATA(ret), tmp, len); - PG_RETURN_TEXT_P(ret); + PG_RETURN_TEXT_P(cstring_to_text(tmp)); } Datum inet_abbrev(PG_FUNCTION_ARGS) { inet *ip = PG_GETARG_INET_P(0); - text *ret; char *dst; - int len; char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")]; dst = inet_net_ntop(ip_family(ip), ip_addr(ip), @@ -676,21 +661,14 @@ inet_abbrev(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("could not format inet value: %m"))); - /* Return string as a text datum */ - len = strlen(tmp); - ret = (text *) palloc(len + VARHDRSZ); - SET_VARSIZE(ret, len + VARHDRSZ); - memcpy(VARDATA(ret), tmp, len); - PG_RETURN_TEXT_P(ret); + PG_RETURN_TEXT_P(cstring_to_text(tmp)); } Datum cidr_abbrev(PG_FUNCTION_ARGS) { inet *ip = PG_GETARG_INET_P(0); - text *ret; char *dst; - int len; char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")]; dst = inet_cidr_ntop(ip_family(ip), ip_addr(ip), @@ -701,12 +679,7 @@ cidr_abbrev(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("could not format cidr value: %m"))); - /* Return string as a text datum */ - len = strlen(tmp); - ret = (text *) palloc(len + VARHDRSZ); - SET_VARSIZE(ret, len + VARHDRSZ); - memcpy(VARDATA(ret), tmp, len); - PG_RETURN_TEXT_P(ret); + PG_RETURN_TEXT_P(cstring_to_text(tmp)); } Datum diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c index 588cf5941db..257f60a8bbf 100644 --- a/src/backend/utils/adt/oracle_compat.c +++ b/src/backend/utils/adt/oracle_compat.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/oracle_compat.c,v 1.77 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/oracle_compat.c,v 1.78 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -76,9 +76,7 @@ texttowcs(const text *txt) errmsg("out of memory"))); /* Need a null-terminated version of the input */ - workstr = (char *) palloc(nbytes + 1); - memcpy(workstr, VARDATA_ANY(txt), nbytes); - workstr[nbytes] = '\0'; + workstr = text_to_cstring(txt); /* Output workspace cannot have more codes than input bytes */ result = (wchar_t *) palloc((nbytes + 1) * sizeof(wchar_t)); @@ -275,25 +273,16 @@ wstring_upper(char *str) text *in_text; text *out_text; char *result; - int nbytes = strlen(str); int i; - in_text = palloc(nbytes + VARHDRSZ); - memcpy(VARDATA(in_text), str, nbytes); - SET_VARSIZE(in_text, nbytes + VARHDRSZ); - + in_text = cstring_to_text(str); workspace = texttowcs(in_text); for (i = 0; workspace[i] != 0; i++) workspace[i] = towupper(workspace[i]); out_text = wcstotext(workspace, i); - - nbytes = VARSIZE(out_text) - VARHDRSZ; - result = palloc(nbytes + 1); - memcpy(result, VARDATA(out_text), nbytes); - - result[nbytes] = '\0'; + result = text_to_cstring(out_text); pfree(workspace); pfree(in_text); @@ -309,25 +298,16 @@ wstring_lower(char *str) text *in_text; text *out_text; char *result; - int nbytes = strlen(str); int i; - in_text = palloc(nbytes + VARHDRSZ); - memcpy(VARDATA(in_text), str, nbytes); - SET_VARSIZE(in_text, nbytes + VARHDRSZ); - + in_text = cstring_to_text(str); workspace = texttowcs(in_text); for (i = 0; workspace[i] != 0; i++) workspace[i] = towlower(workspace[i]); out_text = wcstotext(workspace, i); - - nbytes = VARSIZE(out_text) - VARHDRSZ; - result = palloc(nbytes + 1); - memcpy(result, VARDATA(out_text), nbytes); - - result[nbytes] = '\0'; + result = text_to_cstring(out_text); pfree(workspace); pfree(in_text); @@ -801,7 +781,6 @@ dotrim(const char *string, int stringlen, const char *set, int setlen, bool doltrim, bool dortrim) { - text *result; int i; /* Nothing to do if either string or set is empty */ @@ -947,11 +926,7 @@ dotrim(const char *string, int stringlen, } /* Return selected portion of string */ - result = (text *) palloc(VARHDRSZ + stringlen); - SET_VARSIZE(result, VARHDRSZ + stringlen); - memcpy(VARDATA(result), string, stringlen); - - return result; + return cstring_to_text_with_len(string, stringlen); } /******************************************************************** diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 7fb2d5951ee..f4c047b7eda 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.48 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.49 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -414,9 +414,7 @@ Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS) { int32 beid = PG_GETARG_INT32(0); - text *result; PgBackendStatus *beentry; - int len; const char *activity; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) @@ -428,12 +426,7 @@ pg_stat_get_backend_activity(PG_FUNCTION_ARGS) else activity = beentry->st_activity; - len = strlen(activity); - result = palloc(VARHDRSZ + len); - SET_VARSIZE(result, VARHDRSZ + len); - memcpy(VARDATA(result), activity, len); - - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(activity)); } diff --git a/src/backend/utils/adt/quote.c b/src/backend/utils/adt/quote.c index 519c6d874b5..6074414c372 100644 --- a/src/backend/utils/adt/quote.c +++ b/src/backend/utils/adt/quote.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/quote.c,v 1.24 2008/03/23 00:24:19 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/quote.c,v 1.25 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -23,26 +23,13 @@ Datum quote_ident(PG_FUNCTION_ARGS) { - text *t = PG_GETARG_TEXT_P(0); - text *result; + text *t = PG_GETARG_TEXT_PP(0); const char *qstr; char *str; - int len; - - /* We have to convert to a C string to use quote_identifier */ - len = VARSIZE(t) - VARHDRSZ; - str = (char *) palloc(len + 1); - memcpy(str, VARDATA(t), len); - str[len] = '\0'; + str = text_to_cstring(t); qstr = quote_identifier(str); - - len = strlen(qstr); - result = (text *) palloc(len + VARHDRSZ); - SET_VARSIZE(result, len + VARHDRSZ); - memcpy(VARDATA(result), qstr, len); - - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(qstr)); } /* @@ -106,8 +93,7 @@ Datum quote_nullable(PG_FUNCTION_ARGS) { if (PG_ARGISNULL(0)) - PG_RETURN_DATUM(DirectFunctionCall1(textin, - CStringGetDatum("NULL"))); + PG_RETURN_TEXT_P(cstring_to_text("NULL")); else PG_RETURN_DATUM(DirectFunctionCall1(quote_literal, PG_GETARG_DATUM(0))); diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index db86d69efe5..940cfc2b23d 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.269 2008/01/06 01:03:16 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.270 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -697,8 +697,7 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, bool showTblSpc, exprsDatum = SysCacheGetAttr(INDEXRELID, ht_idx, Anum_pg_index_indexprs, &isnull); Assert(!isnull); - exprsString = DatumGetCString(DirectFunctionCall1(textout, - exprsDatum)); + exprsString = TextDatumGetCString(exprsDatum); indexprs = (List *) stringToNode(exprsString); pfree(exprsString); } @@ -836,8 +835,7 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, bool showTblSpc, predDatum = SysCacheGetAttr(INDEXRELID, ht_idx, Anum_pg_index_indpred, &isnull); Assert(!isnull); - predString = DatumGetCString(DirectFunctionCall1(textout, - predDatum)); + predString = TextDatumGetCString(predDatum); node = (Node *) stringToNode(predString); pfree(predString); @@ -1092,7 +1090,7 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, elog(ERROR, "null conbin for constraint %u", constraintId); - conbin = DatumGetCString(DirectFunctionCall1(textout, val)); + conbin = TextDatumGetCString(val); expr = stringToNode(conbin); /* Set up deparsing context for Var nodes in constraint */ @@ -1222,8 +1220,7 @@ pg_get_expr_worker(text *expr, Oid relid, char *relname, int prettyFlags) char *str; /* Convert input TEXT object to C string */ - exprstr = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(expr))); + exprstr = text_to_cstring(expr); /* Convert expression to node tree */ node = (Node *) stringToNode(exprstr); @@ -1233,6 +1230,8 @@ pg_get_expr_worker(text *expr, Oid relid, char *relname, int prettyFlags) str = deparse_expression_pretty(node, context, false, false, prettyFlags, 0); + pfree(exprstr); + return str; } @@ -1286,7 +1285,7 @@ Datum pg_get_serial_sequence(PG_FUNCTION_ARGS) { text *tablename = PG_GETARG_TEXT_P(0); - text *columnname = PG_GETARG_TEXT_P(1); + text *columnname = PG_GETARG_TEXT_PP(1); RangeVar *tablerv; Oid tableOid; char *column; @@ -1302,8 +1301,7 @@ pg_get_serial_sequence(PG_FUNCTION_ARGS) tableOid = RangeVarGetRelid(tablerv, false); /* Get the number of the column */ - column = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(columnname))); + column = text_to_cstring(columnname); attnum = get_attnum(tableOid, column); if (attnum == InvalidAttrNumber) @@ -5439,16 +5437,9 @@ static text * string_to_text(char *str) { text *result; - int slen = strlen(str); - int tlen; - - tlen = slen + VARHDRSZ; - result = (text *) palloc(tlen); - SET_VARSIZE(result, tlen); - memcpy(VARDATA(result), str, slen); + result = cstring_to_text(str); pfree(str); - return result; } @@ -5482,9 +5473,9 @@ flatten_reloptions(Oid relid) * array_to_text() relies on flinfo to be valid. So use * OidFunctionCall2. */ - sep = DirectFunctionCall1(textin, CStringGetDatum(", ")); + sep = CStringGetTextDatum(", "); txt = OidFunctionCall2(F_ARRAY_TO_TEXT, reloptions, sep); - result = DatumGetCString(DirectFunctionCall1(textout, txt)); + result = TextDatumGetCString(txt); } ReleaseSysCache(tuple); diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index b6f1026375f..68ce6acb528 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.246 2008/03/17 17:13:54 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.247 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1089,8 +1089,7 @@ patternsel(PG_FUNCTION_ARGS, Pattern_Type ptype, bool negate) switch (prefix->consttype) { case TEXTOID: - prefixstr = DatumGetCString(DirectFunctionCall1(textout, - prefix->constvalue)); + prefixstr = TextDatumGetCString(prefix->constvalue); break; case BYTEAOID: prefixstr = DatumGetCString(DirectFunctionCall1(byteaout, @@ -3339,15 +3338,8 @@ convert_string_datum(Datum value, Oid typid) case BPCHAROID: case VARCHAROID: case TEXTOID: - { - char *str = (char *) VARDATA(DatumGetPointer(value)); - int strlength = VARSIZE(DatumGetPointer(value)) - VARHDRSZ; - - val = (char *) palloc(strlength + 1); - memcpy(val, str, strlength); - val[strlength] = '\0'; - break; - } + val = TextDatumGetCString(value); + break; case NAMEOID: { NameData *nm = (NameData *) DatumGetPointer(value); @@ -4177,7 +4169,7 @@ like_fixed_prefix(Const *patt_const, bool case_insensitive, if (typeid != BYTEAOID) { - patt = DatumGetCString(DirectFunctionCall1(textout, patt_const->constvalue)); + patt = TextDatumGetCString(patt_const->constvalue); pattlen = strlen(patt); } else @@ -4282,7 +4274,7 @@ regex_fixed_prefix(Const *patt_const, bool case_insensitive, errmsg("regular-expression matching not supported on type bytea"))); /* the right-hand const is type text for all of these */ - patt = DatumGetCString(DirectFunctionCall1(textout, patt_const->constvalue)); + patt = TextDatumGetCString(patt_const->constvalue); /* * Check for ARE director prefix. It's worth our trouble to recognize @@ -4618,7 +4610,7 @@ like_selectivity(Const *patt_const, bool case_insensitive) if (typeid != BYTEAOID) { - patt = DatumGetCString(DirectFunctionCall1(textout, patt_const->constvalue)); + patt = TextDatumGetCString(patt_const->constvalue); pattlen = strlen(patt); } else @@ -4777,7 +4769,7 @@ regex_selectivity(Const *patt_const, bool case_insensitive) errmsg("regular-expression matching not supported on type bytea"))); /* the right-hand const is type text for all of these */ - patt = DatumGetCString(DirectFunctionCall1(textout, patt_const->constvalue)); + patt = TextDatumGetCString(patt_const->constvalue); pattlen = strlen(patt); /* If patt doesn't end with $, consider it to have a trailing wildcard */ @@ -4892,8 +4884,7 @@ make_greater_string(const Const *str_const, FmgrInfo *ltproc) } else { - workstr = DatumGetCString(DirectFunctionCall1(textout, - str_const->constvalue)); + workstr = TextDatumGetCString(str_const->constvalue); len = strlen(workstr); if (lc_collate_is_c() || len == 0) cmpstr = str_const->constvalue; @@ -5000,15 +4991,15 @@ string_to_datum(const char *str, Oid datatype) Assert(str != NULL); /* - * We cheat a little by assuming that textin() will do for bpchar and - * varchar constants too... + * We cheat a little by assuming that CStringGetTextDatum() will do for + * bpchar and varchar constants too... */ if (datatype == NAMEOID) return DirectFunctionCall1(namein, CStringGetDatum(str)); else if (datatype == BYTEAOID) return DirectFunctionCall1(byteain, CStringGetDatum(str)); else - return DirectFunctionCall1(textin, CStringGetDatum(str)); + return CStringGetTextDatum(str); } /* diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 8ca6f998c98..8a0f37292dc 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.186 2008/03/21 01:31:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.187 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -3242,7 +3242,7 @@ timestamptz_age(PG_FUNCTION_ARGS) Datum timestamp_trunc(PG_FUNCTION_ARGS) { - text *units = PG_GETARG_TEXT_P(0); + text *units = PG_GETARG_TEXT_PP(0); Timestamp timestamp = PG_GETARG_TIMESTAMP(1); Timestamp result; int type, @@ -3255,8 +3255,8 @@ timestamp_trunc(PG_FUNCTION_ARGS) if (TIMESTAMP_NOT_FINITE(timestamp)) PG_RETURN_TIMESTAMP(timestamp); - lowunits = downcase_truncate_identifier(VARDATA(units), - VARSIZE(units) - VARHDRSZ, + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), + VARSIZE_ANY_EXHDR(units), false); type = DecodeUnits(0, lowunits, &val); @@ -3374,7 +3374,7 @@ timestamp_trunc(PG_FUNCTION_ARGS) Datum timestamptz_trunc(PG_FUNCTION_ARGS) { - text *units = PG_GETARG_TEXT_P(0); + text *units = PG_GETARG_TEXT_PP(0); TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1); TimestampTz result; int tz; @@ -3390,8 +3390,8 @@ timestamptz_trunc(PG_FUNCTION_ARGS) if (TIMESTAMP_NOT_FINITE(timestamp)) PG_RETURN_TIMESTAMPTZ(timestamp); - lowunits = downcase_truncate_identifier(VARDATA(units), - VARSIZE(units) - VARHDRSZ, + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), + VARSIZE_ANY_EXHDR(units), false); type = DecodeUnits(0, lowunits, &val); @@ -3532,7 +3532,7 @@ timestamptz_trunc(PG_FUNCTION_ARGS) Datum interval_trunc(PG_FUNCTION_ARGS) { - text *units = PG_GETARG_TEXT_P(0); + text *units = PG_GETARG_TEXT_PP(0); Interval *interval = PG_GETARG_INTERVAL_P(1); Interval *result; int type, @@ -3544,8 +3544,8 @@ interval_trunc(PG_FUNCTION_ARGS) result = (Interval *) palloc(sizeof(Interval)); - lowunits = downcase_truncate_identifier(VARDATA(units), - VARSIZE(units) - VARHDRSZ, + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), + VARSIZE_ANY_EXHDR(units), false); type = DecodeUnits(0, lowunits, &val); @@ -3615,9 +3615,7 @@ interval_trunc(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("interval units \"%s\" not recognized", - DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(units)))))); - *result = *interval; + lowunits))); } PG_RETURN_INTERVAL_P(result); @@ -3803,7 +3801,7 @@ date2isoyearday(int year, int mon, int mday) Datum timestamp_part(PG_FUNCTION_ARGS) { - text *units = PG_GETARG_TEXT_P(0); + text *units = PG_GETARG_TEXT_PP(0); Timestamp timestamp = PG_GETARG_TIMESTAMP(1); float8 result; int type, @@ -3819,8 +3817,8 @@ timestamp_part(PG_FUNCTION_ARGS) PG_RETURN_FLOAT8(result); } - lowunits = downcase_truncate_identifier(VARDATA(units), - VARSIZE(units) - VARHDRSZ, + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), + VARSIZE_ANY_EXHDR(units), false); type = DecodeUnits(0, lowunits, &val); @@ -4031,7 +4029,7 @@ timestamp_part(PG_FUNCTION_ARGS) Datum timestamptz_part(PG_FUNCTION_ARGS) { - text *units = PG_GETARG_TEXT_P(0); + text *units = PG_GETARG_TEXT_PP(0); TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1); float8 result; int tz; @@ -4050,8 +4048,8 @@ timestamptz_part(PG_FUNCTION_ARGS) PG_RETURN_FLOAT8(result); } - lowunits = downcase_truncate_identifier(VARDATA(units), - VARSIZE(units) - VARHDRSZ, + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), + VARSIZE_ANY_EXHDR(units), false); type = DecodeUnits(0, lowunits, &val); @@ -4246,7 +4244,7 @@ timestamptz_part(PG_FUNCTION_ARGS) Datum interval_part(PG_FUNCTION_ARGS) { - text *units = PG_GETARG_TEXT_P(0); + text *units = PG_GETARG_TEXT_PP(0); Interval *interval = PG_GETARG_INTERVAL_P(1); float8 result; int type, @@ -4256,8 +4254,8 @@ interval_part(PG_FUNCTION_ARGS) struct pg_tm tt, *tm = &tt; - lowunits = downcase_truncate_identifier(VARDATA(units), - VARSIZE(units) - VARHDRSZ, + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), + VARSIZE_ANY_EXHDR(units), false); type = DecodeUnits(0, lowunits, &val); @@ -4337,8 +4335,7 @@ interval_part(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("interval units \"%s\" not supported", - DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(units)))))); + lowunits))); result = 0; } @@ -4365,8 +4362,7 @@ interval_part(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("interval units \"%s\" not recognized", - DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(units)))))); + lowunits))); result = 0; } @@ -4385,13 +4381,12 @@ interval_part(PG_FUNCTION_ARGS) Datum timestamp_zone(PG_FUNCTION_ARGS) { - text *zone = PG_GETARG_TEXT_P(0); + text *zone = PG_GETARG_TEXT_PP(0); Timestamp timestamp = PG_GETARG_TIMESTAMP(1); TimestampTz result; int tz; pg_tz *tzp; char tzname[TZ_STRLEN_MAX + 1]; - int len; if (TIMESTAMP_NOT_FINITE(timestamp)) PG_RETURN_TIMESTAMPTZ(timestamp); @@ -4401,9 +4396,7 @@ timestamp_zone(PG_FUNCTION_ARGS) * (to handle cases like "America/New_York"), and if that fails, we look * in the date token table (to handle cases like "EST"). */ - len = Min(VARSIZE(zone) - VARHDRSZ, TZ_STRLEN_MAX); - memcpy(tzname, VARDATA(zone), len); - tzname[len] = '\0'; + text_to_cstring_buffer(zone, tzname, sizeof(tzname)); tzp = pg_tzset(tzname); if (tzp) { @@ -4428,8 +4421,8 @@ timestamp_zone(PG_FUNCTION_ARGS) int type, val; - lowzone = downcase_truncate_identifier(VARDATA(zone), - VARSIZE(zone) - VARHDRSZ, + lowzone = downcase_truncate_identifier(tzname, + strlen(tzname), false); type = DecodeSpecial(0, lowzone, &val); @@ -4558,13 +4551,12 @@ timestamptz_timestamp(PG_FUNCTION_ARGS) Datum timestamptz_zone(PG_FUNCTION_ARGS) { - text *zone = PG_GETARG_TEXT_P(0); + text *zone = PG_GETARG_TEXT_PP(0); TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1); Timestamp result; int tz; pg_tz *tzp; char tzname[TZ_STRLEN_MAX + 1]; - int len; if (TIMESTAMP_NOT_FINITE(timestamp)) PG_RETURN_TIMESTAMP(timestamp); @@ -4574,9 +4566,7 @@ timestamptz_zone(PG_FUNCTION_ARGS) * (to handle cases like "America/New_York"), and if that fails, we look * in the date token table (to handle cases like "EST"). */ - len = Min(VARSIZE(zone) - VARHDRSZ, TZ_STRLEN_MAX); - memcpy(tzname, VARDATA(zone), len); - tzname[len] = '\0'; + text_to_cstring_buffer(zone, tzname, sizeof(tzname)); tzp = pg_tzset(tzname); if (tzp) { @@ -4600,8 +4590,8 @@ timestamptz_zone(PG_FUNCTION_ARGS) int type, val; - lowzone = downcase_truncate_identifier(VARDATA(zone), - VARSIZE(zone) - VARHDRSZ, + lowzone = downcase_truncate_identifier(tzname, + strlen(tzname), false); type = DecodeSpecial(0, lowzone, &val); diff --git a/src/backend/utils/adt/tsginidx.c b/src/backend/utils/adt/tsginidx.c index 96510021f6d..add1fc1910c 100644 --- a/src/backend/utils/adt/tsginidx.c +++ b/src/backend/utils/adt/tsginidx.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsginidx.c,v 1.9 2008/01/01 19:45:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsginidx.c,v 1.10 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -16,6 +16,7 @@ #include "access/skey.h" #include "tsearch/ts_type.h" #include "tsearch/ts_utils.h" +#include "utils/builtins.h" Datum @@ -35,11 +36,9 @@ gin_extract_tsvector(PG_FUNCTION_ARGS) for (i = 0; i < vector->size; i++) { - text *txt = (text *) palloc(VARHDRSZ + we->len); - - SET_VARSIZE(txt, VARHDRSZ + we->len); - memcpy(VARDATA(txt), STRPTR(vector) + we->pos, we->len); + text *txt; + txt = cstring_to_text_with_len(STRPTR(vector) + we->pos, we->len); entries[i] = PointerGetDatum(txt); we++; @@ -87,11 +86,8 @@ gin_extract_tsquery(PG_FUNCTION_ARGS) text *txt; QueryOperand *val = &item[i].operand; - txt = (text *) palloc(VARHDRSZ + val->length); - - SET_VARSIZE(txt, VARHDRSZ + val->length); - memcpy(VARDATA(txt), GETOPERAND(query) + val->distance, val->length); - + txt = cstring_to_text_with_len(GETOPERAND(query) + val->distance, + val->length); entries[j++] = PointerGetDatum(txt); if (strategy != TSearchWithClassStrategyNumber && val->weight != 0) diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index 41863fb5db5..d84d4ad931e 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery.c,v 1.15 2008/01/08 01:04:08 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery.c,v 1.16 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -19,6 +19,7 @@ #include "tsearch/ts_locale.h" #include "tsearch/ts_type.h" #include "tsearch/ts_utils.h" +#include "utils/builtins.h" #include "utils/memutils.h" #include "utils/pg_crc.h" @@ -954,9 +955,7 @@ tsquerytree(PG_FUNCTION_ARGS) if (!q) { - res = (text *) palloc(1 + VARHDRSZ); - SET_VARSIZE(res, 1 + VARHDRSZ); - *((char *) VARDATA(res)) = 'T'; + res = cstring_to_text("T"); } else { @@ -966,14 +965,11 @@ tsquerytree(PG_FUNCTION_ARGS) *(nrm.cur) = '\0'; nrm.op = GETOPERAND(query); infix(&nrm, true); - - res = (text *) palloc(nrm.cur - nrm.buf + VARHDRSZ); - SET_VARSIZE(res, nrm.cur - nrm.buf + VARHDRSZ); - strncpy(VARDATA(res), nrm.buf, nrm.cur - nrm.buf); + res = cstring_to_text_with_len(nrm.buf, nrm.cur - nrm.buf); pfree(q); } PG_FREE_IF_COPY(query, 0); - PG_RETURN_POINTER(res); + PG_RETURN_TEXT_P(res); } diff --git a/src/backend/utils/adt/tsquery_rewrite.c b/src/backend/utils/adt/tsquery_rewrite.c index 89f11731dd4..df917642062 100644 --- a/src/backend/utils/adt/tsquery_rewrite.c +++ b/src/backend/utils/adt/tsquery_rewrite.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_rewrite.c,v 1.11 2008/01/01 19:45:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_rewrite.c,v 1.12 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -273,7 +273,7 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS) QTNTernary(tree); QTNSort(tree); - buf = TextPGetCString(in); + buf = text_to_cstring(in); SPI_connect(); diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c index eee15a673dd..0624c00ea91 100644 --- a/src/backend/utils/adt/tsvector_op.c +++ b/src/backend/utils/adt/tsvector_op.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.13 2008/03/05 15:50:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.14 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1082,7 +1082,7 @@ ts_process_call(FuncCallContext *funcctx) static tsstat * ts_stat_sql(text *txt, text *ws) { - char *query = TextPGetCString(txt); + char *query = text_to_cstring(txt); int i; tsstat *newstat, *stat; diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index c954e2034ad..49ce0ef4d69 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/varchar.c,v 1.126 2008/01/01 19:45:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/varchar.c,v 1.127 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -203,21 +203,16 @@ bpcharin(PG_FUNCTION_ARGS) /* * Convert a CHARACTER value to a C string. + * + * Uses the text conversion functions, which is only appropriate if BpChar + * and text are equivalent types. */ Datum bpcharout(PG_FUNCTION_ARGS) { - BpChar *s = PG_GETARG_BPCHAR_PP(0); - char *result; - int len; + Datum txt = PG_GETARG_DATUM(0); - /* copy and add null term */ - len = VARSIZE_ANY_EXHDR(s); - result = (char *) palloc(len + 1); - memcpy(result, VARDATA_ANY(s), len); - result[len] = '\0'; - - PG_RETURN_CSTRING(result); + PG_RETURN_CSTRING(TextDatumGetCString(txt)); } /* @@ -403,19 +398,17 @@ bpchar_name(PG_FUNCTION_ARGS) /* name_bpchar() * Converts a NameData type to a bpchar type. + * + * Uses the text conversion functions, which is only appropriate if BpChar + * and text are equivalent types. */ Datum name_bpchar(PG_FUNCTION_ARGS) { Name s = PG_GETARG_NAME(0); BpChar *result; - int len; - - len = strlen(NameStr(*s)); - result = (BpChar *) palloc(VARHDRSZ + len); - memcpy(VARDATA(result), NameStr(*s), len); - SET_VARSIZE(result, VARHDRSZ + len); + result = (BpChar *) cstring_to_text(NameStr(*s)); PG_RETURN_BPCHAR_P(result); } @@ -454,6 +447,9 @@ bpchartypmodout(PG_FUNCTION_ARGS) * * If the input string is too long, raise an error, unless the extra * characters are spaces, in which case they're truncated. (per SQL) + * + * Uses the C string to text conversion function, which is only appropriate + * if VarChar and text are equivalent types. */ static VarChar * varchar_input(const char *s, size_t len, int32 atttypmod) @@ -481,10 +477,7 @@ varchar_input(const char *s, size_t len, int32 atttypmod) len = mbmaxlen; } - result = (VarChar *) palloc(len + VARHDRSZ); - SET_VARSIZE(result, len + VARHDRSZ); - memcpy(VARDATA(result), s, len); - + result = (VarChar *) cstring_to_text_with_len(s, len); return result; } @@ -510,21 +503,16 @@ varcharin(PG_FUNCTION_ARGS) /* * Convert a VARCHAR value to a C string. + * + * Uses the text to C string conversion function, which is only appropriate + * if VarChar and text are equivalent types. */ Datum varcharout(PG_FUNCTION_ARGS) { - VarChar *s = PG_GETARG_VARCHAR_PP(0); - char *result; - int32 len; - - /* copy and add null term */ - len = VARSIZE_ANY_EXHDR(s); - result = palloc(len + 1); - memcpy(result, VARDATA_ANY(s), len); - result[len] = '\0'; + Datum txt = PG_GETARG_DATUM(0); - PG_RETURN_CSTRING(result); + PG_RETURN_CSTRING(TextDatumGetCString(txt)); } /* diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 75832856b6c..aa56317c7ff 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.163 2008/03/13 18:31:56 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.164 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -48,15 +48,6 @@ typedef struct #define PG_GETARG_UNKNOWN_P_COPY(n) DatumGetUnknownPCopy(PG_GETARG_DATUM(n)) #define PG_RETURN_UNKNOWN_P(x) PG_RETURN_POINTER(x) -#define PG_TEXTARG_GET_STR(arg_) \ - DatumGetCString(DirectFunctionCall1(textout, PG_GETARG_DATUM(arg_))) -#define PG_TEXT_GET_STR(textp_) \ - DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(textp_))) -#define PG_STR_GET_TEXT(str_) \ - DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(str_))) -#define TEXTLEN(textp) \ - text_length(PointerGetDatum(textp)) - static int text_cmp(text *arg1, text *arg2); static int32 text_length(Datum str); static int text_position(text *t1, text *t2); @@ -67,11 +58,108 @@ static text *text_substring(Datum str, int32 start, int32 length, bool length_not_specified); - static void appendStringInfoText(StringInfo str, const text *t); /***************************************************************************** + * CONVERSION ROUTINES EXPORTED FOR USE BY C CODE * + *****************************************************************************/ + +/* + * cstring_to_text + * + * Create a text value from a null-terminated C string. + * + * The new text value is freshly palloc'd with a full-size VARHDR. + */ +text * +cstring_to_text(const char *s) +{ + return cstring_to_text_with_len(s, strlen(s)); +} + +/* + * cstring_to_text_with_len + * + * Same as cstring_to_text except the caller specifies the string length; + * the string need not be null_terminated. + */ +text * +cstring_to_text_with_len(const char *s, int len) +{ + text *result = (text *) palloc(len + VARHDRSZ); + + SET_VARSIZE(result, len + VARHDRSZ); + memcpy(VARDATA(result), s, len); + + return result; +} + +/* + * text_to_cstring + * + * Create a palloc'd, null-terminated C string from a text value. + * + * We support being passed a compressed or toasted text value. + * This is a bit bogus since such values shouldn't really be referred to as + * "text *", but it seems useful for robustness. If we didn't handle that + * case here, we'd need another routine that did, anyway. + */ +char * +text_to_cstring(const text *t) +{ + /* must cast away the const, unfortunately */ + text *tunpacked = pg_detoast_datum_packed((struct varlena *) t); + int len = VARSIZE_ANY_EXHDR(tunpacked); + char *result; + + result = (char *) palloc(len + 1); + memcpy(result, VARDATA_ANY(tunpacked), len); + result[len] = '\0'; + + if (tunpacked != t) + pfree(tunpacked); + + return result; +} + +/* + * text_to_cstring_buffer + * + * Copy a text value into a caller-supplied buffer of size dst_len. + * + * The text string is truncated if necessary to fit. The result is + * guaranteed null-terminated (unless dst_len == 0). + * + * We support being passed a compressed or toasted text value. + * This is a bit bogus since such values shouldn't really be referred to as + * "text *", but it seems useful for robustness. If we didn't handle that + * case here, we'd need another routine that did, anyway. + */ +void +text_to_cstring_buffer(const text *src, char *dst, size_t dst_len) +{ + /* must cast away the const, unfortunately */ + text *srcunpacked = pg_detoast_datum_packed((struct varlena *) src); + size_t src_len = VARSIZE_ANY_EXHDR(srcunpacked); + + if (dst_len > 0) + { + dst_len--; + if (dst_len >= src_len) + dst_len = src_len; + else /* ensure truncation is encoding-safe */ + dst_len = pg_mbcliplen(VARDATA_ANY(srcunpacked), src_len, dst_len); + memcpy(dst, VARDATA_ANY(srcunpacked), dst_len); + dst[dst_len] = '\0'; + } + + if (srcunpacked != src) + pfree(srcunpacked); +} + + +/***************************************************************************** * USER I/O ROUTINES * *****************************************************************************/ @@ -259,16 +347,8 @@ Datum textin(PG_FUNCTION_ARGS) { char *inputText = PG_GETARG_CSTRING(0); - text *result; - int len; - - len = strlen(inputText); - result = (text *) palloc(len + VARHDRSZ); - SET_VARSIZE(result, len + VARHDRSZ); - memcpy(VARDATA(result), inputText, len); - - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(inputText)); } /* @@ -277,16 +357,9 @@ textin(PG_FUNCTION_ARGS) Datum textout(PG_FUNCTION_ARGS) { - text *t = PG_GETARG_TEXT_PP(0); - int len; - char *result; + Datum txt = PG_GETARG_DATUM(0); - len = VARSIZE_ANY_EXHDR(t); - result = (char *) palloc(len + 1); - memcpy(result, VARDATA_ANY(t), len); - result[len] = '\0'; - - PG_RETURN_CSTRING(result); + PG_RETURN_CSTRING(TextDatumGetCString(txt)); } /* @@ -302,9 +375,7 @@ textrecv(PG_FUNCTION_ARGS) str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes); - result = (text *) palloc(nbytes + VARHDRSZ); - SET_VARSIZE(result, nbytes + VARHDRSZ); - memcpy(VARDATA(result), str, nbytes); + result = cstring_to_text_with_len(str, nbytes); pfree(str); PG_RETURN_TEXT_P(result); } @@ -600,7 +671,7 @@ text_substring(Datum str, int32 start, int32 length, bool length_not_specified) * string. */ if (E < 1) - return PG_STR_GET_TEXT(""); + return cstring_to_text(""); L1 = E - S1; } @@ -664,7 +735,7 @@ text_substring(Datum str, int32 start, int32 length, bool length_not_specified) * string. */ if (E < 1) - return PG_STR_GET_TEXT(""); + return cstring_to_text(""); /* * if E is past the end of the string, the tuple toaster will @@ -693,7 +764,7 @@ text_substring(Datum str, int32 start, int32 length, bool length_not_specified) { if (slice != (text *) DatumGetPointer(str)) pfree(slice); - return PG_STR_GET_TEXT(""); + return cstring_to_text(""); } /* Now we can get the actual length of the slice in MB characters */ @@ -708,7 +779,7 @@ text_substring(Datum str, int32 start, int32 length, bool length_not_specified) { if (slice != (text *) DatumGetPointer(str)) pfree(slice); - return PG_STR_GET_TEXT(""); + return cstring_to_text(""); } /* @@ -1759,16 +1830,8 @@ Datum name_text(PG_FUNCTION_ARGS) { Name s = PG_GETARG_NAME(0); - text *result; - int len; - - len = strlen(NameStr(*s)); - - result = palloc(VARHDRSZ + len); - SET_VARSIZE(result, VARHDRSZ + len); - memcpy(VARDATA(result), NameStr(*s), len); - PG_RETURN_TEXT_P(result); + PG_RETURN_TEXT_P(cstring_to_text(NameStr(*s))); } @@ -1790,8 +1853,7 @@ textToQualifiedNameList(text *textval) /* Convert to C string (handles possible detoasting). */ /* Note we rely on being able to modify rawname below. */ - rawname = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(textval))); + rawname = text_to_cstring(textval); if (!SplitIdentifierString(rawname, '.', &namelist)) ereport(ERROR, @@ -2103,7 +2165,7 @@ byteacmp(PG_FUNCTION_ARGS) * appendStringInfoText * * Append a text to str. - * Like appendStringInfoString(str, PG_TEXT_GET_STR(s)) but faster. + * Like appendStringInfoString(str, text_to_cstring(t)) but faster. */ static void appendStringInfoText(StringInfo str, const text *t) @@ -2191,7 +2253,7 @@ replace_text(PG_FUNCTION_ARGS) text_position_cleanup(&state); - ret_text = PG_STR_GET_TEXT(str.data); + ret_text = cstring_to_text_with_len(str.data, str.len); pfree(str.data); PG_RETURN_TEXT_P(ret_text); @@ -2458,7 +2520,7 @@ replace_text_regexp(text *src_text, void *regexp, appendBinaryStringInfo(&buf, start_ptr, chunk_len); } - ret_text = PG_STR_GET_TEXT(buf.data); + ret_text = cstring_to_text_with_len(buf.data, buf.len); pfree(buf.data); pfree(data); @@ -2503,7 +2565,7 @@ split_text(PG_FUNCTION_ARGS) if (inputstring_len < 1) { text_position_cleanup(&state); - PG_RETURN_TEXT_P(PG_STR_GET_TEXT("")); + PG_RETURN_TEXT_P(cstring_to_text("")); } /* empty field separator */ @@ -2514,7 +2576,7 @@ split_text(PG_FUNCTION_ARGS) if (fldnum == 1) PG_RETURN_TEXT_P(inputstring); else - PG_RETURN_TEXT_P(PG_STR_GET_TEXT("")); + PG_RETURN_TEXT_P(cstring_to_text("")); } /* identify bounds of first field */ @@ -2529,7 +2591,7 @@ split_text(PG_FUNCTION_ARGS) if (fldnum == 1) PG_RETURN_TEXT_P(inputstring); else - PG_RETURN_TEXT_P(PG_STR_GET_TEXT("")); + PG_RETURN_TEXT_P(cstring_to_text("")); } while (end_posn > 0 && --fldnum > 0) @@ -2551,7 +2613,7 @@ split_text(PG_FUNCTION_ARGS) -1, true); else - result_text = PG_STR_GET_TEXT(""); + result_text = cstring_to_text(""); } else { @@ -2636,9 +2698,7 @@ text_to_array(PG_FUNCTION_ARGS) } /* must build a temp text datum to pass to accumArrayResult */ - result_text = (text *) palloc(VARHDRSZ + chunk_len); - SET_VARSIZE(result_text, VARHDRSZ + chunk_len); - memcpy(VARDATA(result_text), start_ptr, chunk_len); + result_text = cstring_to_text_with_len(start_ptr, chunk_len); /* stash away this field */ astate = accumArrayResult(astate, @@ -2673,7 +2733,7 @@ Datum array_to_text(PG_FUNCTION_ARGS) { ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); - char *fldsep = PG_TEXTARG_GET_STR(1); + char *fldsep = text_to_cstring(PG_GETARG_TEXT_PP(1)); int nitems, *dims, ndims; @@ -2695,7 +2755,7 @@ array_to_text(PG_FUNCTION_ARGS) /* if there are no elements, return an empty string */ if (nitems == 0) - PG_RETURN_TEXT_P(PG_STR_GET_TEXT("")); + PG_RETURN_TEXT_P(cstring_to_text("")); element_type = ARR_ELEMTYPE(v); initStringInfo(&buf); @@ -2773,7 +2833,7 @@ array_to_text(PG_FUNCTION_ARGS) } } - PG_RETURN_TEXT_P(PG_STR_GET_TEXT(buf.data)); + PG_RETURN_TEXT_P(cstring_to_text_with_len(buf.data, buf.len)); } #define HEXBASE 16 @@ -2785,7 +2845,6 @@ Datum to_hex32(PG_FUNCTION_ARGS) { uint32 value = (uint32) PG_GETARG_INT32(0); - text *result_text; char *ptr; const char *digits = "0123456789abcdef"; char buf[32]; /* bigger than needed, but reasonable */ @@ -2799,8 +2858,7 @@ to_hex32(PG_FUNCTION_ARGS) value /= HEXBASE; } while (ptr > buf && value); - result_text = PG_STR_GET_TEXT(ptr); - PG_RETURN_TEXT_P(result_text); + PG_RETURN_TEXT_P(cstring_to_text(ptr)); } /* @@ -2811,7 +2869,6 @@ Datum to_hex64(PG_FUNCTION_ARGS) { uint64 value = (uint64) PG_GETARG_INT64(0); - text *result_text; char *ptr; const char *digits = "0123456789abcdef"; char buf[32]; /* bigger than needed, but reasonable */ @@ -2825,8 +2882,7 @@ to_hex64(PG_FUNCTION_ARGS) value /= HEXBASE; } while (ptr > buf && value); - result_text = PG_STR_GET_TEXT(ptr); - PG_RETURN_TEXT_P(result_text); + PG_RETURN_TEXT_P(cstring_to_text(ptr)); } /* @@ -2842,7 +2898,6 @@ md5_text(PG_FUNCTION_ARGS) text *in_text = PG_GETARG_TEXT_PP(0); size_t len; char hexsum[MD5_HASH_LEN + 1]; - text *result_text; /* Calculate the length of the buffer using varlena metadata */ len = VARSIZE_ANY_EXHDR(in_text); @@ -2854,8 +2909,7 @@ md5_text(PG_FUNCTION_ARGS) errmsg("out of memory"))); /* convert to text and return it */ - result_text = PG_STR_GET_TEXT(hexsum); - PG_RETURN_TEXT_P(result_text); + PG_RETURN_TEXT_P(cstring_to_text(hexsum)); } /* @@ -2868,7 +2922,6 @@ md5_bytea(PG_FUNCTION_ARGS) bytea *in = PG_GETARG_BYTEA_PP(0); size_t len; char hexsum[MD5_HASH_LEN + 1]; - text *result_text; len = VARSIZE_ANY_EXHDR(in); if (pg_md5_hash(VARDATA_ANY(in), len, hexsum) == false) @@ -2876,8 +2929,7 @@ md5_bytea(PG_FUNCTION_ARGS) (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory"))); - result_text = PG_STR_GET_TEXT(hexsum); - PG_RETURN_TEXT_P(result_text); + PG_RETURN_TEXT_P(cstring_to_text(hexsum)); } /* diff --git a/src/backend/utils/adt/version.c b/src/backend/utils/adt/version.c index 0ffe0da0429..1a2619c4c6e 100644 --- a/src/backend/utils/adt/version.c +++ b/src/backend/utils/adt/version.c @@ -7,7 +7,7 @@ * * IDENTIFICATION * - * $PostgreSQL: pgsql/src/backend/utils/adt/version.c,v 1.16 2008/01/01 19:45:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/version.c,v 1.17 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -20,11 +20,5 @@ Datum pgsql_version(PG_FUNCTION_ARGS) { - int n = strlen(PG_VERSION_STR); - text *ret = (text *) palloc(n + VARHDRSZ); - - SET_VARSIZE(ret, n + VARHDRSZ); - memcpy(VARDATA(ret), PG_VERSION_STR, n); - - PG_RETURN_TEXT_P(ret); + PG_RETURN_TEXT_P(cstring_to_text(PG_VERSION_STR)); } diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index f0a668b2927..c4960bcecfb 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.70 2008/03/24 19:12:49 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.71 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -141,10 +141,6 @@ static void SPI_sql_row_to_xmlelement(int rownum, StringInfo result, errhint("You need to rebuild PostgreSQL using --with-libxml."))) -#define _textin(str) DirectFunctionCall1(textin, CStringGetDatum(str)) -#define _textout(x) DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(x))) - - /* from SQL/XML:2003 section 4.7 */ #define NAMESPACE_XSD "http://www.w3.org/2001/XMLSchema" #define NAMESPACE_XSI "http://www.w3.org/2001/XMLSchema-instance" @@ -168,19 +164,22 @@ xmlChar_to_encoding(xmlChar * encoding_name) #endif +/* + * xml_in uses a plain C string to VARDATA conversion, so for the time being + * we use the conversion function for the text datatype. + * + * This is only acceptable so long as xmltype and text use the same + * representation. + */ Datum xml_in(PG_FUNCTION_ARGS) { #ifdef USE_LIBXML char *s = PG_GETARG_CSTRING(0); - size_t len; xmltype *vardata; xmlDocPtr doc; - len = strlen(s); - vardata = palloc(len + VARHDRSZ); - SET_VARSIZE(vardata, len + VARHDRSZ); - memcpy(VARDATA(vardata), s, len); + vardata = (xmltype *) cstring_to_text(s); /* * Parse the data to check if it is well-formed XML data. Assume that @@ -200,6 +199,13 @@ xml_in(PG_FUNCTION_ARGS) #define PG_XML_DEFAULT_VERSION "1.0" +/* + * xml_out_internal uses a plain VARDATA to C string conversion, so for the + * time being we use the conversion function for the text datatype. + * + * This is only acceptable so long as xmltype and text use the same + * representation. + */ static char * xml_out_internal(xmltype *x, pg_enc target_encoding) { @@ -213,10 +219,8 @@ xml_out_internal(xmltype *x, pg_enc target_encoding) int res_code; #endif - len = VARSIZE(x) - VARHDRSZ; - str = palloc(len + 1); - memcpy(str, VARDATA(x), len); - str[len] = '\0'; + str = text_to_cstring((text *) x); + len = strlen(str); #ifdef USE_LIBXML if ((res_code = parse_xml_decl((xmlChar *) str, @@ -713,7 +717,7 @@ xmlpi(char *target, text *arg, bool arg_is_null, bool *result_is_null) { char *string; - string = _textout(arg); + string = text_to_cstring(arg); if (strstr(string, "?>") != NULL) ereport(ERROR, (errcode(ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION), @@ -1930,7 +1934,7 @@ table_to_xml(PG_FUNCTION_ARGS) Oid relid = PG_GETARG_OID(0); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); PG_RETURN_XML_P(stringinfo_to_xmltype(table_to_xml_internal(relid, NULL, nulls, tableforest, @@ -1941,10 +1945,10 @@ table_to_xml(PG_FUNCTION_ARGS) Datum query_to_xml(PG_FUNCTION_ARGS) { - char *query = _textout(PG_GETARG_TEXT_P(0)); + char *query = text_to_cstring(PG_GETARG_TEXT_PP(0)); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); PG_RETURN_XML_P(stringinfo_to_xmltype(query_to_xml_internal(query, NULL, NULL, nulls, tableforest, @@ -1955,11 +1959,11 @@ query_to_xml(PG_FUNCTION_ARGS) Datum cursor_to_xml(PG_FUNCTION_ARGS) { - char *name = _textout(PG_GETARG_TEXT_P(0)); + char *name = text_to_cstring(PG_GETARG_TEXT_PP(0)); int32 count = PG_GETARG_INT32(1); bool nulls = PG_GETARG_BOOL(2); bool tableforest = PG_GETARG_BOOL(3); - const char *targetns = _textout(PG_GETARG_TEXT_P(4)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(4)); StringInfoData result; Portal portal; @@ -2079,7 +2083,7 @@ table_to_xmlschema(PG_FUNCTION_ARGS) Oid relid = PG_GETARG_OID(0); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); const char *result; Relation rel; @@ -2095,10 +2099,10 @@ table_to_xmlschema(PG_FUNCTION_ARGS) Datum query_to_xmlschema(PG_FUNCTION_ARGS) { - char *query = _textout(PG_GETARG_TEXT_P(0)); + char *query = text_to_cstring(PG_GETARG_TEXT_PP(0)); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); const char *result; SPIPlanPtr plan; Portal portal; @@ -2124,10 +2128,10 @@ query_to_xmlschema(PG_FUNCTION_ARGS) Datum cursor_to_xmlschema(PG_FUNCTION_ARGS) { - char *name = _textout(PG_GETARG_TEXT_P(0)); + char *name = text_to_cstring(PG_GETARG_TEXT_PP(0)); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); const char *xmlschema; Portal portal; @@ -2153,7 +2157,7 @@ table_to_xml_and_xmlschema(PG_FUNCTION_ARGS) Oid relid = PG_GETARG_OID(0); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); Relation rel; const char *xmlschema; @@ -2171,10 +2175,10 @@ table_to_xml_and_xmlschema(PG_FUNCTION_ARGS) Datum query_to_xml_and_xmlschema(PG_FUNCTION_ARGS) { - char *query = _textout(PG_GETARG_TEXT_P(0)); + char *query = text_to_cstring(PG_GETARG_TEXT_PP(0)); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); const char *xmlschema; SPIPlanPtr plan; @@ -2255,7 +2259,7 @@ schema_to_xml(PG_FUNCTION_ARGS) Name name = PG_GETARG_NAME(0); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); char *schemaname; Oid nspid; @@ -2346,7 +2350,7 @@ schema_to_xmlschema(PG_FUNCTION_ARGS) Name name = PG_GETARG_NAME(0); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); PG_RETURN_XML_P(stringinfo_to_xmltype(schema_to_xmlschema_internal(NameStr(*name), nulls, tableforest, targetns))); @@ -2359,7 +2363,7 @@ schema_to_xml_and_xmlschema(PG_FUNCTION_ARGS) Name name = PG_GETARG_NAME(0); bool nulls = PG_GETARG_BOOL(1); bool tableforest = PG_GETARG_BOOL(2); - const char *targetns = _textout(PG_GETARG_TEXT_P(3)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3)); char *schemaname; Oid nspid; StringInfo xmlschema; @@ -2431,7 +2435,7 @@ database_to_xml(PG_FUNCTION_ARGS) { bool nulls = PG_GETARG_BOOL(0); bool tableforest = PG_GETARG_BOOL(1); - const char *targetns = _textout(PG_GETARG_TEXT_P(2)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(2)); PG_RETURN_XML_P(stringinfo_to_xmltype(database_to_xml_internal(NULL, nulls, tableforest, targetns))); @@ -2486,7 +2490,7 @@ database_to_xmlschema(PG_FUNCTION_ARGS) { bool nulls = PG_GETARG_BOOL(0); bool tableforest = PG_GETARG_BOOL(1); - const char *targetns = _textout(PG_GETARG_TEXT_P(2)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(2)); PG_RETURN_XML_P(stringinfo_to_xmltype(database_to_xmlschema_internal(nulls, tableforest, targetns))); @@ -2498,7 +2502,7 @@ database_to_xml_and_xmlschema(PG_FUNCTION_ARGS) { bool nulls = PG_GETARG_BOOL(0); bool tableforest = PG_GETARG_BOOL(1); - const char *targetns = _textout(PG_GETARG_TEXT_P(2)); + const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(2)); StringInfo xmlschema; xmlschema = database_to_xmlschema_internal(nulls, tableforest, targetns); @@ -3198,7 +3202,7 @@ xml_xmlnodetoxmltype(xmlNodePtr cur) { str = xmlXPathCastNodeToString(cur); len = strlen((char *) str); - result = (text *) palloc(len + VARHDRSZ); + result = (xmltype *) palloc(len + VARHDRSZ); SET_VARSIZE(result, len + VARHDRSZ); memcpy(VARDATA(result), str, len); } @@ -3363,8 +3367,8 @@ xpath(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("neither namespace name nor URI may be null"))); - ns_name = _textout(ns_names_uris[i * 2]); - ns_uri = _textout(ns_names_uris[i * 2 + 1]); + ns_name = TextDatumGetCString(ns_names_uris[i * 2]); + ns_uri = TextDatumGetCString(ns_names_uris[i * 2 + 1]); if (xmlXPathRegisterNs(xpathctx, (xmlChar *) ns_name, (xmlChar *) ns_uri) != 0) diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 70872f56c7b..76e39ca8af7 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.155 2008/01/01 19:45:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.156 2008/03/25 22:42:44 tgl Exp $ * * NOTES * Eventually, the index information should go through here, too. @@ -1971,8 +1971,7 @@ get_typdefault(Oid typid) if (!isNull) { /* We have an expression default */ - expr = stringToNode(DatumGetCString(DirectFunctionCall1(textout, - datum))); + expr = stringToNode(TextDatumGetCString(datum)); } else { @@ -1987,8 +1986,7 @@ get_typdefault(Oid typid) char *strDefaultVal; /* Convert text datum to C string */ - strDefaultVal = DatumGetCString(DirectFunctionCall1(textout, - datum)); + strDefaultVal = TextDatumGetCString(datum); /* Convert C string to a value of the given type */ datum = OidInputFunctionCall(type->typinput, strDefaultVal, getTypeIOParam(typeTuple), -1); diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index ca4305c60ba..e6f7eef8005 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.267 2008/02/27 17:44:19 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.268 2008/03/25 22:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -642,7 +642,6 @@ RelationBuildRuleLock(Relation relation) Form_pg_rewrite rewrite_form = (Form_pg_rewrite) GETSTRUCT(rewrite_tuple); bool isnull; Datum rule_datum; - text *rule_text; char *rule_str; RewriteRule *rule; @@ -667,30 +666,22 @@ RelationBuildRuleLock(Relation relation) rewrite_tupdesc, &isnull); Assert(!isnull); - rule_text = DatumGetTextP(rule_datum); - rule_str = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(rule_text))); + rule_str = TextDatumGetCString(rule_datum); oldcxt = MemoryContextSwitchTo(rulescxt); rule->actions = (List *) stringToNode(rule_str); MemoryContextSwitchTo(oldcxt); pfree(rule_str); - if ((Pointer) rule_text != DatumGetPointer(rule_datum)) - pfree(rule_text); rule_datum = heap_getattr(rewrite_tuple, Anum_pg_rewrite_ev_qual, rewrite_tupdesc, &isnull); Assert(!isnull); - rule_text = DatumGetTextP(rule_datum); - rule_str = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(rule_text))); + rule_str = TextDatumGetCString(rule_datum); oldcxt = MemoryContextSwitchTo(rulescxt); rule->qual = (Node *) stringToNode(rule_str); MemoryContextSwitchTo(oldcxt); pfree(rule_str); - if ((Pointer) rule_text != DatumGetPointer(rule_datum)) - pfree(rule_text); /* * We want the rule's table references to be checked as though by the @@ -2770,8 +2761,7 @@ AttrDefaultFetch(Relation relation) RelationGetRelationName(relation)); else attrdef[i].adbin = MemoryContextStrdup(CacheMemoryContext, - DatumGetCString(DirectFunctionCall1(textout, - val))); + TextDatumGetCString(val)); break; } @@ -2834,8 +2824,7 @@ CheckConstraintFetch(Relation relation) RelationGetRelationName(relation)); check[found].ccbin = MemoryContextStrdup(CacheMemoryContext, - DatumGetCString(DirectFunctionCall1(textout, - val))); + TextDatumGetCString(val)); found++; } @@ -3068,7 +3057,7 @@ RelationGetIndexExpressions(Relation relation) GetPgIndexDescriptor(), &isnull); Assert(!isnull); - exprsString = DatumGetCString(DirectFunctionCall1(textout, exprsDatum)); + exprsString = TextDatumGetCString(exprsDatum); result = (List *) stringToNode(exprsString); pfree(exprsString); @@ -3135,7 +3124,7 @@ RelationGetIndexPredicate(Relation relation) GetPgIndexDescriptor(), &isnull); Assert(!isnull); - predString = DatumGetCString(DirectFunctionCall1(textout, predDatum)); + predString = TextDatumGetCString(predDatum); result = (List *) stringToNode(predString); pfree(predString); diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c index 19216b4381c..e06da243ab0 100644 --- a/src/backend/utils/fmgr/fmgr.c +++ b/src/backend/utils/fmgr/fmgr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/fmgr/fmgr.c,v 1.113 2008/01/03 21:23:15 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/fmgr/fmgr.c,v 1.114 2008/03/25 22:42:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -246,8 +246,7 @@ fmgr_info_cxt_security(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt, Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc"); - prosrc = DatumGetCString(DirectFunctionCall1(textout, - prosrcdatum)); + prosrc = TextDatumGetCString(prosrcdatum); fbp = fmgr_lookupByName(prosrc); if (fbp == NULL) ereport(ERROR, @@ -315,15 +314,13 @@ fmgr_info_C_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple) Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc for function %u", functionId); - prosrcstring = DatumGetCString(DirectFunctionCall1(textout, - prosrcattr)); + prosrcstring = TextDatumGetCString(prosrcattr); probinattr = SysCacheGetAttr(PROCOID, procedureTuple, Anum_pg_proc_probin, &isnull); if (isnull) elog(ERROR, "null probin for function %u", functionId); - probinstring = DatumGetCString(DirectFunctionCall1(textout, - probinattr)); + probinstring = TextDatumGetCString(probinattr); /* Look up the function itself */ user_fn = load_external_function(probinstring, prosrcstring, true, diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c index 4bb230a3f36..42586f13aa1 100644 --- a/src/backend/utils/fmgr/funcapi.c +++ b/src/backend/utils/fmgr/funcapi.c @@ -7,7 +7,7 @@ * Copyright (c) 2002-2008, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/fmgr/funcapi.c,v 1.38 2008/02/29 02:49:39 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/utils/fmgr/funcapi.c,v 1.39 2008/03/25 22:42:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -741,8 +741,7 @@ get_func_arg_info(HeapTuple procTup, elog(ERROR, "proargnames must have the same number of elements as the function has arguments"); *p_argnames = (char **) palloc(sizeof(char *) * numargs); for (i = 0; i < numargs; i++) - (*p_argnames)[i] = DatumGetCString(DirectFunctionCall1(textout, - elems[i])); + (*p_argnames)[i] = TextDatumGetCString(elems[i]); } /* Get argument modes, if available */ @@ -855,8 +854,7 @@ get_func_result_name(Oid functionId) result = NULL; break; } - result = DatumGetCString(DirectFunctionCall1(textout, - argnames[i])); + result = TextDatumGetCString(argnames[i]); if (result == NULL || result[0] == '\0') { /* Parameter is not named, so forget it */ @@ -1002,7 +1000,7 @@ build_function_result_tupdesc_d(Datum proallargtypes, argmodes[i] == PROARGMODE_INOUT); outargtypes[numoutargs] = argtypes[i]; if (argnames) - pname = DatumGetCString(DirectFunctionCall1(textout, argnames[i])); + pname = TextDatumGetCString(argnames[i]); else pname = NULL; if (pname == NULL || pname[0] == '\0') diff --git a/src/backend/utils/init/flatfiles.c b/src/backend/utils/init/flatfiles.c index aa155a07bb3..cffbc51bbdc 100644 --- a/src/backend/utils/init/flatfiles.c +++ b/src/backend/utils/init/flatfiles.c @@ -23,7 +23,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.30 2008/01/01 19:45:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.31 2008/03/25 22:42:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -461,13 +461,14 @@ write_auth_file(Relation rel_authid, Relation rel_authmem) * it is, ignore it, since we can't handle that in startup mode. * * It is entirely likely that it's 1-byte format not 4-byte, and - * theoretically possible that it's compressed inline, but textout - * should be able to handle those cases even in startup mode. + * theoretically possible that it's compressed inline, but + * text_to_cstring should be able to handle those cases even in + * startup mode. */ if (VARATT_IS_EXTERNAL(DatumGetPointer(datum))) auth_info[curr_role].rolpassword = pstrdup(""); else - auth_info[curr_role].rolpassword = DatumGetCString(DirectFunctionCall1(textout, datum)); + auth_info[curr_role].rolpassword = TextDatumGetCString(datum); /* assume passwd has attlen -1 */ off = att_addlength_pointer(off, -1, tp + off); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 6839a165dd6..938b3acd837 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut <peter_e@gmx.net>. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.439 2008/03/17 17:45:09 mha Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.440 2008/03/25 22:42:45 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -5364,7 +5364,6 @@ set_config_by_name(PG_FUNCTION_ARGS) char *value; char *new_value; bool is_local; - text *result_text; if (PG_ARGISNULL(0)) ereport(ERROR, @@ -5372,13 +5371,13 @@ set_config_by_name(PG_FUNCTION_ARGS) errmsg("SET requires parameter name"))); /* Get the GUC variable name */ - name = DatumGetCString(DirectFunctionCall1(textout, PG_GETARG_DATUM(0))); + name = TextDatumGetCString(PG_GETARG_DATUM(0)); /* Get the desired value or set to NULL for a reset request */ if (PG_ARGISNULL(1)) value = NULL; else - value = DatumGetCString(DirectFunctionCall1(textout, PG_GETARG_DATUM(1))); + value = TextDatumGetCString(PG_GETARG_DATUM(1)); /* * Get the desired state of is_local. Default to false if provided value @@ -5401,10 +5400,7 @@ set_config_by_name(PG_FUNCTION_ARGS) new_value = GetConfigOptionByName(name, NULL); /* Convert return string to text */ - result_text = DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(new_value))); - - /* return it */ - PG_RETURN_TEXT_P(result_text); + PG_RETURN_TEXT_P(cstring_to_text(new_value)); } @@ -5992,19 +5988,15 @@ show_config_by_name(PG_FUNCTION_ARGS) { char *varname; char *varval; - text *result_text; /* Get the GUC variable name */ - varname = DatumGetCString(DirectFunctionCall1(textout, PG_GETARG_DATUM(0))); + varname = TextDatumGetCString(PG_GETARG_DATUM(0)); /* Get the value */ varval = GetConfigOptionByName(varname, NULL); /* Convert to text */ - result_text = DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(varval))); - - /* return it */ - PG_RETURN_TEXT_P(result_text); + PG_RETURN_TEXT_P(cstring_to_text(varval)); } /* @@ -6609,7 +6601,7 @@ ProcessGUCArray(ArrayType *array, if (isnull) continue; - s = DatumGetCString(DirectFunctionCall1(textout, d)); + s = TextDatumGetCString(d); ParseLongOption(s, &name, &value); if (!value) @@ -6657,7 +6649,7 @@ GUCArrayAdd(ArrayType *array, const char *name, const char *value) newval = palloc(strlen(name) + 1 + strlen(value) + 1); sprintf(newval, "%s=%s", name, value); - datum = DirectFunctionCall1(textin, CStringGetDatum(newval)); + datum = CStringGetTextDatum(newval); if (array) { @@ -6684,7 +6676,7 @@ GUCArrayAdd(ArrayType *array, const char *name, const char *value) &isnull); if (isnull) continue; - current = DatumGetCString(DirectFunctionCall1(textout, d)); + current = TextDatumGetCString(d); if (strncmp(current, newval, strlen(name) + 1) == 0) { index = i; @@ -6754,7 +6746,7 @@ GUCArrayDelete(ArrayType *array, const char *name) &isnull); if (isnull) continue; - val = DatumGetCString(DirectFunctionCall1(textout, d)); + val = TextDatumGetCString(d); /* ignore entry if it's what we want to delete */ if (strncmp(val, name, strlen(name)) == 0 diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 63bf48124a8..4940f7721f6 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -12,7 +12,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.107 2008/03/25 19:26:53 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.108 2008/03/25 22:42:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -923,12 +923,11 @@ pg_cursor(PG_FUNCTION_ARGS) MemSet(nulls, 0, sizeof(nulls)); - values[0] = DirectFunctionCall1(textin, CStringGetDatum(portal->name)); + values[0] = CStringGetTextDatum(portal->name); if (!portal->sourceText) nulls[1] = true; else - values[1] = DirectFunctionCall1(textin, - CStringGetDatum(portal->sourceText)); + values[1] = CStringGetTextDatum(portal->sourceText); values[2] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_HOLD); values[3] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_BINARY); values[4] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_SCROLL); diff --git a/src/include/tsearch/ts_utils.h b/src/include/tsearch/ts_utils.h index 7ce5b0cc3cb..bf0e33e58c0 100644 --- a/src/include/tsearch/ts_utils.h +++ b/src/include/tsearch/ts_utils.h @@ -5,7 +5,7 @@ * * Copyright (c) 1998-2008, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/include/tsearch/ts_utils.h,v 1.12 2008/01/01 19:45:59 momjian Exp $ + * $PostgreSQL: pgsql/src/include/tsearch/ts_utils.h,v 1.13 2008/03/25 22:42:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -107,12 +107,6 @@ extern bool TS_execute(QueryItem *curitem, void *checkval, bool calcnot, bool (*chkcond) (void *checkval, QueryOperand *val)); /* - * Useful conversion macros - */ -#define TextPGetCString(t) DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(t))) -#define CStringGetTextP(c) DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(c))) - -/* * to_ts* - text transformation to tsvector, tsquery */ extern TSVector make_tsvector(ParsedText *prs); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 5dbc00fce53..f719b492c14 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.309 2008/03/23 00:24:20 tgl Exp $ + * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.310 2008/03/25 22:42:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -617,6 +617,14 @@ extern Datum varchartypmodout(PG_FUNCTION_ARGS); extern Datum varchar(PG_FUNCTION_ARGS); /* varlena.c */ +extern text *cstring_to_text(const char *s); +extern text *cstring_to_text_with_len(const char *s, int len); +extern char *text_to_cstring(const text *t); +extern void text_to_cstring_buffer(const text *src, char *dst, size_t dst_len); + +#define CStringGetTextDatum(s) PointerGetDatum(cstring_to_text(s)) +#define TextDatumGetCString(d) text_to_cstring((text *) DatumGetPointer(d)) + extern Datum textin(PG_FUNCTION_ARGS); extern Datum textout(PG_FUNCTION_ARGS); extern Datum textrecv(PG_FUNCTION_ARGS); diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 3ce8f60c262..9922a4a0edb 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1,7 +1,7 @@ /********************************************************************** * plperl.c - perl as a procedural language for PostgreSQL * - * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.137 2008/03/25 19:26:53 neilc Exp $ + * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.138 2008/03/25 22:42:45 tgl Exp $ * **********************************************************************/ @@ -542,7 +542,7 @@ plperl_safe_init(void) desc.arg_is_rowtype[0] = false; fmgr_info(F_TEXTOUT, &(desc.arg_out_func[0])); - fcinfo.arg[0] = DirectFunctionCall1(textin, CStringGetDatum("a")); + fcinfo.arg[0] = CStringGetTextDatum("a"); fcinfo.argnull[0] = false; /* and make the call */ @@ -1668,8 +1668,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger) Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc"); - proc_source = DatumGetCString(DirectFunctionCall1(textout, - prosrcdatum)); + proc_source = TextDatumGetCString(prosrcdatum); /************************************************************ * Create the procedure in the interpreter diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c index d771b92660a..9f928f702bb 100644 --- a/src/pl/plpgsql/src/pl_comp.c +++ b/src/pl/plpgsql/src/pl_comp.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.121 2008/01/01 19:46:00 momjian Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.122 2008/03/25 22:42:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -292,7 +292,7 @@ do_compile(FunctionCallInfo fcinfo, Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc"); - proc_source = DatumGetCString(DirectFunctionCall1(textout, prosrcdatum)); + proc_source = TextDatumGetCString(prosrcdatum); plpgsql_scanner_init(proc_source, functype); plpgsql_error_funcname = pstrdup(NameStr(procStruct->proname)); diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 25702f2a878..635a992820f 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.203 2008/03/25 19:26:54 neilc Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.204 2008/03/25 22:42:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -532,11 +532,11 @@ plpgsql_exec_trigger(PLpgSQL_function *func, var = (PLpgSQL_var *) (estate.datums[func->tg_op_varno]); if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event)) - var->value = DirectFunctionCall1(textin, CStringGetDatum("INSERT")); + var->value = CStringGetTextDatum("INSERT"); else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) - var->value = DirectFunctionCall1(textin, CStringGetDatum("UPDATE")); + var->value = CStringGetTextDatum("UPDATE"); else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event)) - var->value = DirectFunctionCall1(textin, CStringGetDatum("DELETE")); + var->value = CStringGetTextDatum("DELETE"); else elog(ERROR, "unrecognized trigger action: not INSERT, DELETE, or UPDATE"); var->isnull = false; @@ -550,9 +550,9 @@ plpgsql_exec_trigger(PLpgSQL_function *func, var = (PLpgSQL_var *) (estate.datums[func->tg_when_varno]); if (TRIGGER_FIRED_BEFORE(trigdata->tg_event)) - var->value = DirectFunctionCall1(textin, CStringGetDatum("BEFORE")); + var->value = CStringGetTextDatum("BEFORE"); else if (TRIGGER_FIRED_AFTER(trigdata->tg_event)) - var->value = DirectFunctionCall1(textin, CStringGetDatum("AFTER")); + var->value = CStringGetTextDatum("AFTER"); else elog(ERROR, "unrecognized trigger execution time: not BEFORE or AFTER"); var->isnull = false; @@ -560,9 +560,9 @@ plpgsql_exec_trigger(PLpgSQL_function *func, var = (PLpgSQL_var *) (estate.datums[func->tg_level_varno]); if (TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) - var->value = DirectFunctionCall1(textin, CStringGetDatum("ROW")); + var->value = CStringGetTextDatum("ROW"); else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event)) - var->value = DirectFunctionCall1(textin, CStringGetDatum("STATEMENT")); + var->value = CStringGetTextDatum("STATEMENT"); else elog(ERROR, "unrecognized trigger event type: not ROW or STATEMENT"); var->isnull = false; @@ -611,8 +611,7 @@ plpgsql_exec_trigger(PLpgSQL_function *func, { estate.trig_argv = palloc(sizeof(Datum) * estate.trig_nargs); for (i = 0; i < trigdata->tg_trigger->tgnargs; i++) - estate.trig_argv[i] = DirectFunctionCall1(textin, - CStringGetDatum(trigdata->tg_trigger->tgargs[i])); + estate.trig_argv[i] = CStringGetTextDatum(trigdata->tg_trigger->tgargs[i]); } estate.err_text = gettext_noop("during function entry"); @@ -1070,15 +1069,13 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block) state_var = (PLpgSQL_var *) estate->datums[block->exceptions->sqlstate_varno]; - state_var->value = DirectFunctionCall1(textin, - CStringGetDatum(unpack_sql_state(edata->sqlerrcode))); + state_var->value = CStringGetTextDatum(unpack_sql_state(edata->sqlerrcode)); state_var->freeval = true; state_var->isnull = false; errm_var = (PLpgSQL_var *) estate->datums[block->exceptions->sqlerrm_varno]; - errm_var->value = DirectFunctionCall1(textin, - CStringGetDatum(edata->message)); + errm_var->value = CStringGetTextDatum(edata->message); errm_var->freeval = true; errm_var->isnull = false; @@ -3017,7 +3014,7 @@ exec_stmt_open(PLpgSQL_execstate *estate, PLpgSQL_stmt_open *stmt) curvar = (PLpgSQL_var *) (estate->datums[stmt->curvar]); if (!curvar->isnull) { - curname = DatumGetCString(DirectFunctionCall1(textout, curvar->value)); + curname = TextDatumGetCString(curvar->value); if (SPI_cursor_find(curname) != NULL) ereport(ERROR, (errcode(ERRCODE_DUPLICATE_CURSOR), @@ -3090,7 +3087,7 @@ exec_stmt_open(PLpgSQL_execstate *estate, PLpgSQL_stmt_open *stmt) * ---------- */ free_var(curvar); - curvar->value = DirectFunctionCall1(textin, CStringGetDatum(portal->name)); + curvar->value = CStringGetTextDatum(portal->name); curvar->isnull = false; curvar->freeval = true; @@ -3188,7 +3185,7 @@ exec_stmt_open(PLpgSQL_execstate *estate, PLpgSQL_stmt_open *stmt) * ---------- */ free_var(curvar); - curvar->value = DirectFunctionCall1(textin, CStringGetDatum(portal->name)); + curvar->value = CStringGetTextDatum(portal->name); curvar->isnull = false; curvar->freeval = true; @@ -3222,7 +3219,7 @@ exec_stmt_fetch(PLpgSQL_execstate *estate, PLpgSQL_stmt_fetch *stmt) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("cursor variable \"%s\" is NULL", curvar->refname))); - curname = DatumGetCString(DirectFunctionCall1(textout, curvar->value)); + curname = TextDatumGetCString(curvar->value); portal = SPI_cursor_find(curname); if (portal == NULL) @@ -3318,7 +3315,7 @@ exec_stmt_close(PLpgSQL_execstate *estate, PLpgSQL_stmt_close *stmt) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("cursor variable \"%s\" is NULL", curvar->refname))); - curname = DatumGetCString(DirectFunctionCall1(textout, curvar->value)); + curname = TextDatumGetCString(curvar->value); portal = SPI_cursor_find(curname); if (portal == NULL) diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c index afbb3abeda8..20177d62e1b 100644 --- a/src/pl/plpython/plpython.c +++ b/src/pl/plpython/plpython.c @@ -1,7 +1,7 @@ /********************************************************************** * plpython.c - python as a procedural language for PostgreSQL * - * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.106 2008/01/02 03:10:27 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.107 2008/03/25 22:42:45 tgl Exp $ * ********************************************************************* */ @@ -1298,7 +1298,7 @@ PLy_procedure_create(HeapTuple procTup, Oid tgreloid, char *key) /* Fetch argument name */ if (proc->argnames) - proc->argnames[i] = PLy_strdup(DatumGetCString(DirectFunctionCall1(textout, elems[i]))); + proc->argnames[i] = PLy_strdup(TextDatumGetCString(elems[i])); } /* @@ -1308,8 +1308,7 @@ PLy_procedure_create(HeapTuple procTup, Oid tgreloid, char *key) Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc"); - procSource = DatumGetCString(DirectFunctionCall1(textout, - prosrcdatum)); + procSource = TextDatumGetCString(prosrcdatum); PLy_procedure_compile(proc, procSource); diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index 4b72b860bbc..508ec301bf8 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -2,7 +2,7 @@ * pltcl.c - PostgreSQL support for Tcl as * procedural language (PL) * - * $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.117 2007/11/15 21:14:46 momjian Exp $ + * $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.118 2008/03/25 22:42:46 tgl Exp $ * **********************************************************************/ @@ -1298,8 +1298,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid) Anum_pg_proc_prosrc, &isnull); if (isnull) elog(ERROR, "null prosrc"); - proc_source = DatumGetCString(DirectFunctionCall1(textout, - prosrcdatum)); + proc_source = TextDatumGetCString(prosrcdatum); UTF_BEGIN; Tcl_DStringAppend(&proc_internal_body, UTF_E2U(proc_source), -1); UTF_END; diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index 8f96382dfd6..c5ea947f84e 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -1,5 +1,5 @@ /* - * $PostgreSQL: pgsql/src/test/regress/regress.c,v 1.70 2007/03/15 23:12:07 tgl Exp $ + * $PostgreSQL: pgsql/src/test/regress/regress.c,v 1.71 2008/03/25 22:42:46 tgl Exp $ */ #include "postgres.h" @@ -556,16 +556,9 @@ ttdummy(PG_FUNCTION_ARGS) return PointerGetDatum(NULL); } - { - text *seqname = DatumGetTextP(DirectFunctionCall1(textin, - CStringGetDatum("ttdummy_seq"))); - - newoff = DirectFunctionCall1(nextval, - PointerGetDatum(seqname)); - /* nextval now returns int64; coerce down to int32 */ - newoff = Int32GetDatum((int32) DatumGetInt64(newoff)); - pfree(seqname); - } + newoff = DirectFunctionCall1(nextval, CStringGetTextDatum("ttdummy_seq")); + /* nextval now returns int64; coerce down to int32 */ + newoff = Int32GetDatum((int32) DatumGetInt64(newoff)); /* Connect to SPI manager */ if ((ret = SPI_connect()) < 0) |