From bb34970f91834b63b3fed44118f1996e5a062470 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 26 Mar 2005 06:28:59 +0000 Subject: [PATCH] Use a bitmapset instead of a list for duplicate-column checking in checkInsertTargets(). Avoids O(N^2) behavior on wide target lists. --- src/backend/parser/parse_target.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index ebba3e868f..8675bc2683 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); -- 2.40.0