@@ -2648,3 +2648,156 @@ drop view rw_view1;
2648
2648
drop table base_tbl;
2649
2649
drop user regress_view_user1;
2650
2650
drop user regress_view_user2;
2651
+ -- Test single- and multi-row inserts with table and view defaults.
2652
+ -- Table defaults should be used, unless overridden by view defaults.
2653
+ create table base_tab_def (a int, b text default 'Table default',
2654
+ c text default 'Table default', d text, e text);
2655
+ create view base_tab_def_view as select * from base_tab_def;
2656
+ alter view base_tab_def_view alter b set default 'View default';
2657
+ alter view base_tab_def_view alter d set default 'View default';
2658
+ insert into base_tab_def values (1);
2659
+ insert into base_tab_def values (2), (3);
2660
+ insert into base_tab_def values (4, default, default, default, default);
2661
+ insert into base_tab_def values (5, default, default, default, default),
2662
+ (6, default, default, default, default);
2663
+ insert into base_tab_def_view values (11);
2664
+ insert into base_tab_def_view values (12), (13);
2665
+ insert into base_tab_def_view values (14, default, default, default, default);
2666
+ insert into base_tab_def_view values (15, default, default, default, default),
2667
+ (16, default, default, default, default);
2668
+ select * from base_tab_def order by a;
2669
+ a | b | c | d | e
2670
+ ----+---------------+---------------+--------------+---
2671
+ 1 | Table default | Table default | |
2672
+ 2 | Table default | Table default | |
2673
+ 3 | Table default | Table default | |
2674
+ 4 | Table default | Table default | |
2675
+ 5 | Table default | Table default | |
2676
+ 6 | Table default | Table default | |
2677
+ 11 | View default | Table default | View default |
2678
+ 12 | View default | Table default | View default |
2679
+ 13 | View default | Table default | View default |
2680
+ 14 | View default | Table default | View default |
2681
+ 15 | View default | Table default | View default |
2682
+ 16 | View default | Table default | View default |
2683
+ (12 rows)
2684
+
2685
+ -- Adding an INSTEAD OF trigger should cause NULLs to be inserted instead of
2686
+ -- table defaults, where there are no view defaults.
2687
+ create function base_tab_def_view_instrig_func() returns trigger
2688
+ as
2689
+ $$
2690
+ begin
2691
+ insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2692
+ return new;
2693
+ end;
2694
+ $$
2695
+ language plpgsql;
2696
+ create trigger base_tab_def_view_instrig instead of insert on base_tab_def_view
2697
+ for each row execute procedure base_tab_def_view_instrig_func();
2698
+ truncate base_tab_def;
2699
+ insert into base_tab_def values (1);
2700
+ insert into base_tab_def values (2), (3);
2701
+ insert into base_tab_def values (4, default, default, default, default);
2702
+ insert into base_tab_def values (5, default, default, default, default),
2703
+ (6, default, default, default, default);
2704
+ insert into base_tab_def_view values (11);
2705
+ insert into base_tab_def_view values (12), (13);
2706
+ insert into base_tab_def_view values (14, default, default, default, default);
2707
+ insert into base_tab_def_view values (15, default, default, default, default),
2708
+ (16, default, default, default, default);
2709
+ select * from base_tab_def order by a;
2710
+ a | b | c | d | e
2711
+ ----+---------------+---------------+--------------+---
2712
+ 1 | Table default | Table default | |
2713
+ 2 | Table default | Table default | |
2714
+ 3 | Table default | Table default | |
2715
+ 4 | Table default | Table default | |
2716
+ 5 | Table default | Table default | |
2717
+ 6 | Table default | Table default | |
2718
+ 11 | View default | | View default |
2719
+ 12 | View default | | View default |
2720
+ 13 | View default | | View default |
2721
+ 14 | View default | | View default |
2722
+ 15 | View default | | View default |
2723
+ 16 | View default | | View default |
2724
+ (12 rows)
2725
+
2726
+ -- Using an unconditional DO INSTEAD rule should also cause NULLs to be
2727
+ -- inserted where there are no view defaults.
2728
+ drop trigger base_tab_def_view_instrig on base_tab_def_view;
2729
+ drop function base_tab_def_view_instrig_func;
2730
+ create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view
2731
+ do instead insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2732
+ truncate base_tab_def;
2733
+ insert into base_tab_def values (1);
2734
+ insert into base_tab_def values (2), (3);
2735
+ insert into base_tab_def values (4, default, default, default, default);
2736
+ insert into base_tab_def values (5, default, default, default, default),
2737
+ (6, default, default, default, default);
2738
+ insert into base_tab_def_view values (11);
2739
+ insert into base_tab_def_view values (12), (13);
2740
+ insert into base_tab_def_view values (14, default, default, default, default);
2741
+ insert into base_tab_def_view values (15, default, default, default, default),
2742
+ (16, default, default, default, default);
2743
+ select * from base_tab_def order by a;
2744
+ a | b | c | d | e
2745
+ ----+---------------+---------------+--------------+---
2746
+ 1 | Table default | Table default | |
2747
+ 2 | Table default | Table default | |
2748
+ 3 | Table default | Table default | |
2749
+ 4 | Table default | Table default | |
2750
+ 5 | Table default | Table default | |
2751
+ 6 | Table default | Table default | |
2752
+ 11 | View default | | View default |
2753
+ 12 | View default | | View default |
2754
+ 13 | View default | | View default |
2755
+ 14 | View default | | View default |
2756
+ 15 | View default | | View default |
2757
+ 16 | View default | | View default |
2758
+ (12 rows)
2759
+
2760
+ -- A DO ALSO rule should cause each row to be inserted twice. The first
2761
+ -- insert should behave the same as an auto-updatable view (using table
2762
+ -- defaults, unless overridden by view defaults). The second insert should
2763
+ -- behave the same as a rule-updatable view (inserting NULLs where there are
2764
+ -- no view defaults).
2765
+ drop rule base_tab_def_view_ins_rule on base_tab_def_view;
2766
+ create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view
2767
+ do also insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2768
+ truncate base_tab_def;
2769
+ insert into base_tab_def values (1);
2770
+ insert into base_tab_def values (2), (3);
2771
+ insert into base_tab_def values (4, default, default, default, default);
2772
+ insert into base_tab_def values (5, default, default, default, default),
2773
+ (6, default, default, default, default);
2774
+ insert into base_tab_def_view values (11);
2775
+ insert into base_tab_def_view values (12), (13);
2776
+ insert into base_tab_def_view values (14, default, default, default, default);
2777
+ insert into base_tab_def_view values (15, default, default, default, default),
2778
+ (16, default, default, default, default);
2779
+ select * from base_tab_def order by a, c NULLS LAST;
2780
+ a | b | c | d | e
2781
+ ----+---------------+---------------+--------------+---
2782
+ 1 | Table default | Table default | |
2783
+ 2 | Table default | Table default | |
2784
+ 3 | Table default | Table default | |
2785
+ 4 | Table default | Table default | |
2786
+ 5 | Table default | Table default | |
2787
+ 6 | Table default | Table default | |
2788
+ 11 | View default | Table default | View default |
2789
+ 11 | View default | | View default |
2790
+ 12 | View default | Table default | View default |
2791
+ 12 | View default | | View default |
2792
+ 13 | View default | Table default | View default |
2793
+ 13 | View default | | View default |
2794
+ 14 | View default | Table default | View default |
2795
+ 14 | View default | | View default |
2796
+ 15 | View default | Table default | View default |
2797
+ 15 | View default | | View default |
2798
+ 16 | View default | Table default | View default |
2799
+ 16 | View default | | View default |
2800
+ (18 rows)
2801
+
2802
+ drop view base_tab_def_view;
2803
+ drop table base_tab_def;
0 commit comments