1
+ --
2
+ -- CREATE SEQUENCE
3
+ --
4
+ -- various error cases
5
+ CREATE UNLOGGED SEQUENCE sequence_testx;
6
+ ERROR: unlogged sequences are not supported
7
+ CREATE SEQUENCE sequence_testx INCREMENT BY 0;
8
+ ERROR: INCREMENT must not be zero
9
+ CREATE SEQUENCE sequence_testx INCREMENT BY -1 MINVALUE 20;
10
+ ERROR: MINVALUE (20) must be less than MAXVALUE (-1)
11
+ CREATE SEQUENCE sequence_testx INCREMENT BY 1 MAXVALUE -20;
12
+ ERROR: MINVALUE (1) must be less than MAXVALUE (-20)
13
+ CREATE SEQUENCE sequence_testx INCREMENT BY -1 START 10;
14
+ ERROR: START value (10) cannot be greater than MAXVALUE (-1)
15
+ CREATE SEQUENCE sequence_testx INCREMENT BY 1 START -10;
16
+ ERROR: START value (-10) cannot be less than MINVALUE (1)
17
+ CREATE SEQUENCE sequence_testx CACHE 0;
18
+ ERROR: CACHE (0) must be greater than zero
19
+ -- OWNED BY errors
20
+ CREATE SEQUENCE sequence_testx OWNED BY nobody; -- nonsense word
21
+ ERROR: invalid OWNED BY option
22
+ HINT: Specify OWNED BY table.column or OWNED BY NONE.
23
+ CREATE SEQUENCE sequence_testx OWNED BY pg_tables.tablename; -- not a table
24
+ ERROR: referenced relation "pg_tables" is not a table or foreign table
25
+ CREATE SEQUENCE sequence_testx OWNED BY pg_class.relname; -- not same schema
26
+ ERROR: sequence must be in same schema as table it is linked to
27
+ CREATE TABLE sequence_test_table (a int);
28
+ CREATE SEQUENCE sequence_testx OWNED BY sequence_test_table.b; -- wrong column
29
+ ERROR: column "b" of relation "sequence_test_table" does not exist
30
+ DROP TABLE sequence_test_table;
1
31
---
2
32
--- test creation of SERIAL column
3
33
---
@@ -242,17 +272,38 @@ DROP SEQUENCE myseq2;
242
272
-- Alter sequence
243
273
--
244
274
ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 24
245
- INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE;
275
+ INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE;
246
276
NOTICE: relation "sequence_test2" does not exist, skipping
277
+ ALTER SEQUENCE pg_class CYCLE; -- error, not a sequence
278
+ ERROR: "pg_class" is not a sequence
247
279
CREATE SEQUENCE sequence_test2 START WITH 32;
280
+ CREATE SEQUENCE sequence_test4 INCREMENT BY -1;
281
+ SELECT nextval('sequence_test2');
282
+ nextval
283
+ ---------
284
+ 32
285
+ (1 row)
286
+
287
+ SELECT nextval('sequence_test4');
288
+ nextval
289
+ ---------
290
+ -1
291
+ (1 row)
292
+
293
+ ALTER SEQUENCE sequence_test2 RESTART;
248
294
SELECT nextval('sequence_test2');
249
295
nextval
250
296
---------
251
297
32
252
298
(1 row)
253
299
300
+ ALTER SEQUENCE sequence_test2 RESTART WITH 0; -- error
301
+ ERROR: RESTART value (0) cannot be less than MINVALUE (1)
302
+ ALTER SEQUENCE sequence_test4 RESTART WITH 40; -- error
303
+ ERROR: RESTART value (40) cannot be greater than MAXVALUE (-1)
304
+ -- test CYCLE and NO CYCLE
254
305
ALTER SEQUENCE sequence_test2 RESTART WITH 24
255
- INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE;
306
+ INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE;
256
307
SELECT nextval('sequence_test2');
257
308
nextval
258
309
---------
@@ -277,13 +328,26 @@ SELECT nextval('sequence_test2');
277
328
36
278
329
(1 row)
279
330
280
- SELECT nextval('sequence_test2');
331
+ SELECT nextval('sequence_test2'); -- cycled
281
332
nextval
282
333
---------
283
334
5
284
335
(1 row)
285
336
286
- ALTER SEQUENCE sequence_test2 RESTART;
337
+ ALTER SEQUENCE sequence_test2 RESTART WITH 24
338
+ NO CYCLE;
339
+ SELECT nextval('sequence_test2');
340
+ nextval
341
+ ---------
342
+ 24
343
+ (1 row)
344
+
345
+ SELECT nextval('sequence_test2');
346
+ nextval
347
+ ---------
348
+ 28
349
+ (1 row)
350
+
287
351
SELECT nextval('sequence_test2');
288
352
nextval
289
353
---------
@@ -296,45 +360,121 @@ SELECT nextval('sequence_test2');
296
360
36
297
361
(1 row)
298
362
363
+ SELECT nextval('sequence_test2'); -- error
364
+ ERROR: nextval: reached maximum value of sequence "sequence_test2" (36)
365
+ ALTER SEQUENCE sequence_test2 RESTART WITH -24 START WITH -24
366
+ INCREMENT BY -4 MINVALUE -36 MAXVALUE -5 CYCLE;
299
367
SELECT nextval('sequence_test2');
300
368
nextval
301
369
---------
302
- 5
370
+ -24
371
+ (1 row)
372
+
373
+ SELECT nextval('sequence_test2');
374
+ nextval
375
+ ---------
376
+ -28
377
+ (1 row)
378
+
379
+ SELECT nextval('sequence_test2');
380
+ nextval
381
+ ---------
382
+ -32
383
+ (1 row)
384
+
385
+ SELECT nextval('sequence_test2');
386
+ nextval
387
+ ---------
388
+ -36
389
+ (1 row)
390
+
391
+ SELECT nextval('sequence_test2'); -- cycled
392
+ nextval
393
+ ---------
394
+ -5
395
+ (1 row)
396
+
397
+ ALTER SEQUENCE sequence_test2 RESTART WITH -24
398
+ NO CYCLE;
399
+ SELECT nextval('sequence_test2');
400
+ nextval
401
+ ---------
402
+ -24
403
+ (1 row)
404
+
405
+ SELECT nextval('sequence_test2');
406
+ nextval
407
+ ---------
408
+ -28
409
+ (1 row)
410
+
411
+ SELECT nextval('sequence_test2');
412
+ nextval
413
+ ---------
414
+ -32
415
+ (1 row)
416
+
417
+ SELECT nextval('sequence_test2');
418
+ nextval
419
+ ---------
420
+ -36
421
+ (1 row)
422
+
423
+ SELECT nextval('sequence_test2'); -- error
424
+ ERROR: nextval: reached minimum value of sequence "sequence_test2" (-36)
425
+ -- reset
426
+ ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 32 START WITH 32
427
+ INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE;
428
+ SELECT setval('sequence_test2', -100); -- error
429
+ ERROR: setval: value -100 is out of bounds for sequence "sequence_test2" (5..36)
430
+ SELECT setval('sequence_test2', 100); -- error
431
+ ERROR: setval: value 100 is out of bounds for sequence "sequence_test2" (5..36)
432
+ SELECT setval('sequence_test2', 5);
433
+ setval
434
+ --------
435
+ 5
303
436
(1 row)
304
437
305
438
CREATE SEQUENCE sequence_test3; -- not read from, to test is_called
306
439
-- Information schema
307
- SELECT * FROM information_schema.sequences WHERE sequence_name IN
308
- ('sequence_test2', 'sequence_test3', 'serialtest2_f2_seq', 'serialtest2_f3_seq',
309
- 'serialtest2_f4_seq', 'serialtest2_f5_seq', 'serialtest2_f6_seq')
440
+ SELECT * FROM information_schema.sequences
441
+ WHERE sequence_name ~ ANY(ARRAY['sequence_test', 'serialtest'])
310
442
ORDER BY sequence_name ASC;
311
- sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
312
- ------------------+-----------------+--------------------+-----------+-------------------+-------------------------+---------------+-------------+---------------+---------------------+-----------+--------------
313
- regression | public | sequence_test2 | bigint | 64 | 2 | 0 | 32 | 5 | 36 | 4 | YES
314
- regression | public | sequence_test3 | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
315
- regression | public | serialtest2_f2_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
316
- regression | public | serialtest2_f3_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
317
- regression | public | serialtest2_f4_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
318
- regression | public | serialtest2_f5_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
319
- regression | public | serialtest2_f6_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
320
- (7 rows)
443
+ sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
444
+ ------------------+-----------------+--------------------+-----------+-------------------+-------------------------+---------------+-------------+----------------------+---------------------+-----------+--------------
445
+ regression | public | sequence_test2 | bigint | 64 | 2 | 0 | 32 | 5 | 36 | 4 | YES
446
+ regression | public | sequence_test3 | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
447
+ regression | public | sequence_test4 | bigint | 64 | 2 | 0 | -1 | -9223372036854775808 | -1 | -1 | NO
448
+ regression | public | serialtest2_f2_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
449
+ regression | public | serialtest2_f3_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
450
+ regression | public | serialtest2_f4_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
451
+ regression | public | serialtest2_f5_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
452
+ regression | public | serialtest2_f6_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
453
+ regression | public | serialtest_f2_foo | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
454
+ (9 rows)
321
455
322
456
SELECT schemaname, sequencename, start_value, min_value, max_value, increment_by, cycle, cache_size, last_value
323
457
FROM pg_sequences
324
- WHERE sequencename IN
325
- ('sequence_test2', 'sequence_test3', 'serialtest2_f2_seq', 'serialtest2_f3_seq',
326
- 'serialtest2_f4_seq', 'serialtest2_f5_seq', 'serialtest2_f6_seq')
458
+ WHERE sequencename ~ ANY(ARRAY['sequence_test', 'serialtest'])
327
459
ORDER BY sequencename ASC;
328
- schemaname | sequencename | start_value | min_value | max_value | increment_by | cycle | cache_size | last_value
329
- ------------+--------------------+-------------+-----------+---------------------+--------------+-------+------------+------------
330
- public | sequence_test2 | 32 | 5 | 36 | 4 | t | 1 | 5
331
- public | sequence_test3 | 1 | 1 | 9223372036854775807 | 1 | f | 1 |
332
- public | serialtest2_f2_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
333
- public | serialtest2_f3_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
334
- public | serialtest2_f4_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
335
- public | serialtest2_f5_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
336
- public | serialtest2_f6_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
337
- (7 rows)
460
+ schemaname | sequencename | start_value | min_value | max_value | increment_by | cycle | cache_size | last_value
461
+ ------------+--------------------+-------------+----------------------+---------------------+--------------+-------+------------+------------
462
+ public | sequence_test2 | 32 | 5 | 36 | 4 | t | 1 | 5
463
+ public | sequence_test3 | 1 | 1 | 9223372036854775807 | 1 | f | 1 |
464
+ public | sequence_test4 | -1 | -9223372036854775808 | -1 | -1 | f | 1 | -1
465
+ public | serialtest2_f2_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
466
+ public | serialtest2_f3_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
467
+ public | serialtest2_f4_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
468
+ public | serialtest2_f5_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
469
+ public | serialtest2_f6_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2
470
+ public | serialtest_f2_foo | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 3
471
+ (9 rows)
472
+
473
+ SELECT * FROM pg_sequence_parameters('sequence_test4'::regclass);
474
+ start_value | minimum_value | maximum_value | increment | cycle_option | cache_size
475
+ -------------+----------------------+---------------+-----------+--------------+------------
476
+ -1 | -9223372036854775808 | -1 | -1 | f | 1
477
+ (1 row)
338
478
339
479
-- Test comments
340
480
COMMENT ON SEQUENCE asdf IS 'won''t work';
@@ -388,6 +528,28 @@ DROP SEQUENCE seq2;
388
528
SELECT lastval();
389
529
ERROR: lastval is not yet defined in this session
390
530
CREATE USER regress_seq_user;
531
+ -- Test sequences in read-only transactions
532
+ CREATE TEMPORARY SEQUENCE sequence_test_temp1;
533
+ START TRANSACTION READ ONLY;
534
+ SELECT nextval('sequence_test_temp1'); -- ok
535
+ nextval
536
+ ---------
537
+ 1
538
+ (1 row)
539
+
540
+ SELECT nextval('sequence_test2'); -- error
541
+ ERROR: cannot execute nextval() in a read-only transaction
542
+ ROLLBACK;
543
+ START TRANSACTION READ ONLY;
544
+ SELECT setval('sequence_test_temp1', 1); -- ok
545
+ setval
546
+ --------
547
+ 1
548
+ (1 row)
549
+
550
+ SELECT setval('sequence_test2', 1); -- error
551
+ ERROR: cannot execute setval() in a read-only transaction
552
+ ROLLBACK;
391
553
-- privileges tests
392
554
-- nextval
393
555
BEGIN;
@@ -523,6 +685,35 @@ SELECT lastval();
523
685
1
524
686
(1 row)
525
687
688
+ ROLLBACK;
689
+ -- setval
690
+ BEGIN;
691
+ SET LOCAL SESSION AUTHORIZATION regress_seq_user;
692
+ CREATE SEQUENCE seq3;
693
+ REVOKE ALL ON seq3 FROM regress_seq_user;
694
+ SAVEPOINT save;
695
+ SELECT setval('seq3', 5);
696
+ ERROR: permission denied for sequence seq3
697
+ ROLLBACK TO save;
698
+ GRANT UPDATE ON seq3 TO regress_seq_user;
699
+ SELECT setval('seq3', 5);
700
+ setval
701
+ --------
702
+ 5
703
+ (1 row)
704
+
705
+ SELECT nextval('seq3');
706
+ nextval
707
+ ---------
708
+ 6
709
+ (1 row)
710
+
711
+ ROLLBACK;
712
+ -- ALTER SEQUENCE
713
+ BEGIN;
714
+ SET LOCAL SESSION AUTHORIZATION regress_seq_user;
715
+ ALTER SEQUENCE sequence_test2 START WITH 1;
716
+ ERROR: must be owner of relation sequence_test2
526
717
ROLLBACK;
527
718
-- Sequences should get wiped out as well:
528
719
DROP TABLE serialTest, serialTest2;
0 commit comments