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