aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-08-26 23:36:32 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-08-26 23:36:32 +0000
commit0effa088f5a5b55ab5b963159d18cc26dc7ccc4e (patch)
tree113a7394ee457d6f0770589aed80029cf8b7aacf
parent08fc73c4c3ca3731d5ef77859fe5146df0ca5044 (diff)
downloadpostgresql-0effa088f5a5b55ab5b963159d18cc26dc7ccc4e.tar.gz
postgresql-0effa088f5a5b55ab5b963159d18cc26dc7ccc4e.zip
Clean up usage of some deprecated APIs, particularly schema-unsafe
usage of RelationNameGetTupleDesc().
-rw-r--r--contrib/hstore/hstore.sql.in64
-rw-r--r--contrib/hstore/hstore_op.c8
-rw-r--r--contrib/hstore/uninstall_hstore.sql1
3 files changed, 39 insertions, 34 deletions
diff --git a/contrib/hstore/hstore.sql.in b/contrib/hstore/hstore.sql.in
index 3e0821a9525..e5fb21ebfa5 100644
--- a/contrib/hstore/hstore.sql.in
+++ b/contrib/hstore/hstore.sql.in
@@ -2,15 +2,17 @@ SET search_path = public;
BEGIN;
+CREATE TYPE hstore;
+
CREATE FUNCTION hstore_in(cstring)
RETURNS hstore
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict);
+LANGUAGE C STRICT;
CREATE FUNCTION hstore_out(hstore)
RETURNS cstring
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict);
+LANGUAGE C STRICT;
CREATE TYPE hstore (
INTERNALLENGTH = -1,
@@ -22,7 +24,7 @@ CREATE TYPE hstore (
CREATE FUNCTION fetchval(hstore,text)
RETURNS text
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE OPERATOR -> (
LEFTARG = hstore,
@@ -33,12 +35,12 @@ CREATE OPERATOR -> (
CREATE FUNCTION isexists(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','exists'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION exist(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','exists'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE OPERATOR ? (
LEFTARG = hstore,
@@ -51,22 +53,22 @@ CREATE OPERATOR ? (
CREATE FUNCTION isdefined(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','defined'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION defined(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','defined'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION delete(hstore,text)
RETURNS hstore
AS 'MODULE_PATHNAME','delete'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION hs_concat(hstore,hstore)
RETURNS hstore
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE OPERATOR || (
LEFTARG = hstore,
@@ -77,12 +79,12 @@ CREATE OPERATOR || (
CREATE FUNCTION hs_contains(hstore,hstore)
RETURNS bool
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION hs_contained(hstore,hstore)
RETURNS bool
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE OPERATOR @> (
LEFTARG = hstore,
@@ -124,7 +126,7 @@ CREATE OPERATOR ~ (
CREATE FUNCTION tconvert(text,text)
RETURNS hstore
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (iscachable);
+LANGUAGE C IMMUTABLE;
CREATE OPERATOR => (
LEFTARG = text,
@@ -135,43 +137,45 @@ CREATE OPERATOR => (
CREATE FUNCTION akeys(hstore)
RETURNS _text
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION avals(hstore)
RETURNS _text
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION skeys(hstore)
RETURNS setof text
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION svals(hstore)
RETURNS setof text
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
-
-create type hs_each as (key text, value text);
+LANGUAGE C STRICT IMMUTABLE;
-CREATE FUNCTION each(hstore)
-RETURNS setof hs_each
+CREATE FUNCTION each(IN hs hstore,
+ OUT key text,
+ OUT value text)
+RETURNS SETOF record
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict,iscachable);
+LANGUAGE C STRICT IMMUTABLE;
-- define the GiST support methods
+CREATE TYPE ghstore;
+
CREATE FUNCTION ghstore_in(cstring)
RETURNS ghstore
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict);
+LANGUAGE C STRICT;
CREATE FUNCTION ghstore_out(ghstore)
RETURNS cstring
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' with (isstrict);
+LANGUAGE C STRICT;
CREATE TYPE ghstore (
INTERNALLENGTH = -1,
@@ -182,37 +186,37 @@ CREATE TYPE ghstore (
CREATE FUNCTION ghstore_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
-LANGUAGE 'C';
+LANGUAGE C;
CREATE FUNCTION ghstore_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
-LANGUAGE 'C';
+LANGUAGE C;
CREATE FUNCTION ghstore_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
-LANGUAGE 'C' WITH (isstrict);
+LANGUAGE C STRICT;
CREATE FUNCTION ghstore_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
-LANGUAGE 'C';
+LANGUAGE C;
CREATE FUNCTION ghstore_union(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
-LANGUAGE 'C';
+LANGUAGE C;
CREATE FUNCTION ghstore_same(internal, internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
-LANGUAGE 'C';
+LANGUAGE C;
CREATE FUNCTION ghstore_consistent(internal,internal,int4)
RETURNS bool
AS 'MODULE_PATHNAME'
-LANGUAGE 'C';
+LANGUAGE C;
-- register the opclass for indexing (not as default)
CREATE OPERATOR CLASS gist_hstore_ops
diff --git a/contrib/hstore/hstore_op.c b/contrib/hstore/hstore_op.c
index 326948afc14..74597c34900 100644
--- a/contrib/hstore/hstore_op.c
+++ b/contrib/hstore/hstore_op.c
@@ -595,8 +595,10 @@ each(PG_FUNCTION_ARGS)
memcpy(st->hs, hs, VARSIZE(hs));
funcctx->user_fctx = (void *) st;
- tupdesc = RelationNameGetTupleDesc("hs_each");
- funcctx->slot = TupleDescGetSlot(tupdesc);
+ /* Build a tuple descriptor for our result type */
+ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
+ elog(ERROR, "return type must be a row type");
+
funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
MemoryContextSwitchTo(oldcontext);
@@ -637,7 +639,7 @@ each(PG_FUNCTION_ARGS)
st->i++;
tuple = heap_formtuple(funcctx->attinmeta->tupdesc, dvalues, nulls);
- res = TupleGetDatum(funcctx->slot, tuple);
+ res = HeapTupleGetDatum(tuple);
pfree(DatumGetPointer(dvalues[0]));
if (nulls[1] != 'n')
diff --git a/contrib/hstore/uninstall_hstore.sql b/contrib/hstore/uninstall_hstore.sql
index a24bc72f9f8..84be1b75ffa 100644
--- a/contrib/hstore/uninstall_hstore.sql
+++ b/contrib/hstore/uninstall_hstore.sql
@@ -40,7 +40,6 @@ DROP FUNCTION gin_extract_hstore(internal, internal);
DROP FUNCTION gin_extract_hstore_query(internal, internal, smallint);
DROP TYPE hstore CASCADE;
-DROP TYPE hs_each CASCADE;
DROP TYPE ghstore CASCADE;
COMMIT;