From ed275aea4270adf9c3ebeeb65a9a9af7b157e3ca Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 25 Jun 2002 17:27:20 +0000 Subject: [PATCH] The attached patch fixes some spelling mistakes, makes the comments on one of the optimizer functions a lot more clear, adds a summary of the recent KSQO discussion to the comments in the code, adds regression tests for the bug with sequence state Tom fixed recently and another reg. test, and removes some PostQuel legacy stuff: ExecAppend -> ExecInsert, ExecRetrieve -> ExecSelect, etc. This was changed because the elog() messages from this routine are user-visible, so we should be using the SQL terms. Neil Conway --- src/backend/executor/execMain.c | 78 +++++++++---------- src/backend/executor/execUtils.c | 4 +- src/backend/optimizer/path/costsize.c | 12 +-- .../optimizer/prep/_deadcode/prepkeyset.c | 17 ++-- src/include/executor/executor.h | 4 +- src/test/regress/expected/alter_table.out | 24 +++--- src/test/regress/expected/create_misc.out | 12 ++- src/test/regress/expected/domain.out | 8 +- src/test/regress/expected/insert.out | 2 +- src/test/regress/expected/select_having.out | 9 +++ src/test/regress/output/constraints.source | 42 +++++----- src/test/regress/sql/create_misc.sql | 7 ++ src/test/regress/sql/select_having.sql | 4 + 13 files changed, 125 insertions(+), 98 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 27b187f2a5..67f36f73e4 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -27,7 +27,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.165 2002/06/20 20:29:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.166 2002/06/25 17:27:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -62,14 +62,14 @@ static TupleTableSlot *ExecutePlan(EState *estate, Plan *plan, long numberTuples, ScanDirection direction, DestReceiver *destfunc); -static void ExecRetrieve(TupleTableSlot *slot, +static void ExecSelect(TupleTableSlot *slot, DestReceiver *destfunc, EState *estate); -static void ExecAppend(TupleTableSlot *slot, ItemPointer tupleid, +static void ExecInsert(TupleTableSlot *slot, ItemPointer tupleid, EState *estate); static void ExecDelete(TupleTableSlot *slot, ItemPointer tupleid, EState *estate); -static void ExecReplace(TupleTableSlot *slot, ItemPointer tupleid, +static void ExecUpdate(TupleTableSlot *slot, ItemPointer tupleid, EState *estate); static TupleTableSlot *EvalPlanQualNext(EState *estate); static void EndEvalPlanQual(EState *estate); @@ -251,7 +251,7 @@ ExecCheckQueryPerms(CmdType operation, Query *parseTree, Plan *plan) ExecCheckRTPerms(parseTree->rtable, operation); /* - * Search for subplans and APPEND nodes to check their rangetables. + * Search for subplans and INSERT nodes to check their rangetables. */ ExecCheckPlanPerms(plan, parseTree->rtable, operation); } @@ -583,7 +583,7 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) /* * Get the tuple descriptor describing the type of tuples to return. * (this is especially important if we are creating a relation with - * "retrieve into") + * "SELECT INTO") */ tupType = ExecGetTupType(plan); /* tuple descriptor */ @@ -892,7 +892,7 @@ EndPlan(Plan *plan, EState *estate) * Retrieves all tuples if numberTuples is 0 * * result is either a slot containing the last tuple in the case - * of a RETRIEVE or NULL otherwise. + * of a SELECT or NULL otherwise. * * Note: the ctid attribute is a 'junk' attribute that is removed before the * user can see it @@ -1068,29 +1068,26 @@ lnext: ; slot = ExecStoreTuple(newTuple, /* tuple to store */ junkfilter->jf_resultSlot, /* dest slot */ - InvalidBuffer, /* this tuple has no - * buffer */ + InvalidBuffer, /* this tuple has no buffer */ true); /* tuple should be pfreed */ - } /* if (junkfilter... */ + } /* * now that we have a tuple, do the appropriate thing with it.. * either return it to the user, add it to a relation someplace, * delete it from a relation, or modify some of its attributes. */ - switch (operation) { case CMD_SELECT: - ExecRetrieve(slot, /* slot containing tuple */ - destfunc, /* destination's tuple-receiver - * obj */ - estate); /* */ + ExecSelect(slot, /* slot containing tuple */ + destfunc, /* destination's tuple-receiver obj */ + estate); result = slot; break; case CMD_INSERT: - ExecAppend(slot, tupleid, estate); + ExecInsert(slot, tupleid, estate); result = NULL; break; @@ -1100,7 +1097,7 @@ lnext: ; break; case CMD_UPDATE: - ExecReplace(slot, tupleid, estate); + ExecUpdate(slot, tupleid, estate); result = NULL; break; @@ -1121,25 +1118,25 @@ lnext: ; /* * here, result is either a slot containing a tuple in the case of a - * RETRIEVE or NULL otherwise. + * SELECT or NULL otherwise. */ return result; } /* ---------------------------------------------------------------- - * ExecRetrieve + * ExecSelect * - * RETRIEVEs are easy.. we just pass the tuple to the appropriate + * SELECTs are easy.. we just pass the tuple to the appropriate * print function. The only complexity is when we do a - * "retrieve into", in which case we insert the tuple into + * "SELECT INTO", in which case we insert the tuple into * the appropriate relation (note: this is a newly created relation * so we don't need to worry about indices or locks.) * ---------------------------------------------------------------- */ static void -ExecRetrieve(TupleTableSlot *slot, - DestReceiver *destfunc, - EState *estate) +ExecSelect(TupleTableSlot *slot, + DestReceiver *destfunc, + EState *estate) { HeapTuple tuple; TupleDesc attrtype; @@ -1169,16 +1166,15 @@ ExecRetrieve(TupleTableSlot *slot, } /* ---------------------------------------------------------------- - * ExecAppend + * ExecInsert * - * APPENDs are trickier.. we have to insert the tuple into + * INSERTs are trickier.. we have to insert the tuple into * the base relation and insert appropriate tuples into the * index relations. * ---------------------------------------------------------------- */ - static void -ExecAppend(TupleTableSlot *slot, +ExecInsert(TupleTableSlot *slot, ItemPointer tupleid, EState *estate) { @@ -1227,7 +1223,7 @@ ExecAppend(TupleTableSlot *slot, * Check the constraints of the tuple */ if (resultRelationDesc->rd_att->constr) - ExecConstraints("ExecAppend", resultRelInfo, slot, estate); + ExecConstraints("ExecInsert", resultRelInfo, slot, estate); /* * insert the tuple @@ -1259,7 +1255,7 @@ ExecAppend(TupleTableSlot *slot, /* ---------------------------------------------------------------- * ExecDelete * - * DELETE is like append, we delete the tuple and its + * DELETE is like UPDATE, we delete the tuple and its * index tuples. * ---------------------------------------------------------------- */ @@ -1346,18 +1342,18 @@ ldelete:; } /* ---------------------------------------------------------------- - * ExecReplace + * ExecUpdate * - * note: we can't run replace queries with transactions - * off because replaces are actually appends and our - * scan will mistakenly loop forever, replacing the tuple - * it just appended.. This should be fixed but until it + * note: we can't run UPDATE queries with transactions + * off because UPDATEs are actually INSERTs and our + * scan will mistakenly loop forever, updating the tuple + * it just inserted.. This should be fixed but until it * is, we don't want to get stuck in an infinite loop * which corrupts your database.. * ---------------------------------------------------------------- */ static void -ExecReplace(TupleTableSlot *slot, +ExecUpdate(TupleTableSlot *slot, ItemPointer tupleid, EState *estate) { @@ -1373,7 +1369,7 @@ ExecReplace(TupleTableSlot *slot, */ if (IsBootstrapProcessingMode()) { - elog(WARNING, "ExecReplace: replace can't run without transactions"); + elog(WARNING, "ExecUpdate: UPDATE can't run without transactions"); return; } @@ -1424,7 +1420,7 @@ ExecReplace(TupleTableSlot *slot, */ lreplace:; if (resultRelationDesc->rd_att->constr) - ExecConstraints("ExecReplace", resultRelInfo, slot, estate); + ExecConstraints("ExecUpdate", resultRelInfo, slot, estate); /* * replace the heap tuple @@ -1472,7 +1468,7 @@ lreplace:; /* * Note: instead of having to update the old index tuples associated * with the heap tuple, all we do is form and insert new index tuples. - * This is because replaces are actually deletes and inserts and index + * This is because UPDATEs are actually DELETEs and INSERTs and index * tuple deletion is done automagically by the vacuum daemon. All we * do is insert new index tuples. -cim 9/27/89 */ @@ -1481,7 +1477,7 @@ lreplace:; * process indices * * heap_update updates a tuple in the base relation by invalidating it - * and then appending a new tuple to the relation. As a side effect, + * and then inserting a new tuple to the relation. As a side effect, * the tupleid of the new tuple is placed in the new tuple's t_ctid * field. So we now insert index tuples using the new tupleid stored * there. @@ -1554,7 +1550,7 @@ ExecRelCheck(ResultRelInfo *resultRelInfo, } void -ExecConstraints(char *caller, ResultRelInfo *resultRelInfo, +ExecConstraints(const char *caller, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate) { Relation rel = resultRelInfo->ri_RelationDesc; diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index 122417efd6..74bb477e0e 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.83 2002/06/20 20:29:28 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.84 2002/06/25 17:27:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -18,7 +18,7 @@ * * ExecOpenIndices \ * ExecCloseIndices | referenced by InitPlan, EndPlan, - * ExecInsertIndexTuples / ExecAppend, ExecReplace + * ExecInsertIndexTuples / ExecInsert, ExecUpdate * * RegisterExprContextCallback Register function shutdown callback * UnregisterExprContextCallback Deregister function shutdown callback diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 3bf6d2f4dc..b626567b21 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -42,7 +42,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.85 2002/06/20 20:29:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.86 2002/06/25 17:27:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -154,11 +154,11 @@ cost_seqscan(Path *path, Query *root, * * Given a guesstimated cache size, we estimate the actual I/O cost per page * with the entirely ad-hoc equations: - * for rel_size <= effective_cache_size: - * 1 + (random_page_cost/2-1) * (rel_size/effective_cache_size) ** 2 - * for rel_size >= effective_cache_size: - * random_page_cost * (1 - (effective_cache_size/rel_size)/2) - * These give the right asymptotic behavior (=> 1.0 as rel_size becomes + * if relpages >= effective_cache_size: + * random_page_cost * (1 - (effective_cache_size/relpages)/2) + * if relpages < effective_cache_size: + * 1 + (random_page_cost/2-1) * (relpages/effective_cache_size) ** 2 + * These give the right asymptotic behavior (=> 1.0 as relpages becomes * small, => random_page_cost as it becomes large) and meet in the middle * with the estimate that the cache is about 50% effective for a relation * of the same size as effective_cache_size. (XXX this is probably all diff --git a/src/backend/optimizer/prep/_deadcode/prepkeyset.c b/src/backend/optimizer/prep/_deadcode/prepkeyset.c index b67431716f..9de8ebb6c7 100644 --- a/src/backend/optimizer/prep/_deadcode/prepkeyset.c +++ b/src/backend/optimizer/prep/_deadcode/prepkeyset.c @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * * prepkeyset.c - * Special preperation for keyset queries. + * Special preparation for keyset queries (KSQO). * * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -14,12 +14,6 @@ #include "postgres.h" #include "optimizer/planmain.h" -/* - * Node_Copy - * a macro to simplify calling of copyObject on the specified field - */ -#define Node_Copy(from, newnode, field) newnode->field = copyObject(from->field) - bool _use_keyset_query_optimizer = FALSE; #ifdef ENABLE_KEY_SET_QUERY @@ -55,13 +49,20 @@ static int TotalExpr; * a HAVING, or a GROUP BY. It must be a single table and have KSQO * set to 'on'. * - * The primary use of this transformation is to avoid the exponrntial + * The primary use of this transformation is to avoid the exponential * memory consumption of cnfify() and to make use of index access * methods. * * daveh@insightdist.com 1998-08-31 * * May want to also prune out duplicate terms. + * + * XXX: this code is currently not compiled because it has not been + * updated to work with the re-implementation of UNION/INTERSECT/EXCEPT + * in PostgreSQL 7.1. However, it is of questionable value in any + * case, because it changes the semantics of the original query: + * UNION will add an implicit SELECT DISTINCT, which might change + * the results that are returned. **********************************************************************/ void transformKeySetQuery(Query *origNode) diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 70486ab68b..574b1969b6 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: executor.h,v 1.66 2002/06/20 20:29:49 momjian Exp $ + * $Id: executor.h,v 1.67 2002/06/25 17:27:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -52,7 +52,7 @@ extern TupleDesc ExecutorStart(QueryDesc *queryDesc, EState *estate); extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc, EState *estate, ScanDirection direction, long count); extern void ExecutorEnd(QueryDesc *queryDesc, EState *estate); -extern void ExecConstraints(char *caller, ResultRelInfo *resultRelInfo, +extern void ExecConstraints(const char *caller, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate); extern TupleTableSlot *EvalPlanQual(EState *estate, Index rti, ItemPointer tid); diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 31278f89f0..f2e31919cc 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -411,7 +411,7 @@ create table atacc1 ( test int ); alter table atacc1 add constraint atacc_test1 check (test>3); -- should fail insert into atacc1 (test) values (2); -ERROR: ExecAppend: rejected due to CHECK constraint atacc_test1 +ERROR: ExecInsert: rejected due to CHECK constraint atacc_test1 -- should succeed insert into atacc1 (test) values (4); drop table atacc1; @@ -436,7 +436,7 @@ create table atacc1 ( test int, test2 int, test3 int); alter table atacc1 add constraint atacc_test1 check (test+test23), test2 int); alter table atacc1 add check (test2>test); -- should fail for $2 insert into atacc1 (test2, test) values (3, 4); -ERROR: ExecAppend: rejected due to CHECK constraint $2 +ERROR: ExecInsert: rejected due to CHECK constraint $2 drop table atacc1; -- inheritance related tests create table atacc1 (test int); @@ -454,11 +454,11 @@ create table atacc3 (test3 int) inherits (atacc1, atacc2); alter table atacc2 add constraint foo check (test2>0); -- fail and then succeed on atacc2 insert into atacc2 (test2) values (-3); -ERROR: ExecAppend: rejected due to CHECK constraint foo +ERROR: ExecInsert: rejected due to CHECK constraint foo insert into atacc2 (test2) values (3); -- fail and then succeed on atacc3 insert into atacc3 (test2) values (-3); -ERROR: ExecAppend: rejected due to CHECK constraint foo +ERROR: ExecInsert: rejected due to CHECK constraint foo insert into atacc3 (test2) values (3); drop table atacc3; drop table atacc2; @@ -470,7 +470,7 @@ create table atacc3 (test3 int) inherits (atacc1, atacc2); alter table only atacc2 add constraint foo check (test2>0); -- fail and then succeed on atacc2 insert into atacc2 (test2) values (-3); -ERROR: ExecAppend: rejected due to CHECK constraint foo +ERROR: ExecInsert: rejected due to CHECK constraint foo insert into atacc2 (test2) values (3); -- both succeed on atacc3 insert into atacc3 (test2) values (-3); @@ -608,7 +608,7 @@ insert into atacc1 (test2, test) values (3, 3); insert into atacc1 (test2, test) values (2, 3); ERROR: Cannot insert a duplicate key into unique index atacc1_pkey insert into atacc1 (test2, test) values (1, NULL); -ERROR: ExecAppend: Fail to add null value in not null attribute test +ERROR: ExecInsert: Fail to add null value in not null attribute test drop table atacc1; -- alter table / alter column [set/drop] not null tests -- try altering system catalogs, should fail @@ -658,9 +658,9 @@ create table parent (a int); create table child (b varchar(255)) inherits (parent); alter table parent alter a set not null; insert into parent values (NULL); -ERROR: ExecAppend: Fail to add null value in not null attribute a +ERROR: ExecInsert: Fail to add null value in not null attribute a insert into child (a, b) values (NULL, 'foo'); -ERROR: ExecAppend: Fail to add null value in not null attribute a +ERROR: ExecInsert: Fail to add null value in not null attribute a alter table parent alter a drop not null; insert into parent values (NULL); insert into child (a, b) values (NULL, 'foo'); @@ -671,14 +671,14 @@ ERROR: ALTER TABLE: Attribute "a" contains NULL values delete from parent; alter table only parent alter a set not null; insert into parent values (NULL); -ERROR: ExecAppend: Fail to add null value in not null attribute a +ERROR: ExecInsert: Fail to add null value in not null attribute a alter table child alter a set not null; insert into child (a, b) values (NULL, 'foo'); -ERROR: ExecAppend: Fail to add null value in not null attribute a +ERROR: ExecInsert: Fail to add null value in not null attribute a delete from child; alter table child alter a set not null; insert into child (a, b) values (NULL, 'foo'); -ERROR: ExecAppend: Fail to add null value in not null attribute a +ERROR: ExecInsert: Fail to add null value in not null attribute a drop table child; drop table parent; -- test setting and removing default values diff --git a/src/test/regress/expected/create_misc.out b/src/test/regress/expected/create_misc.out index 1842314ce9..9e1faa0a37 100644 --- a/src/test/regress/expected/create_misc.out +++ b/src/test/regress/expected/create_misc.out @@ -142,7 +142,7 @@ INSERT INTO serialTest VALUES ('foo'); INSERT INTO serialTest VALUES ('bar'); INSERT INTO serialTest VALUES ('force', 100); INSERT INTO serialTest VALUES ('wrong', NULL); -ERROR: ExecAppend: Fail to add null value in not null attribute f2 +ERROR: ExecInsert: Fail to add null value in not null attribute f2 SELECT * FROM serialTest; f1 | f2 -------+----- @@ -151,3 +151,13 @@ SELECT * FROM serialTest; force | 100 (3 rows) +CREATE SEQUENCE sequence_test; +BEGIN; +SELECT nextval('sequence_test'); + nextval +--------- + 1 +(1 row) + +DROP SEQUENCE sequence_test; +END; diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index 7127215869..c5615b5757 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -88,14 +88,14 @@ create table nulltest , col4 dnull ); INSERT INTO nulltest DEFAULT VALUES; -ERROR: ExecAppend: Fail to add null value in not null attribute col1 +ERROR: ExecInsert: Fail to add null value in not null attribute col1 INSERT INTO nulltest values ('a', 'b', 'c', 'd'); -- Good INSERT INTO nulltest values (NULL, 'b', 'c', 'd'); -ERROR: ExecAppend: Fail to add null value in not null attribute col1 +ERROR: ExecInsert: Fail to add null value in not null attribute col1 INSERT INTO nulltest values ('a', NULL, 'c', 'd'); -ERROR: ExecAppend: Fail to add null value in not null attribute col2 +ERROR: ExecInsert: Fail to add null value in not null attribute col2 INSERT INTO nulltest values ('a', 'b', NULL, 'd'); -ERROR: ExecAppend: Fail to add null value in not null attribute col3 +ERROR: ExecInsert: Fail to add null value in not null attribute col3 INSERT INTO nulltest values ('a', 'b', 'c', NULL); -- Good select * from nulltest; col1 | col2 | col3 | col4 diff --git a/src/test/regress/expected/insert.out b/src/test/regress/expected/insert.out index e4ecf93417..1a5225b0a3 100644 --- a/src/test/regress/expected/insert.out +++ b/src/test/regress/expected/insert.out @@ -3,7 +3,7 @@ -- create table inserttest (col1 int4, col2 int4 NOT NULL, col3 text default 'testing'); insert into inserttest (col1, col2, col3) values (DEFAULT, DEFAULT, DEFAULT); -ERROR: ExecAppend: Fail to add null value in not null attribute col2 +ERROR: ExecInsert: Fail to add null value in not null attribute col2 insert into inserttest (col2, col3) values (3, DEFAULT); insert into inserttest (col1, col2, col3) values (DEFAULT, 5, DEFAULT); insert into inserttest values (DEFAULT, 5, 'test'); diff --git a/src/test/regress/expected/select_having.out b/src/test/regress/expected/select_having.out index 3f069996fc..29321e4414 100644 --- a/src/test/regress/expected/select_having.out +++ b/src/test/regress/expected/select_having.out @@ -21,6 +21,15 @@ SELECT b, c FROM test_having 3 | bbbb (2 rows) +-- HAVING is equivalent to WHERE in this case +SELECT b, c FROM test_having + GROUP BY b, c HAVING b = 3; + b | c +---+---------- + 3 | BBBB + 3 | bbbb +(2 rows) + SELECT lower(c), count(c) FROM test_having GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a); lower | count diff --git a/src/test/regress/output/constraints.source b/src/test/regress/output/constraints.source index 8986118fd4..3dafd9a877 100644 --- a/src/test/regress/output/constraints.source +++ b/src/test/regress/output/constraints.source @@ -62,12 +62,12 @@ CREATE TABLE CHECK_TBL (x int, INSERT INTO CHECK_TBL VALUES (5); INSERT INTO CHECK_TBL VALUES (4); INSERT INTO CHECK_TBL VALUES (3); -ERROR: ExecAppend: rejected due to CHECK constraint check_con +ERROR: ExecInsert: rejected due to CHECK constraint check_con INSERT INTO CHECK_TBL VALUES (2); -ERROR: ExecAppend: rejected due to CHECK constraint check_con +ERROR: ExecInsert: rejected due to CHECK constraint check_con INSERT INTO CHECK_TBL VALUES (6); INSERT INTO CHECK_TBL VALUES (1); -ERROR: ExecAppend: rejected due to CHECK constraint check_con +ERROR: ExecInsert: rejected due to CHECK constraint check_con SELECT '' AS three, * FROM CHECK_TBL; three | x -------+--- @@ -82,13 +82,13 @@ CREATE TABLE CHECK2_TBL (x int, y text, z int, CHECK (x > 3 and y <> 'check failed' and z < 8)); INSERT INTO CHECK2_TBL VALUES (4, 'check ok', -2); INSERT INTO CHECK2_TBL VALUES (1, 'x check failed', -2); -ERROR: ExecAppend: rejected due to CHECK constraint sequence_con +ERROR: ExecInsert: rejected due to CHECK constraint sequence_con INSERT INTO CHECK2_TBL VALUES (5, 'z check failed', 10); -ERROR: ExecAppend: rejected due to CHECK constraint sequence_con +ERROR: ExecInsert: rejected due to CHECK constraint sequence_con INSERT INTO CHECK2_TBL VALUES (0, 'check failed', -2); -ERROR: ExecAppend: rejected due to CHECK constraint sequence_con +ERROR: ExecInsert: rejected due to CHECK constraint sequence_con INSERT INTO CHECK2_TBL VALUES (6, 'check failed', 11); -ERROR: ExecAppend: rejected due to CHECK constraint sequence_con +ERROR: ExecInsert: rejected due to CHECK constraint sequence_con INSERT INTO CHECK2_TBL VALUES (7, 'check ok', 7); SELECT '' AS two, * from CHECK2_TBL; two | x | y | z @@ -107,7 +107,7 @@ CREATE TABLE INSERT_TBL (x INT DEFAULT nextval('insert_seq'), CONSTRAINT INSERT_CON CHECK (x >= 3 AND y <> 'check failed' AND x < 8), CHECK (x + z = 0)); INSERT INTO INSERT_TBL(x,z) VALUES (2, -2); -ERROR: ExecAppend: rejected due to CHECK constraint insert_con +ERROR: ExecInsert: rejected due to CHECK constraint insert_con SELECT '' AS zero, * FROM INSERT_TBL; zero | x | y | z ------+---+---+--- @@ -120,13 +120,13 @@ SELECT 'one' AS one, nextval('insert_seq'); (1 row) INSERT INTO INSERT_TBL(y) VALUES ('Y'); -ERROR: ExecAppend: rejected due to CHECK constraint insert_con +ERROR: ExecInsert: rejected due to CHECK constraint insert_con INSERT INTO INSERT_TBL(y) VALUES ('Y'); INSERT INTO INSERT_TBL(x,z) VALUES (1, -2); -ERROR: ExecAppend: rejected due to CHECK constraint $2 +ERROR: ExecInsert: rejected due to CHECK constraint $2 INSERT INTO INSERT_TBL(z,x) VALUES (-7, 7); INSERT INTO INSERT_TBL VALUES (5, 'check failed', -5); -ERROR: ExecAppend: rejected due to CHECK constraint insert_con +ERROR: ExecInsert: rejected due to CHECK constraint insert_con INSERT INTO INSERT_TBL VALUES (7, '!check failed', -7); INSERT INTO INSERT_TBL(y) VALUES ('-!NULL-'); SELECT '' AS four, * FROM INSERT_TBL; @@ -139,9 +139,9 @@ SELECT '' AS four, * FROM INSERT_TBL; (4 rows) INSERT INTO INSERT_TBL(y,z) VALUES ('check failed', 4); -ERROR: ExecAppend: rejected due to CHECK constraint $2 +ERROR: ExecInsert: rejected due to CHECK constraint $2 INSERT INTO INSERT_TBL(x,y) VALUES (5, 'check failed'); -ERROR: ExecAppend: rejected due to CHECK constraint insert_con +ERROR: ExecInsert: rejected due to CHECK constraint insert_con INSERT INTO INSERT_TBL(x,y) VALUES (5, '!check failed'); INSERT INTO INSERT_TBL(y) VALUES ('-!NULL-'); SELECT '' AS six, * FROM INSERT_TBL; @@ -162,7 +162,7 @@ SELECT 'seven' AS one, nextval('insert_seq'); (1 row) INSERT INTO INSERT_TBL(y) VALUES ('Y'); -ERROR: ExecAppend: rejected due to CHECK constraint insert_con +ERROR: ExecInsert: rejected due to CHECK constraint insert_con SELECT 'eight' AS one, currval('insert_seq'); one | currval -------+--------- @@ -193,11 +193,11 @@ CREATE TABLE INSERT_CHILD (cx INT default 42, INHERITS (INSERT_TBL); INSERT INTO INSERT_CHILD(x,z,cy) VALUES (7,-7,11); INSERT INTO INSERT_CHILD(x,z,cy) VALUES (7,-7,6); -ERROR: ExecAppend: rejected due to CHECK constraint insert_child_cy +ERROR: ExecInsert: rejected due to CHECK constraint insert_child_cy INSERT INTO INSERT_CHILD(x,z,cy) VALUES (6,-7,7); -ERROR: ExecAppend: rejected due to CHECK constraint $1 +ERROR: ExecInsert: rejected due to CHECK constraint $1 INSERT INTO INSERT_CHILD(x,y,z,cy) VALUES (6,'check failed',-6,7); -ERROR: ExecAppend: rejected due to CHECK constraint insert_con +ERROR: ExecInsert: rejected due to CHECK constraint insert_con SELECT * FROM INSERT_CHILD; x | y | z | cx | cy ---+--------+----+----+---- @@ -227,7 +227,7 @@ SELECT '' AS three, * FROM INSERT_TBL; INSERT INTO INSERT_TBL SELECT * FROM tmp WHERE yd = 'try again'; INSERT INTO INSERT_TBL(y,z) SELECT yd, -7 FROM tmp WHERE yd = 'try again'; INSERT INTO INSERT_TBL(y,z) SELECT yd, -8 FROM tmp WHERE yd = 'try again'; -ERROR: ExecAppend: rejected due to CHECK constraint insert_con +ERROR: ExecInsert: rejected due to CHECK constraint insert_con SELECT '' AS four, * FROM INSERT_TBL; four | x | y | z ------+---+---------------+---- @@ -246,7 +246,7 @@ UPDATE INSERT_TBL SET x = NULL WHERE x = 5; UPDATE INSERT_TBL SET x = 6 WHERE x = 6; UPDATE INSERT_TBL SET x = -z, z = -x; UPDATE INSERT_TBL SET x = z, z = x; -ERROR: ExecReplace: rejected due to CHECK constraint insert_con +ERROR: ExecUpdate: rejected due to CHECK constraint insert_con SELECT * FROM INSERT_TBL; x | y | z ---+---------------+---- @@ -293,7 +293,7 @@ ERROR: Cannot insert a duplicate key into unique index primary_tbl_pkey INSERT INTO PRIMARY_TBL VALUES (4, 'three'); INSERT INTO PRIMARY_TBL VALUES (5, 'one'); INSERT INTO PRIMARY_TBL (t) VALUES ('six'); -ERROR: ExecAppend: Fail to add null value in not null attribute i +ERROR: ExecInsert: Fail to add null value in not null attribute i SELECT '' AS four, * FROM PRIMARY_TBL; four | i | t ------+---+------- @@ -313,7 +313,7 @@ INSERT INTO PRIMARY_TBL VALUES (1, 'three'); INSERT INTO PRIMARY_TBL VALUES (4, 'three'); INSERT INTO PRIMARY_TBL VALUES (5, 'one'); INSERT INTO PRIMARY_TBL (t) VALUES ('six'); -ERROR: ExecAppend: Fail to add null value in not null attribute i +ERROR: ExecInsert: Fail to add null value in not null attribute i SELECT '' AS three, * FROM PRIMARY_TBL; three | i | t -------+---+------- diff --git a/src/test/regress/sql/create_misc.sql b/src/test/regress/sql/create_misc.sql index 078450a754..2277d5c8b2 100644 --- a/src/test/regress/sql/create_misc.sql +++ b/src/test/regress/sql/create_misc.sql @@ -217,3 +217,10 @@ INSERT INTO serialTest VALUES ('force', 100); INSERT INTO serialTest VALUES ('wrong', NULL); SELECT * FROM serialTest; + +CREATE SEQUENCE sequence_test; + +BEGIN; +SELECT nextval('sequence_test'); +DROP SEQUENCE sequence_test; +END; diff --git a/src/test/regress/sql/select_having.sql b/src/test/regress/sql/select_having.sql index 44b0329ee5..28b22d9859 100644 --- a/src/test/regress/sql/select_having.sql +++ b/src/test/regress/sql/select_having.sql @@ -18,6 +18,10 @@ INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j'); SELECT b, c FROM test_having GROUP BY b, c HAVING count(*) = 1; +-- HAVING is equivalent to WHERE in this case +SELECT b, c FROM test_having + GROUP BY b, c HAVING b = 3; + SELECT lower(c), count(c) FROM test_having GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a);