Modify fmgr so that internal name (compiler name) of a built-in
function is found in prosrc field of pg_proc, not proname. This allows multiple aliases of a built-in to all be implemented as direct builtins, without needing a level of indirection through an SQL function. Replace existing SQL alias functions with builtin entries accordingly. Save a few K by not storing string names of builtin functions in fmgr's internal table (if you really want 'em, get 'em from pg_proc...). Update opr_sanity with a few more cross-checks.
This commit is contained in:
parent
fdf6be80f9
commit
c537d4295a
|
@ -8,7 +8,7 @@
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# IDENTIFICATION
|
# IDENTIFICATION
|
||||||
# $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.13 1999/01/25 00:44:53 tgl Exp $
|
# $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.14 1999/03/29 01:30:35 tgl Exp $
|
||||||
#
|
#
|
||||||
# NOTES
|
# NOTES
|
||||||
# Passes any -D options on to cpp prior to generating the list
|
# Passes any -D options on to cpp prior to generating the list
|
||||||
|
@ -83,7 +83,7 @@ cat > $HFILE <<FuNkYfMgRsTuFf
|
||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: Gen_fmgrtab.sh.in,v 1.13 1999/01/25 00:44:53 tgl Exp $
|
* $Id: Gen_fmgrtab.sh.in,v 1.14 1999/03/29 01:30:35 tgl Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* ******************************
|
* ******************************
|
||||||
|
@ -172,10 +172,19 @@ FmgrInfo *fmgr_pl_finfo;
|
||||||
#define SEL_CONSTANT 1 /* constant does not vary (not a parameter) */
|
#define SEL_CONSTANT 1 /* constant does not vary (not a parameter) */
|
||||||
#define SEL_RIGHT 2 /* constant appears to right of operator */
|
#define SEL_RIGHT 2 /* constant appears to right of operator */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Constant macros for the OIDs of entries in pg_proc.
|
||||||
|
* NOTE: if the same "proname" is used for more than one
|
||||||
|
* internal-function entry in pg_proc, the equivalent macro
|
||||||
|
* will be defined with the lowest OID among those entries.
|
||||||
|
*/
|
||||||
FuNkYfMgRsTuFf
|
FuNkYfMgRsTuFf
|
||||||
awk '{ print $2, $1; }' $RAWFILE | \
|
|
||||||
@TR@ @TRARGS@ | \
|
@TR@ @TRARGS@ < $RAWFILE | \
|
||||||
sed -e 's/^/#define F_/' >> $HFILE
|
awk '
|
||||||
|
BEGIN { OFS = ""; }
|
||||||
|
{ if (seenit[$2]++ == 0) print "#define F_", $2, " ", $1; }' >> $HFILE
|
||||||
|
|
||||||
cat >> $HFILE <<FuNkYfMgRsTuFf
|
cat >> $HFILE <<FuNkYfMgRsTuFf
|
||||||
|
|
||||||
#endif /* FMGR_H */
|
#endif /* FMGR_H */
|
||||||
|
@ -197,7 +206,7 @@ cat > $TABCFILE <<FuNkYfMgRtAbStUfF
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.13 1999/01/25 00:44:53 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.14 1999/03/29 01:30:35 tgl Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
*
|
*
|
||||||
|
@ -235,12 +244,16 @@ cat > $TABCFILE <<FuNkYfMgRtAbStUfF
|
||||||
#include "utils/fmgrtab.h"
|
#include "utils/fmgrtab.h"
|
||||||
|
|
||||||
FuNkYfMgRtAbStUfF
|
FuNkYfMgRtAbStUfF
|
||||||
awk '{ print "extern char *" $2 "();"; }' $RAWFILE >> $TABCFILE
|
|
||||||
|
awk '{ print "extern char *", $(NF-1), "();"; }' $RAWFILE >> $TABCFILE
|
||||||
|
|
||||||
cat >> $TABCFILE <<FuNkYfMgRtAbStUfF
|
cat >> $TABCFILE <<FuNkYfMgRtAbStUfF
|
||||||
|
|
||||||
static FmgrCall fmgr_builtins[] = {
|
static FmgrCall fmgr_builtins[] = {
|
||||||
FuNkYfMgRtAbStUfF
|
FuNkYfMgRtAbStUfF
|
||||||
awk '{ printf (" {%d , %d , %s, \"%s\" },\n"), $1, $8, $2, $2 }' $RAWFILE >> $TABCFILE
|
|
||||||
|
awk '{ printf (" {%d, %d, %s },\n"), $1, $8, $(NF-1) }' $RAWFILE >> $TABCFILE
|
||||||
|
|
||||||
cat >> $TABCFILE <<FuNkYfMgRtAbStUfF
|
cat >> $TABCFILE <<FuNkYfMgRtAbStUfF
|
||||||
/* guardian value */
|
/* guardian value */
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
|
@ -276,16 +289,6 @@ FmgrCall *fmgr_isbuiltin(Oid id)
|
||||||
return (FmgrCall *) NULL;
|
return (FmgrCall *) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
func_ptr fmgr_lookupByName(char *name)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=0; i<FMGR_NBUILTINS; i++) {
|
|
||||||
if (strcmp(name,fmgr_builtins[i].funcName) == 0)
|
|
||||||
return(fmgr_builtins[i].func);
|
|
||||||
}
|
|
||||||
return((func_ptr) NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
FuNkYfMgRtAbStUfF
|
FuNkYfMgRtAbStUfF
|
||||||
|
|
||||||
rm -f $RAWFILE
|
rm -f $RAWFILE
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.22 1999/02/13 23:19:52 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.23 1999/03/29 01:30:36 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -169,14 +169,20 @@ fmgr_info(Oid procedureId, FmgrInfo *finfo)
|
||||||
finfo->fn_plhandler = NULL;
|
finfo->fn_plhandler = NULL;
|
||||||
finfo->fn_oid = procedureId;
|
finfo->fn_oid = procedureId;
|
||||||
|
|
||||||
if (!(fcp = fmgr_isbuiltin(procedureId)))
|
if ((fcp = fmgr_isbuiltin(procedureId)) != NULL)
|
||||||
|
{
|
||||||
|
/* Fast path for builtin functions: don't bother consulting pg_proc */
|
||||||
|
finfo->fn_addr = fcp->func;
|
||||||
|
finfo->fn_nargs = fcp->nargs;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
procedureTuple = SearchSysCacheTuple(PROOID,
|
procedureTuple = SearchSysCacheTuple(PROOID,
|
||||||
ObjectIdGetDatum(procedureId),
|
ObjectIdGetDatum(procedureId),
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
if (!HeapTupleIsValid(procedureTuple))
|
if (!HeapTupleIsValid(procedureTuple))
|
||||||
{
|
{
|
||||||
elog(ERROR, "fmgr_info: function %d: cache lookup failed\n",
|
elog(ERROR, "fmgr_info: function %d: cache lookup failed",
|
||||||
procedureId);
|
procedureId);
|
||||||
}
|
}
|
||||||
procedureStruct = (FormData_pg_proc *) GETSTRUCT(procedureTuple);
|
procedureStruct = (FormData_pg_proc *) GETSTRUCT(procedureTuple);
|
||||||
|
@ -190,11 +196,12 @@ fmgr_info(Oid procedureId, FmgrInfo *finfo)
|
||||||
switch (language)
|
switch (language)
|
||||||
{
|
{
|
||||||
case INTERNALlanguageId:
|
case INTERNALlanguageId:
|
||||||
finfo->fn_addr = fmgr_lookupByName(procedureStruct->proname.data);
|
/*
|
||||||
if (!finfo->fn_addr)
|
* Since we already tried to look up the OID as a builtin
|
||||||
elog(ERROR, "fmgr_info: function %s: not in internal table",
|
* function, we should never get here...
|
||||||
procedureStruct->proname.data);
|
*/
|
||||||
finfo->fn_nargs = procedureStruct->pronargs;
|
elog(ERROR, "fmgr_info: function %d: not in internal table",
|
||||||
|
procedureId);
|
||||||
break;
|
break;
|
||||||
case ClanguageId:
|
case ClanguageId:
|
||||||
finfo->fn_addr = fmgr_dynamic(procedureId, &(finfo->fn_nargs));
|
finfo->fn_addr = fmgr_dynamic(procedureId, &(finfo->fn_nargs));
|
||||||
|
@ -239,11 +246,6 @@ fmgr_info(Oid procedureId, FmgrInfo *finfo)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
finfo->fn_addr = fcp->func;
|
|
||||||
finfo->fn_nargs = fcp->nargs;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,7 +6,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: fmgrtab.h,v 1.9 1999/02/13 23:22:21 momjian Exp $
|
* $Id: fmgrtab.h,v 1.10 1999/03/29 01:30:41 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -17,13 +17,13 @@
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Oid proid;
|
Oid proid;
|
||||||
uint16 nargs;
|
int nargs;
|
||||||
func_ptr func;
|
func_ptr func;
|
||||||
char *funcName;
|
int dummy; /* pad struct to 4 words for fast indexing */
|
||||||
} FmgrCall;
|
} FmgrCall;
|
||||||
|
|
||||||
extern FmgrCall *fmgr_isbuiltin(Oid id);
|
extern FmgrCall *fmgr_isbuiltin(Oid id);
|
||||||
extern func_ptr fmgr_lookupByName(char *name);
|
|
||||||
extern void load_file(char *filename);
|
extern void load_file(char *filename);
|
||||||
|
|
||||||
#endif /* FMGRTAB_H */
|
#endif /* FMGRTAB_H */
|
||||||
|
|
|
@ -6,6 +6,114 @@ oid|proname
|
||||||
---+-------
|
---+-------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT p1.oid, p1.proname, p2.oid, p2.proname
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.proname = p2.proname AND
|
||||||
|
p1.pronargs = p2.pronargs AND
|
||||||
|
p1.proargtypes = p2.proargtypes;
|
||||||
|
oid|proname|oid|proname
|
||||||
|
---+-------+---+-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT p1.oid, p1.proname, p2.oid, p2.proname
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proisinh != p2.proisinh OR
|
||||||
|
p1.proistrusted != p2.proistrusted OR
|
||||||
|
p1.proiscachable != p2.proiscachable OR
|
||||||
|
p1.pronargs != p2.pronargs OR
|
||||||
|
p1.proretset != p2.proretset);
|
||||||
|
oid|proname|oid|proname
|
||||||
|
---+-------+---+-------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.prorettype, p2.prorettype
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.prorettype < p2.prorettype);
|
||||||
|
prorettype|prorettype
|
||||||
|
----------+----------
|
||||||
|
18| 25
|
||||||
|
25| 1043
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.proargtypes[0], p2.proargtypes[0]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[0] < p2.proargtypes[0]);
|
||||||
|
proargtypes|proargtypes
|
||||||
|
-----------+-----------
|
||||||
|
25| 1043
|
||||||
|
1042| 1043
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.proargtypes[1], p2.proargtypes[1]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[1] < p2.proargtypes[1]);
|
||||||
|
proargtypes|proargtypes
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.proargtypes[2], p2.proargtypes[2]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[2] < p2.proargtypes[2]);
|
||||||
|
proargtypes|proargtypes
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.proargtypes[3], p2.proargtypes[3]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[3] < p2.proargtypes[3]);
|
||||||
|
proargtypes|proargtypes
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.proargtypes[4], p2.proargtypes[4]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[4] < p2.proargtypes[4]);
|
||||||
|
proargtypes|proargtypes
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.proargtypes[5], p2.proargtypes[5]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[5] < p2.proargtypes[5]);
|
||||||
|
proargtypes|proargtypes
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.proargtypes[6], p2.proargtypes[6]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[6] < p2.proargtypes[6]);
|
||||||
|
proargtypes|proargtypes
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
QUERY: SELECT DISTINCT p1.proargtypes[7], p2.proargtypes[7]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[7] < p2.proargtypes[7]);
|
||||||
|
proargtypes|proargtypes
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
QUERY: SELECT p1.oid, p1.oprname
|
QUERY: SELECT p1.oid, p1.oprname
|
||||||
FROM pg_operator as p1
|
FROM pg_operator as p1
|
||||||
WHERE (p1.oprkind != 'b' AND p1.oprkind != 'l' AND p1.oprkind != 'r') OR
|
WHERE (p1.oprkind != 'b' AND p1.oprkind != 'l' AND p1.oprkind != 'r') OR
|
||||||
|
|
|
@ -28,6 +28,92 @@ FROM pg_proc as p1
|
||||||
WHERE p1.prolang = 0 OR p1.prorettype = 0 OR
|
WHERE p1.prolang = 0 OR p1.prorettype = 0 OR
|
||||||
p1.pronargs < 0 OR p1.pronargs > 9;
|
p1.pronargs < 0 OR p1.pronargs > 9;
|
||||||
|
|
||||||
|
-- Look for conflicting proc definitions (same names and input datatypes).
|
||||||
|
|
||||||
|
SELECT p1.oid, p1.proname, p2.oid, p2.proname
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.proname = p2.proname AND
|
||||||
|
p1.pronargs = p2.pronargs AND
|
||||||
|
p1.proargtypes = p2.proargtypes;
|
||||||
|
|
||||||
|
-- Considering only built-in procs (prolang = 11), look for multiple uses
|
||||||
|
-- of the same internal function (ie, matching prosrc fields). It's OK to
|
||||||
|
-- have several entries with different pronames for the same internal function,
|
||||||
|
-- but conflicts in the number of arguments and other critical items should
|
||||||
|
-- be complained of.
|
||||||
|
|
||||||
|
SELECT p1.oid, p1.proname, p2.oid, p2.proname
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proisinh != p2.proisinh OR
|
||||||
|
p1.proistrusted != p2.proistrusted OR
|
||||||
|
p1.proiscachable != p2.proiscachable OR
|
||||||
|
p1.pronargs != p2.pronargs OR
|
||||||
|
p1.proretset != p2.proretset);
|
||||||
|
|
||||||
|
-- Look for uses of different type OIDs in the argument/result type fields
|
||||||
|
-- for different aliases of the same built-in function.
|
||||||
|
-- This indicates that the types are being presumed to be binary-equivalent.
|
||||||
|
-- That's not wrong, necessarily, but we make lists of all the types being
|
||||||
|
-- so treated. Note that the expected output of this part of the test will
|
||||||
|
-- need to be modified whenever new pairs of types are made binary-equivalent!
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.prorettype, p2.prorettype
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.prorettype < p2.prorettype);
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.proargtypes[0], p2.proargtypes[0]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[0] < p2.proargtypes[0]);
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.proargtypes[1], p2.proargtypes[1]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[1] < p2.proargtypes[1]);
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.proargtypes[2], p2.proargtypes[2]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[2] < p2.proargtypes[2]);
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.proargtypes[3], p2.proargtypes[3]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[3] < p2.proargtypes[3]);
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.proargtypes[4], p2.proargtypes[4]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[4] < p2.proargtypes[4]);
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.proargtypes[5], p2.proargtypes[5]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[5] < p2.proargtypes[5]);
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.proargtypes[6], p2.proargtypes[6]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[6] < p2.proargtypes[6]);
|
||||||
|
|
||||||
|
SELECT DISTINCT p1.proargtypes[7], p2.proargtypes[7]
|
||||||
|
FROM pg_proc AS p1, pg_proc AS p2
|
||||||
|
WHERE p1.oid != p2.oid AND
|
||||||
|
p1.prosrc = p2.prosrc AND p1.prolang = 11 AND p2.prolang = 11 AND
|
||||||
|
(p1.proargtypes[7] < p2.proargtypes[7]);
|
||||||
|
|
||||||
-- **************** pg_operator ****************
|
-- **************** pg_operator ****************
|
||||||
|
|
||||||
-- Look for illegal values in pg_operator fields.
|
-- Look for illegal values in pg_operator fields.
|
||||||
|
|
Loading…
Reference in New Issue