Change the UNKNOWN type to have an internal representation matching
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 30 May 2005 01:20:50 +0000 (01:20 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 30 May 2005 01:20:50 +0000 (01:20 +0000)
cstring, rather than text, so as to eliminate useless conversions
inside the parser.  Per recent discussion.

src/backend/parser/parse_coerce.c
src/backend/parser/parse_node.c
src/backend/utils/adt/varlena.c
src/include/catalog/catversion.h
src/include/catalog/pg_type.h

index 094e99a8acf5762632f99a3b479de758b6fcba1f..e46b63f6d9f0b3228e1bc5b67f7c60c63422181d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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)
        {
-           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
@@ -183,7 +186,6 @@ coerce_type(ParseState *pstate, Node *node,
             * ugly...
             */
            newcon->constvalue = stringTypeDatum(targetType, val, -1);
-           pfree(val);
        }
 
        result = (Node *) newcon;
index 921da9a04a53fdc704df74bdbbf4e64c565467e9..20999f81ffe4645c29af7dd01e39c5aff469e2ad 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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.
  *
  * For string literals we produce a constant of type UNKNOWN ---- whose
- * representation is the same as text, but it indicates to later type
- * resolution that we're not sure that it should be considered text.
+ * representation is the same as cstring, but it indicates to later type
+ * resolution that we're not sure yet what type it should be considered.
  * Explicit "NULL" constants are also typed as UNKNOWN.
  *
  * For integers and floats we produce int4, int8, or numeric depending
@@ -341,11 +341,14 @@ make_const(Value *value)
            break;
 
        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 */
-           typelen = -1;       /* variable len */
+           typelen = -2;           /* cstring-style varwidth type */
            typebyval = false;
            break;
 
@@ -362,7 +365,7 @@ make_const(Value *value)
        case T_Null:
            /* return a null const */
            con = makeConst(UNKNOWNOID,
-                           -1,
+                           -2,
                            (Datum) 0,
                            true,
                            false);
index c07f4f8f02cbe92e30fa52c9dae1d61787226cde..5efda61bce47f6fe29cf3f81f223ac411862c0fd 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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
 unknownin(PG_FUNCTION_ARGS)
 {
-   char       *inputStr = 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);
+   char       *str = PG_GETARG_CSTRING(0);
 
-   PG_RETURN_UNKNOWN_P(result);
+   /* representation is same as cstring */
+   PG_RETURN_CSTRING(pstrdup(str));
 }
 
 /*
@@ -350,16 +342,10 @@ unknownin(PG_FUNCTION_ARGS)
 Datum
 unknownout(PG_FUNCTION_ARGS)
 {
-   unknown    *t = PG_GETARG_UNKNOWN_P(0);
-   int         len;
-   char       *result;
-
-   len = VARSIZE(t) - VARHDRSZ;
-   result = (char *) palloc(len + 1);
-   memcpy(result, VARDATA(t), len);
-   result[len] = '\0';
+   /* representation is same as cstring */
+   char       *str = PG_GETARG_CSTRING(0);
 
-   PG_RETURN_CSTRING(result);
+   PG_RETURN_CSTRING(pstrdup(str));
 }
 
 /*
@@ -369,28 +355,27 @@ Datum
 unknownrecv(PG_FUNCTION_ARGS)
 {
    StringInfo  buf = (StringInfo) PG_GETARG_POINTER(0);
-   unknown    *result;
+   char       *str;
    int         nbytes;
 
-   nbytes = buf->len - buf->cursor;
-   result = (unknown *) palloc(nbytes + VARHDRSZ);
-   VARATT_SIZEP(result) = nbytes + VARHDRSZ;
-   pq_copymsgbytes(buf, VARDATA(result), nbytes);
-   PG_RETURN_UNKNOWN_P(result);
+   str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+   /* representation is same as cstring */
+   PG_RETURN_CSTRING(str);
 }
 
 /*
  *     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
 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));
 }
 
 
index 97817e9229820fd612a1fc7e8e270e8dac63f100..ffab04a85d434876bcbc0498f57fe1c8bf22e949 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * 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 */
-#define CATALOG_VERSION_NO 200505201
+#define CATALOG_VERSION_NO 200505291
 
 #endif
index 1af651c068e19f4fa4c764853d8973bdc66d70ad..8a4207e9ea6bce9cf7db2b1d45dac15559981a49 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * 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
  *   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_ ));
 DESCR("(abstime,abstime), time interval");
 #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("");
 #define UNKNOWNOID     705