@@ -2403,3 +2403,156 @@ ERROR: new row violates WITH CHECK OPTION for view "v1"
2403
2403
DETAIL: Failing row contains (-1, invalid).
2404
2404
DROP VIEW v1;
2405
2405
DROP TABLE t1;
2406
+ -- Test single- and multi-row inserts with table and view defaults.
2407
+ -- Table defaults should be used, unless overridden by view defaults.
2408
+ create table base_tab_def (a int, b text default 'Table default',
2409
+ c text default 'Table default', d text, e text);
2410
+ create view base_tab_def_view as select * from base_tab_def;
2411
+ alter view base_tab_def_view alter b set default 'View default';
2412
+ alter view base_tab_def_view alter d set default 'View default';
2413
+ insert into base_tab_def values (1);
2414
+ insert into base_tab_def values (2), (3);
2415
+ insert into base_tab_def values (4, default, default, default, default);
2416
+ insert into base_tab_def values (5, default, default, default, default),
2417
+ (6, default, default, default, default);
2418
+ insert into base_tab_def_view values (11);
2419
+ insert into base_tab_def_view values (12), (13);
2420
+ insert into base_tab_def_view values (14, default, default, default, default);
2421
+ insert into base_tab_def_view values (15, default, default, default, default),
2422
+ (16, default, default, default, default);
2423
+ select * from base_tab_def order by a;
2424
+ a | b | c | d | e
2425
+ ----+---------------+---------------+--------------+---
2426
+ 1 | Table default | Table default | |
2427
+ 2 | Table default | Table default | |
2428
+ 3 | Table default | Table default | |
2429
+ 4 | Table default | Table default | |
2430
+ 5 | Table default | Table default | |
2431
+ 6 | Table default | Table default | |
2432
+ 11 | View default | Table default | View default |
2433
+ 12 | View default | Table default | View default |
2434
+ 13 | View default | Table default | View default |
2435
+ 14 | View default | Table default | View default |
2436
+ 15 | View default | Table default | View default |
2437
+ 16 | View default | Table default | View default |
2438
+ (12 rows)
2439
+
2440
+ -- Adding an INSTEAD OF trigger should cause NULLs to be inserted instead of
2441
+ -- table defaults, where there are no view defaults.
2442
+ create function base_tab_def_view_instrig_func() returns trigger
2443
+ as
2444
+ $$
2445
+ begin
2446
+ insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2447
+ return new;
2448
+ end;
2449
+ $$
2450
+ language plpgsql;
2451
+ create trigger base_tab_def_view_instrig instead of insert on base_tab_def_view
2452
+ for each row execute procedure base_tab_def_view_instrig_func();
2453
+ truncate base_tab_def;
2454
+ insert into base_tab_def values (1);
2455
+ insert into base_tab_def values (2), (3);
2456
+ insert into base_tab_def values (4, default, default, default, default);
2457
+ insert into base_tab_def values (5, default, default, default, default),
2458
+ (6, default, default, default, default);
2459
+ insert into base_tab_def_view values (11);
2460
+ insert into base_tab_def_view values (12), (13);
2461
+ insert into base_tab_def_view values (14, default, default, default, default);
2462
+ insert into base_tab_def_view values (15, default, default, default, default),
2463
+ (16, default, default, default, default);
2464
+ select * from base_tab_def order by a;
2465
+ a | b | c | d | e
2466
+ ----+---------------+---------------+--------------+---
2467
+ 1 | Table default | Table default | |
2468
+ 2 | Table default | Table default | |
2469
+ 3 | Table default | Table default | |
2470
+ 4 | Table default | Table default | |
2471
+ 5 | Table default | Table default | |
2472
+ 6 | Table default | Table default | |
2473
+ 11 | View default | | View default |
2474
+ 12 | View default | | View default |
2475
+ 13 | View default | | View default |
2476
+ 14 | View default | | View default |
2477
+ 15 | View default | | View default |
2478
+ 16 | View default | | View default |
2479
+ (12 rows)
2480
+
2481
+ -- Using an unconditional DO INSTEAD rule should also cause NULLs to be
2482
+ -- inserted where there are no view defaults.
2483
+ drop trigger base_tab_def_view_instrig on base_tab_def_view;
2484
+ drop function base_tab_def_view_instrig_func();
2485
+ create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view
2486
+ do instead insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2487
+ truncate base_tab_def;
2488
+ insert into base_tab_def values (1);
2489
+ insert into base_tab_def values (2), (3);
2490
+ insert into base_tab_def values (4, default, default, default, default);
2491
+ insert into base_tab_def values (5, default, default, default, default),
2492
+ (6, default, default, default, default);
2493
+ insert into base_tab_def_view values (11);
2494
+ insert into base_tab_def_view values (12), (13);
2495
+ insert into base_tab_def_view values (14, default, default, default, default);
2496
+ insert into base_tab_def_view values (15, default, default, default, default),
2497
+ (16, default, default, default, default);
2498
+ select * from base_tab_def order by a;
2499
+ a | b | c | d | e
2500
+ ----+---------------+---------------+--------------+---
2501
+ 1 | Table default | Table default | |
2502
+ 2 | Table default | Table default | |
2503
+ 3 | Table default | Table default | |
2504
+ 4 | Table default | Table default | |
2505
+ 5 | Table default | Table default | |
2506
+ 6 | Table default | Table default | |
2507
+ 11 | View default | | View default |
2508
+ 12 | View default | | View default |
2509
+ 13 | View default | | View default |
2510
+ 14 | View default | | View default |
2511
+ 15 | View default | | View default |
2512
+ 16 | View default | | View default |
2513
+ (12 rows)
2514
+
2515
+ -- A DO ALSO rule should cause each row to be inserted twice. The first
2516
+ -- insert should behave the same as an auto-updatable view (using table
2517
+ -- defaults, unless overridden by view defaults). The second insert should
2518
+ -- behave the same as a rule-updatable view (inserting NULLs where there are
2519
+ -- no view defaults).
2520
+ drop rule base_tab_def_view_ins_rule on base_tab_def_view;
2521
+ create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view
2522
+ do also insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e);
2523
+ truncate base_tab_def;
2524
+ insert into base_tab_def values (1);
2525
+ insert into base_tab_def values (2), (3);
2526
+ insert into base_tab_def values (4, default, default, default, default);
2527
+ insert into base_tab_def values (5, default, default, default, default),
2528
+ (6, default, default, default, default);
2529
+ insert into base_tab_def_view values (11);
2530
+ insert into base_tab_def_view values (12), (13);
2531
+ insert into base_tab_def_view values (14, default, default, default, default);
2532
+ insert into base_tab_def_view values (15, default, default, default, default),
2533
+ (16, default, default, default, default);
2534
+ select * from base_tab_def order by a, c NULLS LAST;
2535
+ a | b | c | d | e
2536
+ ----+---------------+---------------+--------------+---
2537
+ 1 | Table default | Table default | |
2538
+ 2 | Table default | Table default | |
2539
+ 3 | Table default | Table default | |
2540
+ 4 | Table default | Table default | |
2541
+ 5 | Table default | Table default | |
2542
+ 6 | Table default | Table default | |
2543
+ 11 | View default | Table default | View default |
2544
+ 11 | View default | | View default |
2545
+ 12 | View default | Table default | View default |
2546
+ 12 | View default | | View default |
2547
+ 13 | View default | Table default | View default |
2548
+ 13 | View default | | View default |
2549
+ 14 | View default | Table default | View default |
2550
+ 14 | View default | | View default |
2551
+ 15 | View default | Table default | View default |
2552
+ 15 | View default | | View default |
2553
+ 16 | View default | Table default | View default |
2554
+ 16 | View default | | View default |
2555
+ (18 rows)
2556
+
2557
+ drop view base_tab_def_view;
2558
+ drop table base_tab_def;
0 commit comments