@@ -2772,3 +2772,156 @@ drop view rw_view1;
2772
2772
drop table base_tbl;
2773
2773
drop user regress_view_user1;
2774
2774
drop user regress_view_user2;
2775
+ -- Test single- and multi-row inserts with table and view defaults.
2776
+ -- Table defaults should be used, unless overridden by view defaults.
2777
+ create table base_tab_def (a int, b text default 'Table default',
2778
+ c text default 'Table default', d text, e text);
2779
+ create view base_tab_def_view as select * from base_tab_def;
2780
+ alter view base_tab_def_view alter b set default 'View default';
2781
+ alter view base_tab_def_view alter d set default 'View default';
2782
+ insert into base_tab_def values (1);
2783
+ insert into base_tab_def values (2), (3);
2784
+ insert into base_tab_def values (4, default, default, default, default);
2785
+ insert into base_tab_def values (5, default, default, default, default),
2786
+ (6, default, default, default, default);
2787
+ insert into base_tab_def_view values (11);
2788
+ insert into base_tab_def_view values (12), (13);
2789
+ insert into base_tab_def_view values (14, default, default, default, default);
2790
+ insert into base_tab_def_view values (15, default, default, default, default),
2791
+ (16, default, default, default, default);
2792
+ select * from base_tab_def order by a;
2793
+ a | b | c | d | e
2794
+ ----+---------------+---------------+--------------+---
2795
+ 1 | Table default | Table default | |
2796
+ 2 | Table default | Table default | |
2797
+ 3 | Table default | Table default | |
2798
+ 4 | Table default | Table default | |
2799
+ 5 | Table default | Table default | |
2800
+ 6 | Table default | Table default | |
2801
+ 11 | View default | Table default | View default |
2802
+ 12 | View default | Table default | View default |
2803
+ 13 | View default | Table default | View default |
2804
+ 14 | View default | Table default | View default |
2805
+ 15 | View default | Table default | View default |
2806
+ 16 | View default | Table default | View default |
2807
+ (12 rows)
2808
+
2809
+ -- Adding an INSTEAD OF trigger should cause NULLs to be inserted instead of
2810
+ -- table defaults, where there are no view defaults.
2811
+ create function base_tab_def_view_instrig_func() returns trigger
2812
+ as
2813
+ $$
2814
+ begin
2815
+ insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2816
+ return new;
2817
+ end;
2818
+ $$
2819
+ language plpgsql;
2820
+ create trigger base_tab_def_view_instrig instead of insert on base_tab_def_view
2821
+ for each row execute function base_tab_def_view_instrig_func();
2822
+ truncate base_tab_def;
2823
+ insert into base_tab_def values (1);
2824
+ insert into base_tab_def values (2), (3);
2825
+ insert into base_tab_def values (4, default, default, default, default);
2826
+ insert into base_tab_def values (5, default, default, default, default),
2827
+ (6, default, default, default, default);
2828
+ insert into base_tab_def_view values (11);
2829
+ insert into base_tab_def_view values (12), (13);
2830
+ insert into base_tab_def_view values (14, default, default, default, default);
2831
+ insert into base_tab_def_view values (15, default, default, default, default),
2832
+ (16, default, default, default, default);
2833
+ select * from base_tab_def order by a;
2834
+ a | b | c | d | e
2835
+ ----+---------------+---------------+--------------+---
2836
+ 1 | Table default | Table default | |
2837
+ 2 | Table default | Table default | |
2838
+ 3 | Table default | Table default | |
2839
+ 4 | Table default | Table default | |
2840
+ 5 | Table default | Table default | |
2841
+ 6 | Table default | Table default | |
2842
+ 11 | View default | | View default |
2843
+ 12 | View default | | View default |
2844
+ 13 | View default | | View default |
2845
+ 14 | View default | | View default |
2846
+ 15 | View default | | View default |
2847
+ 16 | View default | | View default |
2848
+ (12 rows)
2849
+
2850
+ -- Using an unconditional DO INSTEAD rule should also cause NULLs to be
2851
+ -- inserted where there are no view defaults.
2852
+ drop trigger base_tab_def_view_instrig on base_tab_def_view;
2853
+ drop function base_tab_def_view_instrig_func;
2854
+ create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view
2855
+ do instead insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2856
+ truncate base_tab_def;
2857
+ insert into base_tab_def values (1);
2858
+ insert into base_tab_def values (2), (3);
2859
+ insert into base_tab_def values (4, default, default, default, default);
2860
+ insert into base_tab_def values (5, default, default, default, default),
2861
+ (6, default, default, default, default);
2862
+ insert into base_tab_def_view values (11);
2863
+ insert into base_tab_def_view values (12), (13);
2864
+ insert into base_tab_def_view values (14, default, default, default, default);
2865
+ insert into base_tab_def_view values (15, default, default, default, default),
2866
+ (16, default, default, default, default);
2867
+ select * from base_tab_def order by a;
2868
+ a | b | c | d | e
2869
+ ----+---------------+---------------+--------------+---
2870
+ 1 | Table default | Table default | |
2871
+ 2 | Table default | Table default | |
2872
+ 3 | Table default | Table default | |
2873
+ 4 | Table default | Table default | |
2874
+ 5 | Table default | Table default | |
2875
+ 6 | Table default | Table default | |
2876
+ 11 | View default | | View default |
2877
+ 12 | View default | | View default |
2878
+ 13 | View default | | View default |
2879
+ 14 | View default | | View default |
2880
+ 15 | View default | | View default |
2881
+ 16 | View default | | View default |
2882
+ (12 rows)
2883
+
2884
+ -- A DO ALSO rule should cause each row to be inserted twice. The first
2885
+ -- insert should behave the same as an auto-updatable view (using table
2886
+ -- defaults, unless overridden by view defaults). The second insert should
2887
+ -- behave the same as a rule-updatable view (inserting NULLs where there are
2888
+ -- no view defaults).
2889
+ drop rule base_tab_def_view_ins_rule on base_tab_def_view;
2890
+ create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view
2891
+ do also insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2892
+ truncate base_tab_def;
2893
+ insert into base_tab_def values (1);
2894
+ insert into base_tab_def values (2), (3);
2895
+ insert into base_tab_def values (4, default, default, default, default);
2896
+ insert into base_tab_def values (5, default, default, default, default),
2897
+ (6, default, default, default, default);
2898
+ insert into base_tab_def_view values (11);
2899
+ insert into base_tab_def_view values (12), (13);
2900
+ insert into base_tab_def_view values (14, default, default, default, default);
2901
+ insert into base_tab_def_view values (15, default, default, default, default),
2902
+ (16, default, default, default, default);
2903
+ select * from base_tab_def order by a, c NULLS LAST;
2904
+ a | b | c | d | e
2905
+ ----+---------------+---------------+--------------+---
2906
+ 1 | Table default | Table default | |
2907
+ 2 | Table default | Table default | |
2908
+ 3 | Table default | Table default | |
2909
+ 4 | Table default | Table default | |
2910
+ 5 | Table default | Table default | |
2911
+ 6 | Table default | Table default | |
2912
+ 11 | View default | Table default | View default |
2913
+ 11 | View default | | View default |
2914
+ 12 | View default | Table default | View default |
2915
+ 12 | View default | | View default |
2916
+ 13 | View default | Table default | View default |
2917
+ 13 | View default | | View default |
2918
+ 14 | View default | Table default | View default |
2919
+ 14 | View default | | View default |
2920
+ 15 | View default | Table default | View default |
2921
+ 15 | View default | | View default |
2922
+ 16 | View default | Table default | View default |
2923
+ 16 | View default | | View default |
2924
+ (18 rows)
2925
+
2926
+ drop view base_tab_def_view;
2927
+ drop table base_tab_def;
0 commit comments