aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-05-30 01:20:50 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-05-30 01:20:50 +0000
commitcfd9be939e9c516243c5b6a49ad1e1a9a38f1052 (patch)
tree1f84d32f5d20ada75f911ee700361037ed461140 /src
parentc8f81df41b1269714c08a508ccecc0adc8ef96bd (diff)
downloadpostgresql-cfd9be939e9c516243c5b6a49ad1e1a9a38f1052.tar.gz
postgresql-cfd9be939e9c516243c5b6a49ad1e1a9a38f1052.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/parse_coerce.c10
-rw-r--r--src/backend/parser/parse_node.c17
-rw-r--r--src/backend/utils/adt/varlena.c49
-rw-r--r--src/include/catalog/catversion.h4
-rw-r--r--src/include/catalog/pg_type.h4
5 files changed, 37 insertions, 47 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 094e99a8acf..e46b63f6d9f 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -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;
diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c
index 921da9a04a5..20999f81ffe 100644
--- a/src/backend/parser/parse_node.c
+++ b/src/backend/parser/parse_node.c
@@ -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);
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index c07f4f8f02c..5efda61bce4 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.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));
}
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 97817e92298..ffab04a85d4 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -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
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 1af651c068e..8a4207e9ea6 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -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