]> granicus.if.org Git - postgresql/commitdiff
Tweak grammar to use FastAppend rather than lappend when constructing
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 22 Aug 2003 20:34:33 +0000 (20:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 22 Aug 2003 20:34:33 +0000 (20:34 +0000)
expr_lists.  This appears to be the only remaining O(N^2) bottleneck
in processing many-way 'x IN (a,b,c,...)' conditions.

src/backend/parser/gram.y
src/include/nodes/pg_list.h

index ef6f8a80c5cb0d98ba2898ef3dd1f7387d9f5a39..5bdbe012a9538b5ab078fa4717c2bbd4d3bd9af6 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.429 2003/08/17 19:58:05 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.430 2003/08/22 20:34:33 tgl Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -108,6 +108,7 @@ static void doNegateFloat(Value *v);
        DropBehavior            dbehavior;
        OnCommitAction          oncommit;
        List                            *list;
+       FastList                        fastlist;
        Node                            *node;
        Value                           *value;
        ColumnRef                       *columnref;
@@ -6719,8 +6720,18 @@ opt_indirection:
                                { $$ = NIL; }
                ;
 
-expr_list:     a_expr                                                                  { $$ = makeList1($1); }
-                       | expr_list ',' a_expr                                  { $$ = lappend($1, $3); }
+expr_list:     a_expr
+                               {
+                                       FastList *dst = (FastList *) &$$;
+                                       makeFastList1(dst, $1);
+                               }
+                       | expr_list ',' a_expr
+                               {
+                                       FastList *dst = (FastList *) &$$;
+                                       FastList *src = (FastList *) &$1;
+                                       *dst = *src;
+                                       FastAppend(dst, $3);
+                               }
                ;
 
 extract_list:
index 4d9ce8304b1b7c1f673437ba64ea525e7f567a25..8ab22560ce6d055f1367513d90825b4e0dc8a15e 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_list.h,v 1.40 2003/08/08 21:42:48 momjian Exp $
+ * $Id: pg_list.h,v 1.41 2003/08/22 20:34:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -132,6 +132,9 @@ typedef struct List
  * FastList is an optimization for building large lists.  The conventional
  * way to build a list is repeated lappend() operations, but that is O(N^2)
  * in the number of list items, which gets tedious for large lists.
+ *
+ * Note: there are some hacks in gram.y that rely on the head pointer (the
+ * value-as-list) being the first field.
  */
 typedef struct FastList
 {
@@ -144,6 +147,9 @@ typedef struct FastList
        ( (fl)->head = (l), (fl)->tail = llastnode((fl)->head) )
 #define FastListValue(fl)      ( (fl)->head )
 
+#define makeFastList1(fl, x1)  \
+       ( (fl)->head = (fl)->tail = makeList1(x1) )
+
 
 /*
  * function prototypes in nodes/list.c