diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 27b187f2a5e3b70fa6c3feffce71969c81b1056d..67f36f73e4ab799031117e40adf14763e152ff79 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 122417efd61bb37c61272ca931322818aaa54d41..74bb477e0e65b6d611afb2f4b393d5ce44b648d3 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 3bf6d2f4dc8353ba96e42fbac80cd0f6f6e67bf8..b626567b21c78f3a7f6d450c462625e3899edc16 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 b67431716fb3a5da2617b4b0e08f7e064fe09180..9de8ebb6c7fbc6f85e520c147d43d862a66e86a3 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 70486ab68b13efb2d80529c4593923c95bec8040..574b1969b6c1e3c24d2be323e9bb21b94094f3a6 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 31278f89f0646243b7fccaa515d9714b9b4e1d45..f2e31919cc5e1556ed555e767bf52e98d4bee729 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+test2<test3*4); -- should fail insert into atacc1 (test,test2,test3) values (4,4,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,test2,test3) values (4,4,5); drop table atacc1; @@ -445,7 +445,7 @@ create table atacc1 (test int check (test>3), 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 1842314ce9a8e878cf924600be676ce7975b9311..9e1faa0a37feefdaa4c8f6efd53fc568949b9ac9 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 7127215869a3c90bb2bb081ec15827035876c5a9..c5615b57572761bc35b365ce8eaabe6e88ea21f1 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 e4ecf9341712b956c4921ad8028e719a7153707c..1a5225b0a36b2975bc6931595cf90646f4c74bf7 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 3f069996fc9fa7471c9b00042bbab070a61168fd..29321e441464b8aff9bc3a3eef43cc28dd910f3d 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 8986118fd48684b1bfc9fbe61e996d8bbf4edad8..3dafd9a87719bcc26895f6ffd05d4869c5d24830 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 078450a754416d6fa421bebc42080f260b66f05f..2277d5c8b2b813eb98de605452dcf5669627bfe3 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 44b0329ee5f8df4467c62f463a4a73b2796fb950..28b22d9859f7ad601c24ef2eb2bd5dd56d54816b 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);