Here's a patch to add unknownin/unknownout support. I also poked around
authorBruce Momjian <bruce@momjian.us>
Wed, 24 Apr 2002 02:12:53 +0000 (02:12 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 24 Apr 2002 02:12:53 +0000 (02:12 +0000)
looking for places that assume UNKNOWN == TEXT. One of those was the
"SET" type in pg_type.h, which was using textin/textout. This one I took
care of in this patch. The other suspicious place was in
string_to_dataum (which is defined in both selfuncs.c and indxpath.c). I
wasn't too sure about those, so I left them be.

Joe Conway

src/backend/utils/adt/varlena.c
src/include/c.h
src/include/catalog/catversion.h
src/include/catalog/pg_proc.h
src/include/catalog/pg_type.h
src/include/fmgr.h
src/include/utils/builtins.h

index b4e5d336f99514726df50a742dcac9717d293bc0..19761a5897a06704d06130b7c3132aea36795bc3 100644 (file)
@@ -228,6 +228,46 @@ textout(PG_FUNCTION_ARGS)
 }
 
 
+/*
+ *             unknownin                       - converts "..." to internal representation
+ */
+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);
+
+       PG_RETURN_UNKNOWN_P(result);
+}
+
+
+/*
+ *             unknownout                      - converts internal representation to "..."
+ */
+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';
+
+       PG_RETURN_CSTRING(result);
+}
+
+
 /* ========== PUBLIC ROUTINES ========== */
 
 /*
index faa5d8867023ccb370cf7d6686ee6c9823560db2..a384f701ce472bcafad43838a2ccabed85275872 100644 (file)
@@ -404,6 +404,7 @@ struct varlena
  */
 typedef struct varlena bytea;
 typedef struct varlena text;
+typedef struct varlena unknown;
 typedef struct varlena BpChar; /* blank-padded char, ie SQL char(n) */
 typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) */
 
index 42b850a438c040e5d0649e1f3decd5a171abdf87..e7793144f25f03ad61b32275394134f68d30b7ce 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     200204211
+#define CATALOG_VERSION_NO     200204231
 
 #endif
index 7343a1c7ded098e041257bf143c5e0792191ebb0..a80a2daeb0bccca1f25b753e56972f84f3863cb4 100644 (file)
@@ -237,6 +237,11 @@ DESCR("join selectivity of < and related operators on scalar datatypes");
 DATA(insert OID = 108 (  scalargtjoinsel   PGNSP PGUID 12 f t f t f s 3 701 "0 26 0" 100 0 0 100  scalargtjoinsel - _null_ ));
 DESCR("join selectivity of > and related operators on scalar datatypes");
 
+DATA(insert OID =  109 (  unknownin                       PGNSP PGUID 12 f t t i 1 f 705 "0" 100 0 0 100       unknownin - _null_ ));
+DESCR("(internal)");
+DATA(insert OID =  110 (  unknownout              PGNSP PGUID 12 f t t i 1 f 23  "0" 100 0 0 100       unknownout - _null_ ));
+DESCR("(internal)");
+
 DATA(insert OID = 112 (  text                     PGNSP PGUID 12 f t t t f i 1  25 "23" 100 0 0 100  int4_text - _null_ ));
 DESCR("convert int4 to text");
 DATA(insert OID = 113 (  text                     PGNSP PGUID 12 f t t t f i 1  25 "21" 100 0 0 100  int2_text - _null_ ));
index 94d7cc69d304fe7e846ca7815ba21c78b06be7b4..39c23ac9d198831ad2164c442942b9a30a3a7609 100644 (file)
@@ -302,7 +302,7 @@ DATA(insert OID = 30 (      oidvector  PGNSP PGUID INDEX_MAX_KEYS*4 -1 f b t \054 0
 DESCR("array of INDEX_MAX_KEYS oids, used in system tables");
 #define OIDVECTOROID   30
 
-DATA(insert OID = 32 ( SET                PGNSP PGUID -1  -1 f b t \054 0   0 textin textout textin textout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 32 ( SET                PGNSP PGUID -1  -1 f b t \054 0   0 unknownin unknownout unknownin unknownout i p f 0 -1 0 _null_ _null_ ));
 DESCR("set of tuples");
 
 DATA(insert OID = 71 ( pg_type          PGNSP PGUID 4 4 t c t \054 1247 0 int4in int4out int4in int4out i p f 0 -1 0 _null_ _null_ ));
@@ -366,7 +366,7 @@ DESCR("relative, limited-range time interval (Unix delta time)");
 DATA(insert OID = 704 (  tinterval PGNSP PGUID 12  47 f b t \054 0   0 tintervalin tintervalout tintervalin tintervalout i p f 0 -1 0 _null_ _null_ ));
 DESCR("(abstime,abstime), time interval");
 #define TINTERVALOID   704
-DATA(insert OID = 705 (  unknown   PGNSP PGUID -1  -1 f b t \054 0   0 textin textout textin textout i p f 0 -1 0 _null_ _null_ ));
+DATA(insert OID = 705 (  unknown   PGNSP PGUID -1  -1 f b t \054 0   0 unknownin unknownout unknownin unknownout i p f 0 -1 0 _null_ _null_ ));
 DESCR("");
 #define UNKNOWNOID             705
 
index 5a4f1ab124006738927a946dfb83ecb65e92e885..24ecd7ce04ba39db1c99a469e63dad559b992b2f 100644 (file)
@@ -185,6 +185,7 @@ extern struct varlena *pg_detoast_datum_slice(struct varlena * datum,
 /* DatumGetFoo macros for varlena types will typically look like this: */
 #define DatumGetByteaP(X)                      ((bytea *) PG_DETOAST_DATUM(X))
 #define DatumGetTextP(X)                       ((text *) PG_DETOAST_DATUM(X))
+#define DatumGetUnknownP(X)                    ((unknown *) PG_DETOAST_DATUM(X))
 #define DatumGetBpCharP(X)                     ((BpChar *) PG_DETOAST_DATUM(X))
 #define DatumGetVarCharP(X)                    ((VarChar *) PG_DETOAST_DATUM(X))
 /* And we also offer variants that return an OK-to-write copy */
@@ -200,6 +201,7 @@ extern struct varlena *pg_detoast_datum_slice(struct varlena * datum,
 /* GETARG macros for varlena types will typically look like this: */
 #define PG_GETARG_BYTEA_P(n)           DatumGetByteaP(PG_GETARG_DATUM(n))
 #define PG_GETARG_TEXT_P(n)                    DatumGetTextP(PG_GETARG_DATUM(n))
+#define PG_GETARG_UNKNOWN_P(n)         DatumGetUnknownP(PG_GETARG_DATUM(n))
 #define PG_GETARG_BPCHAR_P(n)          DatumGetBpCharP(PG_GETARG_DATUM(n))
 #define PG_GETARG_VARCHAR_P(n)         DatumGetVarCharP(PG_GETARG_DATUM(n))
 /* And we also offer variants that return an OK-to-write copy */
@@ -239,6 +241,7 @@ extern struct varlena *pg_detoast_datum_slice(struct varlena * datum,
 /* RETURN macros for other pass-by-ref types will typically look like this: */
 #define PG_RETURN_BYTEA_P(x)   PG_RETURN_POINTER(x)
 #define PG_RETURN_TEXT_P(x)    PG_RETURN_POINTER(x)
+#define PG_RETURN_UNKNOWN_P(x) PG_RETURN_POINTER(x)
 #define PG_RETURN_BPCHAR_P(x)  PG_RETURN_POINTER(x)
 #define PG_RETURN_VARCHAR_P(x) PG_RETURN_POINTER(x)
 
index 72ed7295d58202fafeb6ab3c1e556ef9a56b3e41..f303dcd364efa79cef9cddf1c884c75e8576e889 100644 (file)
@@ -414,6 +414,9 @@ extern List *textToQualifiedNameList(text *textval, const char *caller);
 extern bool SplitIdentifierString(char *rawstring, char separator,
                                                                  List **namelist);
 
+extern Datum unknownin(PG_FUNCTION_ARGS);
+extern Datum unknownout(PG_FUNCTION_ARGS);
+
 extern Datum byteain(PG_FUNCTION_ARGS);
 extern Datum byteaout(PG_FUNCTION_ARGS);
 extern Datum byteaoctetlen(PG_FUNCTION_ARGS);