]> granicus.if.org Git - postgresql/commitdiff
Use a bitmapset instead of a list for duplicate-column checking in
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 26 Mar 2005 06:28:59 +0000 (06:28 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 26 Mar 2005 06:28:59 +0000 (06:28 +0000)
checkInsertTargets().  Avoids O(N^2) behavior on wide target lists.

src/backend/parser/parse_target.c

index ebba3e868f1142a2092ec56f930883b30991bf03..8675bc2683900734de25690ee7af364a64069167 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.129 2005/01/13 17:19:09 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.130 2005/03/26 06:28:59 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -16,6 +16,7 @@
 
 #include "commands/dbcommands.h"
 #include "miscadmin.h"
+#include "nodes/bitmapset.h"
 #include "nodes/makefuncs.h"
 #include "parser/parsetree.h"
 #include "parser/parse_coerce.h"
@@ -630,7 +631,8 @@ checkInsertTargets(ParseState *pstate, List *cols, List **attrnos)
                /*
                 * Do initial validation of user-supplied INSERT column list.
                 */
-               List       *wholecols = NIL;
+               Bitmapset  *wholecols = NULL;
+               Bitmapset  *partialcols = NULL;
                ListCell   *tl;
 
                foreach(tl, cols)
@@ -649,21 +651,23 @@ checkInsertTargets(ParseState *pstate, List *cols, List **attrnos)
                        if (col->indirection == NIL)
                        {
                                /* whole column; must not have any other assignment */
-                               if (list_member_int(*attrnos, attrno))
+                               if (bms_is_member(attrno, wholecols) ||
+                                       bms_is_member(attrno, partialcols))
                                        ereport(ERROR,
                                                        (errcode(ERRCODE_DUPLICATE_COLUMN),
                                                 errmsg("column \"%s\" specified more than once",
                                                                name)));
-                               wholecols = lappend_int(wholecols, attrno);
+                               wholecols = bms_add_member(wholecols, attrno);
                        }
                        else
                        {
                                /* partial column; must not have any whole assignment */
-                               if (list_member_int(wholecols, attrno))
+                               if (bms_is_member(attrno, wholecols))
                                        ereport(ERROR,
                                                        (errcode(ERRCODE_DUPLICATE_COLUMN),
                                                 errmsg("column \"%s\" specified more than once",
                                                                name)));
+                               partialcols = bms_add_member(partialcols, attrno);
                        }
 
                        *attrnos = lappend_int(*attrnos, attrno);