Change the UNKNOWN type to have an internal representation matching

cstring, rather than text, so as to eliminate useless conversions
inside the parser.  Per recent discussion.
REL8_1_STABLE
Tom Lane 21 years ago
parent c8f81df41b
commit cfd9be939e
  1. 10
      src/backend/parser/parse_coerce.c
  2. 17
      src/backend/parser/parse_node.c
  3. 49
      src/backend/utils/adt/varlena.c
  4. 4
      src/include/catalog/catversion.h
  5. 4
      src/include/catalog/pg_type.h

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.129 2005/05/29 18:24:13 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.130 2005/05/30 01:20:49 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -168,8 +168,11 @@ coerce_type(ParseState *pstate, Node *node,
if (!con->constisnull) if (!con->constisnull)
{ {
char *val = DatumGetCString(DirectFunctionCall1(unknownout, /*
con->constvalue)); * We assume here that UNKNOWN's internal representation is the
* same as CSTRING
*/
char *val = DatumGetCString(con->constvalue);
/* /*
* We pass typmod -1 to the input routine, primarily because * We pass typmod -1 to the input routine, primarily because
@ -183,7 +186,6 @@ coerce_type(ParseState *pstate, Node *node,
* ugly... * ugly...
*/ */
newcon->constvalue = stringTypeDatum(targetType, val, -1); newcon->constvalue = stringTypeDatum(targetType, val, -1);
pfree(val);
} }
result = (Node *) newcon; result = (Node *) newcon;

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/parse_node.c,v 1.88 2005/04/23 18:35:12 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/parse_node.c,v 1.89 2005/05/30 01:20:49 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -271,8 +271,8 @@ transformArraySubscripts(ParseState *pstate,
* have to guess what type is wanted. * have to guess what type is wanted.
* *
* For string literals we produce a constant of type UNKNOWN ---- whose * For string literals we produce a constant of type UNKNOWN ---- whose
* representation is the same as text, but it indicates to later type * representation is the same as cstring, but it indicates to later type
* resolution that we're not sure that it should be considered text. * resolution that we're not sure yet what type it should be considered.
* Explicit "NULL" constants are also typed as UNKNOWN. * Explicit "NULL" constants are also typed as UNKNOWN.
* *
* For integers and floats we produce int4, int8, or numeric depending * For integers and floats we produce int4, int8, or numeric depending
@ -341,11 +341,14 @@ make_const(Value *value)
break; break;
case T_String: case T_String:
val = DirectFunctionCall1(unknownin, /*
CStringGetDatum(strVal(value))); * We assume here that UNKNOWN's internal representation is the
* same as CSTRING
*/
val = CStringGetDatum(strVal(value));
typeid = UNKNOWNOID; /* will be coerced later */ typeid = UNKNOWNOID; /* will be coerced later */
typelen = -1; /* variable len */ typelen = -2; /* cstring-style varwidth type */
typebyval = false; typebyval = false;
break; break;
@ -362,7 +365,7 @@ make_const(Value *value)
case T_Null: case T_Null:
/* return a null const */ /* return a null const */
con = makeConst(UNKNOWNOID, con = makeConst(UNKNOWNOID,
-1, -2,
(Datum) 0, (Datum) 0,
true, true,
false); false);

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.122 2005/05/27 00:57:49 neilc Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.123 2005/05/30 01:20:50 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -330,18 +330,10 @@ textsend(PG_FUNCTION_ARGS)
Datum Datum
unknownin(PG_FUNCTION_ARGS) unknownin(PG_FUNCTION_ARGS)
{ {
char *inputStr = PG_GETARG_CSTRING(0); char *str = PG_GETARG_CSTRING(0);
unknown *result;
int len;
len = strlen(inputStr) + VARHDRSZ;
result = (unknown *) palloc(len);
VARATT_SIZEP(result) = len;
memcpy(VARDATA(result), inputStr, len - VARHDRSZ);
PG_RETURN_UNKNOWN_P(result); /* representation is same as cstring */
PG_RETURN_CSTRING(pstrdup(str));
} }
/* /*
@ -350,16 +342,10 @@ unknownin(PG_FUNCTION_ARGS)
Datum Datum
unknownout(PG_FUNCTION_ARGS) unknownout(PG_FUNCTION_ARGS)
{ {
unknown *t = PG_GETARG_UNKNOWN_P(0); /* representation is same as cstring */
int len; char *str = PG_GETARG_CSTRING(0);
char *result;
len = VARSIZE(t) - VARHDRSZ;
result = (char *) palloc(len + 1);
memcpy(result, VARDATA(t), len);
result[len] = '\0';
PG_RETURN_CSTRING(result); PG_RETURN_CSTRING(pstrdup(str));
} }
/* /*
@ -369,28 +355,27 @@ Datum
unknownrecv(PG_FUNCTION_ARGS) unknownrecv(PG_FUNCTION_ARGS)
{ {
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
unknown *result; char *str;
int nbytes; int nbytes;
nbytes = buf->len - buf->cursor; str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
result = (unknown *) palloc(nbytes + VARHDRSZ); /* representation is same as cstring */
VARATT_SIZEP(result) = nbytes + VARHDRSZ; PG_RETURN_CSTRING(str);
pq_copymsgbytes(buf, VARDATA(result), nbytes);
PG_RETURN_UNKNOWN_P(result);
} }
/* /*
* unknownsend - converts unknown to binary format * unknownsend - converts unknown to binary format
*
* This is a special case: just copy the input, since it's
* effectively the same format as bytea
*/ */
Datum Datum
unknownsend(PG_FUNCTION_ARGS) unknownsend(PG_FUNCTION_ARGS)
{ {
unknown *vlena = PG_GETARG_UNKNOWN_P_COPY(0); /* representation is same as cstring */
char *str = PG_GETARG_CSTRING(0);
StringInfoData buf;
PG_RETURN_UNKNOWN_P(vlena); pq_begintypsend(&buf);
pq_sendtext(&buf, str, strlen(str));
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
} }

@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.269 2005/05/20 01:29:55 neilc Exp $ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.270 2005/05/30 01:20:50 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 200505201 #define CATALOG_VERSION_NO 200505291
#endif #endif

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.160 2005/04/14 01:38:21 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.161 2005/05/30 01:20:50 tgl Exp $
* *
* NOTES * NOTES
* the genbki.sh script reads this file and generates .bki * the genbki.sh script reads this file and generates .bki
@ -370,7 +370,7 @@ DESCR("relative, limited-range time interval (Unix delta time)");
DATA(insert OID = 704 ( tinterval PGNSP PGUID 12 f b t \054 0 0 tintervalin tintervalout tintervalrecv tintervalsend - i p f 0 -1 0 _null_ _null_ )); DATA(insert OID = 704 ( tinterval PGNSP PGUID 12 f b t \054 0 0 tintervalin tintervalout tintervalrecv tintervalsend - i p f 0 -1 0 _null_ _null_ ));
DESCR("(abstime,abstime), time interval"); DESCR("(abstime,abstime), time interval");
#define TINTERVALOID 704 #define TINTERVALOID 704
DATA(insert OID = 705 ( unknown PGNSP PGUID -1 f b t \054 0 0 unknownin unknownout unknownrecv unknownsend - i p f 0 -1 0 _null_ _null_ )); DATA(insert OID = 705 ( unknown PGNSP PGUID -2 f b t \054 0 0 unknownin unknownout unknownrecv unknownsend - c p f 0 -1 0 _null_ _null_ ));
DESCR(""); DESCR("");
#define UNKNOWNOID 705 #define UNKNOWNOID 705

Loading…
Cancel
Save