@@ -2811,14 +2811,26 @@ CREATE TABLE hat_data (
28112811);
28122812create unique index hat_data_unique_idx
28132813 on hat_data (hat_name COLLATE "C" bpchar_pattern_ops);
2814- -- okay
2814+ -- DO NOTHING with ON CONFLICT
28152815CREATE RULE hat_nosert AS ON INSERT TO hats
28162816 DO INSTEAD
28172817 INSERT INTO hat_data VALUES (
28182818 NEW.hat_name,
28192819 NEW.hat_color)
28202820 ON CONFLICT (hat_name COLLATE "C" bpchar_pattern_ops) WHERE hat_color = 'green'
2821- DO NOTHING RETURNING *;
2821+ DO NOTHING
2822+ RETURNING *;
2823+ SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename;
2824+ definition
2825+ ---------------------------------------------------------------------------------------------
2826+ CREATE RULE hat_nosert AS +
2827+ ON INSERT TO hats DO INSTEAD INSERT INTO hat_data (hat_name, hat_color) +
2828+ VALUES (new.hat_name, new.hat_color) ON CONFLICT(hat_name COLLATE "C" bpchar_pattern_ops)+
2829+ WHERE (hat_data.hat_color = 'green'::bpchar) DO NOTHING +
2830+ RETURNING hat_data.hat_name, +
2831+ hat_data.hat_color;
2832+ (1 row)
2833+
28222834-- Works (projects row)
28232835INSERT INTO hats VALUES ('h7', 'black') RETURNING *;
28242836 hat_name | hat_color
@@ -2845,6 +2857,34 @@ SELECT tablename, rulename, definition FROM pg_rules
28452857(1 row)
28462858
28472859DROP RULE hat_nosert ON hats;
2860+ -- DO NOTHING without ON CONFLICT
2861+ CREATE RULE hat_nosert_all AS ON INSERT TO hats
2862+ DO INSTEAD
2863+ INSERT INTO hat_data VALUES (
2864+ NEW.hat_name,
2865+ NEW.hat_color)
2866+ ON CONFLICT
2867+ DO NOTHING
2868+ RETURNING *;
2869+ SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename;
2870+ definition
2871+ ------------------------------------------------------------------------------
2872+ CREATE RULE hat_nosert_all AS +
2873+ ON INSERT TO hats DO INSTEAD INSERT INTO hat_data (hat_name, hat_color)+
2874+ VALUES (new.hat_name, new.hat_color) ON CONFLICT DO NOTHING +
2875+ RETURNING hat_data.hat_name, +
2876+ hat_data.hat_color;
2877+ (1 row)
2878+
2879+ DROP RULE hat_nosert_all ON hats;
2880+ -- Works (does nothing)
2881+ INSERT INTO hats VALUES ('h7', 'black') RETURNING *;
2882+ hat_name | hat_color
2883+ ------------+------------
2884+ h7 | black
2885+ (1 row)
2886+
2887+ -- DO UPDATE with a WHERE clause
28482888CREATE RULE hat_upsert AS ON INSERT TO hats
28492889 DO INSTEAD
28502890 INSERT INTO hat_data VALUES (
@@ -2855,6 +2895,17 @@ CREATE RULE hat_upsert AS ON INSERT TO hats
28552895 SET hat_name = hat_data.hat_name, hat_color = excluded.hat_color
28562896 WHERE excluded.hat_color <> 'forbidden'
28572897 RETURNING *;
2898+ SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename;
2899+ definition
2900+ -----------------------------------------------------------------------------------------------------------------------------------------
2901+ CREATE RULE hat_upsert AS +
2902+ ON INSERT TO hats DO INSTEAD INSERT INTO hat_data (hat_name, hat_color) +
2903+ VALUES (new.hat_name, new.hat_color) ON CONFLICT(hat_name) DO UPDATE SET hat_name = hat_data.hat_name, hat_color = excluded.hat_color+
2904+ WHERE (excluded.hat_color <> 'forbidden'::bpchar) +
2905+ RETURNING hat_data.hat_name, +
2906+ hat_data.hat_color;
2907+ (1 row)
2908+
28582909-- Works (does upsert)
28592910INSERT INTO hats VALUES ('h8', 'black') RETURNING *;
28602911 hat_name | hat_color
0 commit comments