mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
Create a distinction between Lists of integers and Lists of OIDs, to get
rid of the assumption that sizeof(Oid)==sizeof(int). This is one small step towards someday supporting 8-byte OIDs. For the moment, it doesn't do much except get rid of a lot of unsightly casts.
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.241 2003/02/09 00:30:39 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.242 2003/02/09 06:56:27 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -47,6 +47,10 @@
|
||||
#define COPY_INTLIST_FIELD(fldname) \
|
||||
(newnode->fldname = listCopy(from->fldname))
|
||||
|
||||
/* Copy a field that is a pointer to a list of Oids */
|
||||
#define COPY_OIDLIST_FIELD(fldname) \
|
||||
(newnode->fldname = listCopy(from->fldname))
|
||||
|
||||
/* Copy a field that is a pointer to a Bitmapset */
|
||||
#define COPY_BITMAPSET_FIELD(fldname) \
|
||||
(newnode->fldname = bms_copy(from->fldname))
|
||||
@@ -69,31 +73,38 @@
|
||||
* This copy function only copies the "cons-cells" of the list, not the
|
||||
* pointed-to objects. (Use copyObject if you want a "deep" copy.)
|
||||
*
|
||||
* We also use this function for copying lists of integers, which is
|
||||
* grotty but unlikely to break --- it could fail if sizeof(pointer)
|
||||
* is less than sizeof(int), but I don't know any such machines...
|
||||
* We also use this function for copying lists of integers and Oids,
|
||||
* which is notationally a bit ugly, but perfectly safe.
|
||||
*
|
||||
* Note that copyObject will surely coredump if applied to a list
|
||||
* of integers!
|
||||
* of integers or Oids!
|
||||
*/
|
||||
List *
|
||||
listCopy(List *list)
|
||||
{
|
||||
List *newlist,
|
||||
*l,
|
||||
*nl;
|
||||
*oldl,
|
||||
*newcell,
|
||||
*prev;
|
||||
|
||||
/* rather ugly coding for speed... */
|
||||
if (list == NIL)
|
||||
return NIL;
|
||||
|
||||
newlist = nl = makeList1(lfirst(list));
|
||||
newcell = makeNode(List);
|
||||
newcell->elem = list->elem;
|
||||
|
||||
foreach(l, lnext(list))
|
||||
newlist = prev = newcell;
|
||||
|
||||
foreach(oldl, lnext(list))
|
||||
{
|
||||
lnext(nl) = makeList1(lfirst(l));
|
||||
nl = lnext(nl);
|
||||
newcell = makeNode(List);
|
||||
newcell->elem = oldl->elem;
|
||||
prev->next = newcell;
|
||||
prev = newcell;
|
||||
}
|
||||
prev->next = NIL;
|
||||
|
||||
return newlist;
|
||||
}
|
||||
|
||||
@@ -248,7 +259,7 @@ _copyIndexScan(IndexScan *from)
|
||||
/*
|
||||
* copy remainder of node
|
||||
*/
|
||||
COPY_INTLIST_FIELD(indxid);
|
||||
COPY_OIDLIST_FIELD(indxid);
|
||||
COPY_NODE_FIELD(indxqual);
|
||||
COPY_NODE_FIELD(indxqualorig);
|
||||
COPY_SCALAR_FIELD(indxorderdir);
|
||||
@@ -816,7 +827,7 @@ _copySubLink(SubLink *from)
|
||||
COPY_SCALAR_FIELD(useOr);
|
||||
COPY_NODE_FIELD(lefthand);
|
||||
COPY_NODE_FIELD(operName);
|
||||
COPY_INTLIST_FIELD(operOids);
|
||||
COPY_OIDLIST_FIELD(operOids);
|
||||
COPY_NODE_FIELD(subselect);
|
||||
|
||||
return newnode;
|
||||
@@ -1523,7 +1534,7 @@ _copySetOperationStmt(SetOperationStmt *from)
|
||||
COPY_SCALAR_FIELD(all);
|
||||
COPY_NODE_FIELD(larg);
|
||||
COPY_NODE_FIELD(rarg);
|
||||
COPY_INTLIST_FIELD(colTypes);
|
||||
COPY_OIDLIST_FIELD(colTypes);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
@@ -2271,7 +2282,7 @@ _copyPrepareStmt(PrepareStmt *from)
|
||||
|
||||
COPY_STRING_FIELD(name);
|
||||
COPY_NODE_FIELD(argtypes);
|
||||
COPY_INTLIST_FIELD(argtype_oids);
|
||||
COPY_OIDLIST_FIELD(argtype_oids);
|
||||
COPY_NODE_FIELD(query);
|
||||
|
||||
return newnode;
|
||||
@@ -2527,19 +2538,26 @@ copyObject(void *from)
|
||||
case T_List:
|
||||
{
|
||||
List *list = from,
|
||||
*l,
|
||||
*nl;
|
||||
*oldl,
|
||||
*newcell,
|
||||
*prev;
|
||||
|
||||
/* rather ugly coding for speed... */
|
||||
/* Note the input list cannot be NIL if we got here. */
|
||||
nl = makeList1(copyObject(lfirst(list)));
|
||||
retval = nl;
|
||||
newcell = makeNode(List);
|
||||
lfirst(newcell) = copyObject(lfirst(list));
|
||||
|
||||
foreach(l, lnext(list))
|
||||
retval = (void *) newcell;
|
||||
prev = newcell;
|
||||
|
||||
foreach(oldl, lnext(list))
|
||||
{
|
||||
lnext(nl) = makeList1(copyObject(lfirst(l)));
|
||||
nl = lnext(nl);
|
||||
newcell = makeNode(List);
|
||||
lfirst(newcell) = copyObject(lfirst(oldl));
|
||||
prev->next = newcell;
|
||||
prev = newcell;
|
||||
}
|
||||
prev->next = NIL;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.184 2003/02/08 20:20:53 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.185 2003/02/09 06:56:27 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -59,6 +59,13 @@
|
||||
return false; \
|
||||
} while (0)
|
||||
|
||||
/* Compare a field that is a pointer to a list of Oids */
|
||||
#define COMPARE_OIDLIST_FIELD(fldname) \
|
||||
do { \
|
||||
if (!equalo(a->fldname, b->fldname)) \
|
||||
return false; \
|
||||
} while (0)
|
||||
|
||||
/* Compare a field that is a pointer to a Bitmapset */
|
||||
#define COMPARE_BITMAPSET_FIELD(fldname) \
|
||||
do { \
|
||||
@@ -297,7 +304,7 @@ _equalSubLink(SubLink *a, SubLink *b)
|
||||
COMPARE_SCALAR_FIELD(useOr);
|
||||
COMPARE_NODE_FIELD(lefthand);
|
||||
COMPARE_NODE_FIELD(operName);
|
||||
COMPARE_INTLIST_FIELD(operOids);
|
||||
COMPARE_OIDLIST_FIELD(operOids);
|
||||
COMPARE_NODE_FIELD(subselect);
|
||||
|
||||
return true;
|
||||
@@ -611,7 +618,7 @@ _equalSetOperationStmt(SetOperationStmt *a, SetOperationStmt *b)
|
||||
COMPARE_SCALAR_FIELD(all);
|
||||
COMPARE_NODE_FIELD(larg);
|
||||
COMPARE_NODE_FIELD(rarg);
|
||||
COMPARE_INTLIST_FIELD(colTypes);
|
||||
COMPARE_OIDLIST_FIELD(colTypes);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1237,7 +1244,7 @@ _equalPrepareStmt(PrepareStmt *a, PrepareStmt *b)
|
||||
{
|
||||
COMPARE_STRING_FIELD(name);
|
||||
COMPARE_NODE_FIELD(argtypes);
|
||||
COMPARE_INTLIST_FIELD(argtype_oids);
|
||||
COMPARE_OIDLIST_FIELD(argtype_oids);
|
||||
COMPARE_NODE_FIELD(query);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* list.c
|
||||
* various list handling routines
|
||||
* POSTGRES generic list package
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.47 2003/02/08 20:20:54 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.48 2003/02/09 06:56:27 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* XXX a few of the following functions are duplicated to handle
|
||||
@@ -117,6 +118,21 @@ lconsi(int datum, List *list)
|
||||
return l;
|
||||
}
|
||||
|
||||
/*
|
||||
* lconso
|
||||
*
|
||||
* Same as lcons, but for Oid data
|
||||
*/
|
||||
List *
|
||||
lconso(Oid datum, List *list)
|
||||
{
|
||||
List *l = makeNode(List);
|
||||
|
||||
lfirsto(l) = datum;
|
||||
lnext(l) = list;
|
||||
return l;
|
||||
}
|
||||
|
||||
/*
|
||||
* lappend
|
||||
*
|
||||
@@ -141,6 +157,17 @@ lappendi(List *list, int datum)
|
||||
return nconc(list, makeListi1(datum));
|
||||
}
|
||||
|
||||
/*
|
||||
* lappendo
|
||||
*
|
||||
* Same as lappend, but for Oids
|
||||
*/
|
||||
List *
|
||||
lappendo(List *list, Oid datum)
|
||||
{
|
||||
return nconc(list, makeListo1(datum));
|
||||
}
|
||||
|
||||
/*
|
||||
* nconc
|
||||
*
|
||||
@@ -159,7 +186,7 @@ nconc(List *l1, List *l2)
|
||||
if (l2 == NIL)
|
||||
return l1;
|
||||
if (l1 == l2)
|
||||
elog(ERROR, "tryout to nconc a list to itself");
|
||||
elog(ERROR, "can't nconc a list to itself");
|
||||
|
||||
for (temp = l1; lnext(temp) != NIL; temp = lnext(temp))
|
||||
;
|
||||
@@ -177,44 +204,13 @@ void *
|
||||
nth(int n, List *l)
|
||||
{
|
||||
/* XXX assume list is long enough */
|
||||
while (n > 0)
|
||||
while (n-- > 0)
|
||||
{
|
||||
l = lnext(l);
|
||||
n--;
|
||||
}
|
||||
return lfirst(l);
|
||||
}
|
||||
|
||||
/*
|
||||
* nthi
|
||||
*
|
||||
* Same as nthi, but for integers
|
||||
*/
|
||||
int
|
||||
nthi(int n, List *l)
|
||||
{
|
||||
/* XXX assume list is long enough */
|
||||
while (n > 0)
|
||||
{
|
||||
l = lnext(l);
|
||||
n--;
|
||||
}
|
||||
return lfirsti(l);
|
||||
}
|
||||
|
||||
/* this is here solely for rt_store. Get rid of me some day! */
|
||||
void
|
||||
set_nth(List *l, int n, void *elem)
|
||||
{
|
||||
/* XXX assume list is long enough */
|
||||
while (n > 0)
|
||||
{
|
||||
l = lnext(l);
|
||||
n--;
|
||||
}
|
||||
lfirst(l) = elem;
|
||||
}
|
||||
|
||||
/*
|
||||
* length
|
||||
*
|
||||
@@ -253,7 +249,7 @@ llast(List *l)
|
||||
*
|
||||
* Free the List nodes of a list
|
||||
* The pointed-to nodes, if any, are NOT freed.
|
||||
* This works for integer lists too.
|
||||
* This works for integer and Oid lists too.
|
||||
*/
|
||||
void
|
||||
freeList(List *list)
|
||||
@@ -289,6 +285,28 @@ equali(List *list1, List *list2)
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* equalo
|
||||
* compares two lists of Oids
|
||||
*/
|
||||
bool
|
||||
equalo(List *list1, List *list2)
|
||||
{
|
||||
List *l;
|
||||
|
||||
foreach(l, list1)
|
||||
{
|
||||
if (list2 == NIL)
|
||||
return false;
|
||||
if (lfirsto(l) != lfirsto(list2))
|
||||
return false;
|
||||
list2 = lnext(list2);
|
||||
}
|
||||
if (list2 != NIL)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate the union of two lists,
|
||||
* ie, l1 plus all members of l2 that are not already in l1.
|
||||
@@ -313,17 +331,17 @@ set_union(List *l1, List *l2)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* set_union for integer lists */
|
||||
/* set_union for Oid lists */
|
||||
List *
|
||||
set_unioni(List *l1, List *l2)
|
||||
set_uniono(List *l1, List *l2)
|
||||
{
|
||||
List *retval = listCopy(l1);
|
||||
List *i;
|
||||
|
||||
foreach(i, l2)
|
||||
{
|
||||
if (!intMember(lfirsti(i), retval))
|
||||
retval = lappendi(retval, lfirsti(i));
|
||||
if (!oidMember(lfirsto(i), retval))
|
||||
retval = lappendo(retval, lfirsto(i));
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
@@ -353,6 +371,7 @@ set_ptrUnion(List *l1, List *l2)
|
||||
* The result is a fresh List, but it points to the same member nodes
|
||||
* as were in the inputs.
|
||||
*/
|
||||
#ifdef NOT_USED
|
||||
List *
|
||||
set_intersect(List *l1, List *l2)
|
||||
{
|
||||
@@ -366,20 +385,7 @@ set_intersect(List *l1, List *l2)
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
List *
|
||||
set_intersecti(List *l1, List *l2)
|
||||
{
|
||||
List *retval = NIL;
|
||||
List *i;
|
||||
|
||||
foreach(i, l1)
|
||||
{
|
||||
if (intMember(lfirsti(i), l2))
|
||||
retval = lappendi(retval, lfirsti(i));
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* member()
|
||||
@@ -408,7 +414,7 @@ ptrMember(void *l1, List *l2)
|
||||
|
||||
foreach(i, l2)
|
||||
{
|
||||
if (l1 == ((void *) lfirst(i)))
|
||||
if (l1 == lfirst(i))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -430,9 +436,26 @@ intMember(int l1, List *l2)
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* membership test for Oid lists
|
||||
*/
|
||||
bool
|
||||
oidMember(Oid l1, List *l2)
|
||||
{
|
||||
List *i;
|
||||
|
||||
foreach(i, l2)
|
||||
{
|
||||
if (l1 == lfirsto(i))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* lremove
|
||||
* Removes 'elem' from the linked list (destructively changing the list!).
|
||||
* (If there is more than one equal list member, the first is removed.)
|
||||
*
|
||||
* This version matches 'elem' using simple pointer comparison.
|
||||
* See also LispRemove.
|
||||
@@ -464,9 +487,9 @@ lremove(void *elem, List *list)
|
||||
/*
|
||||
* LispRemove
|
||||
* Removes 'elem' from the linked list (destructively changing the list!).
|
||||
* (If there is more than one equal list member, the first is removed.)
|
||||
*
|
||||
* This version matches 'elem' using equal().
|
||||
* (If there is more than one equal list member, the first is removed.)
|
||||
* See also lremove.
|
||||
*/
|
||||
List *
|
||||
@@ -572,12 +595,12 @@ set_difference(List *l1, List *l2)
|
||||
}
|
||||
|
||||
/*
|
||||
* set_differencei
|
||||
* set_differenceo
|
||||
*
|
||||
* Same as set_difference, but for integers
|
||||
* Same as set_difference, but for Oid lists
|
||||
*/
|
||||
List *
|
||||
set_differencei(List *l1, List *l2)
|
||||
set_differenceo(List *l1, List *l2)
|
||||
{
|
||||
List *result = NIL;
|
||||
List *i;
|
||||
@@ -587,8 +610,8 @@ set_differencei(List *l1, List *l2)
|
||||
|
||||
foreach(i, l1)
|
||||
{
|
||||
if (!intMember(lfirsti(i), l2))
|
||||
result = lappendi(result, lfirsti(i));
|
||||
if (!oidMember(lfirsto(i), l2))
|
||||
result = lappendo(result, lfirsto(i));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.197 2003/02/09 00:30:39 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.198 2003/02/09 06:56:27 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Every node type that can appear in stored rules' parsetrees *must*
|
||||
@@ -173,7 +173,7 @@ _outOidList(StringInfo str, List *list)
|
||||
|
||||
appendStringInfoChar(str, '(');
|
||||
foreach(l, list)
|
||||
appendStringInfo(str, " %u", (Oid) lfirsti(l));
|
||||
appendStringInfo(str, " %u", lfirsto(l));
|
||||
appendStringInfoChar(str, ')');
|
||||
}
|
||||
|
||||
@@ -689,7 +689,7 @@ _outSubLink(StringInfo str, SubLink *node)
|
||||
WRITE_BOOL_FIELD(useOr);
|
||||
WRITE_NODE_FIELD(lefthand);
|
||||
WRITE_NODE_FIELD(operName);
|
||||
WRITE_INTLIST_FIELD(operOids);
|
||||
WRITE_OIDLIST_FIELD(operOids);
|
||||
WRITE_NODE_FIELD(subselect);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.147 2003/02/03 21:15:44 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.148 2003/02/09 06:56:27 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Path and Plan nodes do not have any readfuncs support, because we
|
||||
@@ -170,12 +170,12 @@ toOidList(List *list)
|
||||
*/
|
||||
if (IsA(v, Integer))
|
||||
{
|
||||
lfirsti(l) = (Oid) intVal(v);
|
||||
lfirsto(l) = (Oid) intVal(v);
|
||||
pfree(v);
|
||||
}
|
||||
else if (IsA(v, Float))
|
||||
{
|
||||
lfirsti(l) = atooid(strVal(v));
|
||||
lfirsto(l) = atooid(strVal(v));
|
||||
pfree(strVal(v));
|
||||
pfree(v);
|
||||
}
|
||||
@@ -534,7 +534,7 @@ _readSubLink(void)
|
||||
READ_BOOL_FIELD(useOr);
|
||||
READ_NODE_FIELD(lefthand);
|
||||
READ_NODE_FIELD(operName);
|
||||
READ_INTLIST_FIELD(operOids);
|
||||
READ_OIDLIST_FIELD(operOids);
|
||||
READ_NODE_FIELD(subselect);
|
||||
|
||||
READ_DONE();
|
||||
|
||||
Reference in New Issue
Block a user