aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_target.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-03-26 06:28:59 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-03-26 06:28:59 +0000
commitbb34970f91834b63b3fed44118f1996e5a062470 (patch)
tree1ffe4ff314e7c29ac75a900997946ee6313b3b4b /src/backend/parser/parse_target.c
parent9e5238137dcfbb6d1c5df47d7effb28d4849ba9c (diff)
downloadpostgresql-bb34970f91834b63b3fed44118f1996e5a062470.tar.gz
postgresql-bb34970f91834b63b3fed44118f1996e5a062470.zip
Use a bitmapset instead of a list for duplicate-column checking in
checkInsertTargets(). Avoids O(N^2) behavior on wide target lists.
Diffstat (limited to 'src/backend/parser/parse_target.c')
-rw-r--r--src/backend/parser/parse_target.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index ebba3e868f1..8675bc26839 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -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);