SET search_path = public;
BEGIN;
-HASINIT create function dinit_CFG_MODNAME(text)
+HASINIT create function dinit_CFG_MODNAME(internal)
HASINIT returns internal
HASINIT as 'MODULE_PATHNAME'
HASINIT language 'C';
with (isstrict);
--built-in dictionaries
-CREATE FUNCTION dex_init(text)
+CREATE FUNCTION dex_init(internal)
returns internal
as 'MODULE_PATHNAME'
language 'C';
'Simple example of dictionary.'
;
-CREATE FUNCTION snb_en_init(text)
+CREATE FUNCTION snb_en_init(internal)
returns internal
as 'MODULE_PATHNAME'
language 'C';
'English Stemmer. Snowball.'
;
-CREATE FUNCTION snb_ru_init(text)
+CREATE FUNCTION snb_ru_init(internal)
returns internal
as 'MODULE_PATHNAME'
language 'C';
'Russian Stemmer. Snowball.'
;
-CREATE FUNCTION spell_init(text)
+CREATE FUNCTION spell_init(internal)
returns internal
as 'MODULE_PATHNAME'
language 'C';
'ISpell interface. Must have .dict and .aff files'
;
-CREATE FUNCTION syn_init(text)
+CREATE FUNCTION syn_init(internal)
returns internal
as 'MODULE_PATHNAME'
language 'C';
DROP FUNCTION lexize(text);
DROP FUNCTION set_curdict(int);
DROP FUNCTION set_curdict(text);
-DROP FUNCTION dex_init(text);
+DROP FUNCTION dex_init(internal);
DROP FUNCTION dex_lexize(internal,internal,int4);
-DROP FUNCTION snb_en_init(text);
+DROP FUNCTION snb_en_init(internal);
DROP FUNCTION snb_lexize(internal,internal,int4);
-DROP FUNCTION snb_ru_init(text);
-DROP FUNCTION spell_init(text);
+DROP FUNCTION snb_ru_init(internal);
+DROP FUNCTION spell_init(internal);
DROP FUNCTION spell_lexize(internal,internal,int4);
-DROP FUNCTION syn_init(text);
+DROP FUNCTION syn_init(internal);
DROP FUNCTION syn_lexize(internal,internal,int4);
DROP FUNCTION set_curprs(int);
DROP FUNCTION set_curprs(text);
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.109 2003/10/03 19:26:49 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.109.2.1 2005/05/03 16:51:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
const Oid *parameterTypes)
{
int i;
+ bool genericParam = false;
+ bool internalParam = false;
Relation rel;
HeapTuple tup;
HeapTuple oldtup;
/*
* Do not allow return type ANYARRAY or ANYELEMENT unless at least one
- * argument is also ANYARRAY or ANYELEMENT
+ * input argument is ANYARRAY or ANYELEMENT. Also, do not allow
+ * return type INTERNAL unless at least one input argument is INTERNAL.
*/
- if (returnType == ANYARRAYOID || returnType == ANYELEMENTOID)
+ for (i = 0; i < parameterCount; i++)
{
- bool genericParam = false;
-
- for (i = 0; i < parameterCount; i++)
+ switch (parameterTypes[i])
{
- if (parameterTypes[i] == ANYARRAYOID ||
- parameterTypes[i] == ANYELEMENTOID)
- {
+ case ANYARRAYOID:
+ case ANYELEMENTOID:
genericParam = true;
break;
- }
+ case INTERNALOID:
+ internalParam = true;
+ break;
}
-
- if (!genericParam)
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
- errmsg("cannot determine result data type"),
- errdetail("A function returning \"anyarray\" or \"anyelement\" must have at least one argument of either type.")));
}
+ if ((returnType == ANYARRAYOID || returnType == ANYELEMENTOID)
+ && !genericParam)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
+ errmsg("cannot determine result data type"),
+ errdetail("A function returning \"anyarray\" or \"anyelement\" must have at least one argument of either type.")));
+
+ if (returnType == INTERNALOID && !internalParam)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
+ errmsg("unsafe use of INTERNAL pseudo-type"),
+ errdetail("A function returning \"internal\" must have at least one \"internal\" argument.")));
+
/* Make sure we have a zero-padded param type array */
MemSet(typev, 0, FUNC_MAX_ARGS * sizeof(Oid));
if (parameterCount > 0)