@@ -539,8 +539,197 @@ FROM t1;
539
539
1 | 0
540
540
(20 rows)
541
541
542
- DROP TABLE t1;
543
542
DROP TABLE T;
543
+ -- test that we account for missing columns without defaults correctly
544
+ -- in expand_tuple, and that rows are correctly expanded for triggers
545
+ CREATE FUNCTION test_trigger()
546
+ RETURNS trigger
547
+ LANGUAGE plpgsql
548
+ AS $$
549
+
550
+ begin
551
+ raise notice 'old tuple: %', to_json(OLD)::text;
552
+ if TG_OP = 'DELETE'
553
+ then
554
+ return OLD;
555
+ else
556
+ return NEW;
557
+ end if;
558
+ end;
559
+
560
+ $$;
561
+ -- 2 new columns, both have defaults
562
+ CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int);
563
+ INSERT INTO t (a,b,c) VALUES (1,2,3);
564
+ ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4;
565
+ ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5;
566
+ CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger();
567
+ SELECT * FROM t;
568
+ id | a | b | c | x | y
569
+ ----+---+---+---+---+---
570
+ 1 | 1 | 2 | 3 | 4 | 5
571
+ (1 row)
572
+
573
+ UPDATE t SET y = 2;
574
+ NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":3,"x":4,"y":5}
575
+ SELECT * FROM t;
576
+ id | a | b | c | x | y
577
+ ----+---+---+---+---+---
578
+ 1 | 1 | 2 | 3 | 4 | 2
579
+ (1 row)
580
+
581
+ DROP TABLE t;
582
+ -- 2 new columns, first has default
583
+ CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int);
584
+ INSERT INTO t (a,b,c) VALUES (1,2,3);
585
+ ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4;
586
+ ALTER TABLE t ADD COLUMN y int;
587
+ CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger();
588
+ SELECT * FROM t;
589
+ id | a | b | c | x | y
590
+ ----+---+---+---+---+---
591
+ 1 | 1 | 2 | 3 | 4 |
592
+ (1 row)
593
+
594
+ UPDATE t SET y = 2;
595
+ NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":3,"x":4,"y":null}
596
+ SELECT * FROM t;
597
+ id | a | b | c | x | y
598
+ ----+---+---+---+---+---
599
+ 1 | 1 | 2 | 3 | 4 | 2
600
+ (1 row)
601
+
602
+ DROP TABLE t;
603
+ -- 2 new columns, second has default
604
+ CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int);
605
+ INSERT INTO t (a,b,c) VALUES (1,2,3);
606
+ ALTER TABLE t ADD COLUMN x int;
607
+ ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5;
608
+ CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger();
609
+ SELECT * FROM t;
610
+ id | a | b | c | x | y
611
+ ----+---+---+---+---+---
612
+ 1 | 1 | 2 | 3 | | 5
613
+ (1 row)
614
+
615
+ UPDATE t SET y = 2;
616
+ NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":3,"x":null,"y":5}
617
+ SELECT * FROM t;
618
+ id | a | b | c | x | y
619
+ ----+---+---+---+---+---
620
+ 1 | 1 | 2 | 3 | | 2
621
+ (1 row)
622
+
623
+ DROP TABLE t;
624
+ -- 2 new columns, neither has default
625
+ CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int);
626
+ INSERT INTO t (a,b,c) VALUES (1,2,3);
627
+ ALTER TABLE t ADD COLUMN x int;
628
+ ALTER TABLE t ADD COLUMN y int;
629
+ CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger();
630
+ SELECT * FROM t;
631
+ id | a | b | c | x | y
632
+ ----+---+---+---+---+---
633
+ 1 | 1 | 2 | 3 | |
634
+ (1 row)
635
+
636
+ UPDATE t SET y = 2;
637
+ NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":3,"x":null,"y":null}
638
+ SELECT * FROM t;
639
+ id | a | b | c | x | y
640
+ ----+---+---+---+---+---
641
+ 1 | 1 | 2 | 3 | | 2
642
+ (1 row)
643
+
644
+ DROP TABLE t;
645
+ -- same as last 4 tests but here the last original column has a NULL value
646
+ -- 2 new columns, both have defaults
647
+ CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int);
648
+ INSERT INTO t (a,b,c) VALUES (1,2,NULL);
649
+ ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4;
650
+ ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5;
651
+ CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger();
652
+ SELECT * FROM t;
653
+ id | a | b | c | x | y
654
+ ----+---+---+---+---+---
655
+ 1 | 1 | 2 | | 4 | 5
656
+ (1 row)
657
+
658
+ UPDATE t SET y = 2;
659
+ NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":null,"x":4,"y":5}
660
+ SELECT * FROM t;
661
+ id | a | b | c | x | y
662
+ ----+---+---+---+---+---
663
+ 1 | 1 | 2 | | 4 | 2
664
+ (1 row)
665
+
666
+ DROP TABLE t;
667
+ -- 2 new columns, first has default
668
+ CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int);
669
+ INSERT INTO t (a,b,c) VALUES (1,2,NULL);
670
+ ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4;
671
+ ALTER TABLE t ADD COLUMN y int;
672
+ CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger();
673
+ SELECT * FROM t;
674
+ id | a | b | c | x | y
675
+ ----+---+---+---+---+---
676
+ 1 | 1 | 2 | | 4 |
677
+ (1 row)
678
+
679
+ UPDATE t SET y = 2;
680
+ NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":null,"x":4,"y":null}
681
+ SELECT * FROM t;
682
+ id | a | b | c | x | y
683
+ ----+---+---+---+---+---
684
+ 1 | 1 | 2 | | 4 | 2
685
+ (1 row)
686
+
687
+ DROP TABLE t;
688
+ -- 2 new columns, second has default
689
+ CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int);
690
+ INSERT INTO t (a,b,c) VALUES (1,2,NULL);
691
+ ALTER TABLE t ADD COLUMN x int;
692
+ ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5;
693
+ CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger();
694
+ SELECT * FROM t;
695
+ id | a | b | c | x | y
696
+ ----+---+---+---+---+---
697
+ 1 | 1 | 2 | | | 5
698
+ (1 row)
699
+
700
+ UPDATE t SET y = 2;
701
+ NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":null,"x":null,"y":5}
702
+ SELECT * FROM t;
703
+ id | a | b | c | x | y
704
+ ----+---+---+---+---+---
705
+ 1 | 1 | 2 | | | 2
706
+ (1 row)
707
+
708
+ DROP TABLE t;
709
+ -- 2 new columns, neither has default
710
+ CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int);
711
+ INSERT INTO t (a,b,c) VALUES (1,2,NULL);
712
+ ALTER TABLE t ADD COLUMN x int;
713
+ ALTER TABLE t ADD COLUMN y int;
714
+ CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger();
715
+ SELECT * FROM t;
716
+ id | a | b | c | x | y
717
+ ----+---+---+---+---+---
718
+ 1 | 1 | 2 | | |
719
+ (1 row)
720
+
721
+ UPDATE t SET y = 2;
722
+ NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":null,"x":null,"y":null}
723
+ SELECT * FROM t;
724
+ id | a | b | c | x | y
725
+ ----+---+---+---+---+---
726
+ 1 | 1 | 2 | | | 2
727
+ (1 row)
728
+
729
+ DROP TABLE t;
730
+ -- cleanup
731
+ DROP FUNCTION test_trigger();
732
+ DROP TABLE t1;
544
733
DROP FUNCTION set(name);
545
734
DROP FUNCTION comp();
546
735
DROP TABLE m;
0 commit comments