xref: /sqlite-3.40.0/test/upsert4.test (revision 42d18160)
12cc00423Sdan# 2018-04-17
22cc00423Sdan#
32cc00423Sdan# The author disclaims copyright to this source code.  In place of
42cc00423Sdan# a legal notice, here is a blessing:
52cc00423Sdan#
62cc00423Sdan#    May you do good and not evil.
72cc00423Sdan#    May you find forgiveness for yourself and forgive others.
82cc00423Sdan#    May you share freely, never taking more than you give.
92cc00423Sdan#
102cc00423Sdan#***********************************************************************
112cc00423Sdan#
122cc00423Sdan# Test cases for UPSERT
132cc00423Sdan
142cc00423Sdanset testdir [file dirname $argv0]
152cc00423Sdansource $testdir/tester.tcl
16370c3262Sdanset testprefix upsert4
172cc00423Sdan
182cc00423Sdanforeach {tn sql} {
192cc00423Sdan  1 { CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c UNIQUE) }
202cc00423Sdan  2 { CREATE TABLE t1(a INT PRIMARY KEY, b, c UNIQUE) }
212cc00423Sdan  3 { CREATE TABLE t1(a INT PRIMARY KEY, b, c UNIQUE) WITHOUT ROWID}
222cc00423Sdan} {
232cc00423Sdan  reset_db
242cc00423Sdan  execsql $sql
252cc00423Sdan
262cc00423Sdan  do_execsql_test 1.$tn.0 {
272cc00423Sdan    INSERT INTO t1 VALUES(1, NULL, 'one');
282cc00423Sdan    INSERT INTO t1 VALUES(2, NULL, 'two');
292cc00423Sdan    INSERT INTO t1 VALUES(3, NULL, 'three');
302cc00423Sdan  }
312cc00423Sdan
322cc00423Sdan  do_execsql_test 1.$tn.1 {
332cc00423Sdan    INSERT INTO t1 VALUES(1, NULL, 'xyz') ON CONFLICT DO NOTHING;
342cc00423Sdan    SELECT * FROM t1;
352cc00423Sdan  } {
362cc00423Sdan    1 {} one 2 {} two 3 {} three
372cc00423Sdan  }
382cc00423Sdan
392cc00423Sdan  do_execsql_test 1.$tn.2 {
402cc00423Sdan    INSERT INTO t1 VALUES(4, NULL, 'two') ON CONFLICT DO NOTHING;
412cc00423Sdan    SELECT * FROM t1;
422cc00423Sdan  } {
432cc00423Sdan    1 {} one 2 {} two 3 {} three
442cc00423Sdan  }
452cc00423Sdan
462cc00423Sdan  do_execsql_test 1.$tn.3 {
472cc00423Sdan    INSERT INTO t1 VALUES(4, NULL, 'two') ON CONFLICT (c) DO UPDATE SET b = 1;
482cc00423Sdan    SELECT * FROM t1;
492cc00423Sdan  } {
502cc00423Sdan    1 {} one 2 1 two 3 {} three
512cc00423Sdan  }
522cc00423Sdan
532cc00423Sdan  do_execsql_test 1.$tn.4 {
542cc00423Sdan    INSERT INTO t1 VALUES(2, NULL, 'zero') ON CONFLICT (a) DO UPDATE SET b=2;
552cc00423Sdan    SELECT * FROM t1;
562cc00423Sdan  } {1 {} one 2 2 two 3 {} three}
572cc00423Sdan
582cc00423Sdan  do_catchsql_test 1.$tn.5 {
592cc00423Sdan    INSERT INTO t1 VALUES(2, NULL, 'zero') ON CONFLICT (a)
602cc00423Sdan      DO UPDATE SET c = 'one';
612cc00423Sdan  } {1 {UNIQUE constraint failed: t1.c}}
622cc00423Sdan
632cc00423Sdan  do_execsql_test 1.$tn.6 {
642cc00423Sdan    SELECT * FROM t1;
652cc00423Sdan  } {1 {} one 2 2 two 3 {} three}
66370c3262Sdan
67370c3262Sdan  do_execsql_test 1.$tn.7 {
68370c3262Sdan    INSERT INTO t1 VALUES(2, NULL, 'zero') ON CONFLICT (a)
69370c3262Sdan      DO UPDATE SET (b, c) = (SELECT 'x', 'y');
70370c3262Sdan    SELECT * FROM t1;
71370c3262Sdan  } {1 {} one 2 x y 3 {} three}
72370c3262Sdan
73370c3262Sdan  do_execsql_test 1.$tn.8 {
74370c3262Sdan    INSERT INTO t1 VALUES(1, NULL, NULL) ON CONFLICT (a)
75370c3262Sdan      DO UPDATE SET (c, a) = ('four', 4);
76370c3262Sdan    SELECT * FROM t1 ORDER BY 1;
77370c3262Sdan  } {2 x y 3 {} three 4 {} four}
782cc00423Sdan}
792cc00423Sdan
80370c3262Sdan#-------------------------------------------------------------------------
81370c3262Sdan# Test target analysis.
82370c3262Sdan#
83370c3262Sdanset rtbl(0) {0 {}}
84370c3262Sdanset rtbl(1) {/1 .*failed.*/}
85370c3262Sdanset rtbl(2) {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
86370c3262Sdan
87370c3262Sdanforeach {tn sql} {
88370c3262Sdan  1 {
89370c3262Sdan      CREATE TABLE xyz(a INTEGER PRIMARY KEY, b, c, d);
90370c3262Sdan      CREATE UNIQUE INDEX xyz1 ON xyz(d, c, b COLLATE nocase);
91370c3262Sdan  }
92370c3262Sdan
93370c3262Sdan  2 {
94370c3262Sdan      CREATE TABLE xyz(a INT PRIMARY KEY, b, c, d);
95370c3262Sdan      CREATE UNIQUE INDEX xyz1 ON xyz(d, c, b COLLATE nocase);
96370c3262Sdan  }
97370c3262Sdan
98370c3262Sdan  3 {
99370c3262Sdan      CREATE TABLE xyz(a INT PRIMARY KEY, b, c, d) WITHOUT ROWID;
100370c3262Sdan      CREATE UNIQUE INDEX xyz1 ON xyz(d, c, b COLLATE nocase);
101370c3262Sdan  }
102370c3262Sdan} {
103370c3262Sdan  reset_db
104370c3262Sdan  execsql $sql
105370c3262Sdan  do_execsql_test 2.$tn.1 {
106370c3262Sdan    INSERT INTO xyz VALUES(10, 1, 1, 'one');
107370c3262Sdan  }
108370c3262Sdan
109370c3262Sdan
110370c3262Sdan  foreach {tn2 oc res} {
111370c3262Sdan    1 "ON CONFLICT (b COLLATE nocase, c, d) DO NOTHING"   0
112370c3262Sdan    2 "ON CONFLICT (b, c, d) DO NOTHING"                  0
113370c3262Sdan    3 "ON CONFLICT (b, c COLLATE nocase, d) DO NOTHING"   2
114370c3262Sdan    4 "ON CONFLICT (a) DO NOTHING"                        1
115370c3262Sdan    5 "ON CONFLICT DO NOTHING"                            0
116370c3262Sdan    6 "ON CONFLICT (b, c, d) WHERE a!=0 DO NOTHING"       0
117370c3262Sdan    7 "ON CONFLICT (d, c, c) WHERE a!=0 DO NOTHING"       2
11852b3e340Sdan    8 "ON CONFLICT (b COLLATE nocase, c COLLATE nocase, d) DO NOTHING"   2
119a46838cbSdan    9 "ON CONFLICT (b, c, d) WHERE b==45 DO NOTHING"      0
120370c3262Sdan  } {
121370c3262Sdan
122370c3262Sdan    do_catchsql_test 2.$tn.2.$tn2 "
123370c3262Sdan      INSERT INTO xyz VALUES(11, 1, 1, 'one') $oc
124370c3262Sdan    " $rtbl($res)
125370c3262Sdan  }
126370c3262Sdan
127370c3262Sdan  do_execsql_test 2.$tn.3 {
128370c3262Sdan    SELECT * FROM xyz;
129370c3262Sdan  } {10 1 1 one}
130370c3262Sdan}
131370c3262Sdan
132370c3262Sdanforeach {tn sql} {
133370c3262Sdan  1 {
134370c3262Sdan    CREATE TABLE abc(a INTEGER PRIMARY KEY, x, y);
135370c3262Sdan    CREATE UNIQUE INDEX abc1 ON abc(('x' || x) COLLATE nocase);
136370c3262Sdan  }
137370c3262Sdan  2 {
138370c3262Sdan    CREATE TABLE abc(a INT PRIMARY KEY, x, y);
139370c3262Sdan    CREATE UNIQUE INDEX abc1 ON abc(('x' || x) COLLATE nocase);
140370c3262Sdan  }
141370c3262Sdan  3 {
142370c3262Sdan    CREATE TABLE abc(a INT PRIMARY KEY, x, y) WITHOUT ROWID;
143370c3262Sdan    CREATE UNIQUE INDEX abc1 ON abc(('x' || x) COLLATE nocase);
144370c3262Sdan  }
145370c3262Sdan} {
146370c3262Sdan  reset_db
147370c3262Sdan  execsql $sql
148a46838cbSdan  do_execsql_test 3.$tn.1 {
149370c3262Sdan    INSERT INTO abc VALUES(1, 'one', 'two');
150370c3262Sdan  }
151370c3262Sdan
152370c3262Sdan  foreach {tn2 oc res} {
153370c3262Sdan    1 "ON CONFLICT DO NOTHING"                             0
154370c3262Sdan    2 "ON CONFLICT ('x' || x) DO NOTHING"                  0
155370c3262Sdan    3 "ON CONFLICT (('x' || x) COLLATE nocase) DO NOTHING" 0
156370c3262Sdan    4 "ON CONFLICT (('x' || x) COLLATE binary) DO NOTHING" 2
157370c3262Sdan    5 "ON CONFLICT (x || 'x') DO NOTHING"                  2
158370c3262Sdan    6 "ON CONFLICT ((('x' || x))) DO NOTHING"              0
159370c3262Sdan  } {
160a46838cbSdan    do_catchsql_test 3.$tn.2.$tn2 "
161370c3262Sdan      INSERT INTO abc VALUES(2, 'one', NULL) $oc;
162370c3262Sdan    " $rtbl($res)
163370c3262Sdan  }
164370c3262Sdan
165a46838cbSdan  do_execsql_test 3.$tn.3 {
166370c3262Sdan    SELECT * FROM abc
167370c3262Sdan  } {1 one two}
168370c3262Sdan}
169370c3262Sdan
170a46838cbSdanforeach {tn sql} {
171a46838cbSdan  1 {
172a46838cbSdan    CREATE TABLE abc(a INTEGER PRIMARY KEY, x, y);
173a46838cbSdan    CREATE UNIQUE INDEX abc1 ON abc(x) WHERE y>0;
174a46838cbSdan    CREATE UNIQUE INDEX abc2 ON abc(y) WHERE x='xyz' COLLATE nocase;
175a46838cbSdan  }
176a46838cbSdan} {
177a46838cbSdan  reset_db
178a46838cbSdan  execsql $sql
179a46838cbSdan  do_execsql_test 4.$tn.1 {
180a46838cbSdan    INSERT INTO abc VALUES(1, 'one', 1);
181a46838cbSdan    INSERT INTO abc VALUES(2, 'two', 2);
182a46838cbSdan    INSERT INTO abc VALUES(3, 'xyz', 3);
183a46838cbSdan    INSERT INTO abc VALUES(4, 'XYZ', 4);
184a46838cbSdan  }
185a46838cbSdan
186a46838cbSdan  foreach {tn2 oc res} {
187a46838cbSdan    1 "ON CONFLICT DO NOTHING"                                 0
188a46838cbSdan    2 "ON CONFLICT(x) WHERE y>0 DO NOTHING"                    0
189a46838cbSdan    3 "ON CONFLICT(x) DO NOTHING"                              2
190a46838cbSdan    4 "ON CONFLICT(x) WHERE y>=0 DO NOTHING"                   2
191a46838cbSdan    5 "ON CONFLICT(y) WHERE x='xyz' COLLATE nocase DO NOTHING" 1
192a46838cbSdan  } {
193a46838cbSdan    do_catchsql_test 4.$tn.2.$tn2 "
194a46838cbSdan      INSERT INTO abc VALUES(5, 'one', 10) $oc
195a46838cbSdan    " $rtbl($res)
196a46838cbSdan  }
197a46838cbSdan
198a46838cbSdan  do_execsql_test 4.$tn.3 {
199a46838cbSdan    SELECT * FROM abc
200a46838cbSdan  } {1 one 1 2 two 2 3 xyz 3 4 XYZ 4}
201a46838cbSdan
202a46838cbSdan  foreach {tn2 oc res} {
203a46838cbSdan    1 "ON CONFLICT DO NOTHING"                                 0
204a46838cbSdan    2 "ON CONFLICT(y) WHERE x='xyz' COLLATE nocase DO NOTHING" 0
205a46838cbSdan    3 "ON CONFLICT(y) WHERE x='xyz' COLLATE binary DO NOTHING" 2
206a46838cbSdan    4 "ON CONFLICT(x) WHERE y>0 DO NOTHING"                    1
207a46838cbSdan  } {
208a46838cbSdan    do_catchsql_test 4.$tn.2.$tn2 "
209a46838cbSdan      INSERT INTO abc VALUES(5, 'xYz', 3) $oc
210a46838cbSdan    " $rtbl($res)
211a46838cbSdan  }
212a46838cbSdan}
213a46838cbSdan
214a46838cbSdando_catchsql_test 5.0 {
21552b3e340Sdan  CREATE TABLE w1(a INT PRIMARY KEY, x, y);
21652b3e340Sdan  CREATE UNIQUE INDEX w1expr ON w1(('x' || x));
21752b3e340Sdan  INSERT INTO w1 VALUES(2, 'one', NULL)
21852b3e340Sdan    ON CONFLICT (('x' || x) COLLATE nocase) DO NOTHING;
21952b3e340Sdan} {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
220370c3262Sdan
221a46838cbSdan#-------------------------------------------------------------------------
222224d92c8Sdan# Test that ON CONFLICT constraint processing occurs before any REPLACE
223224d92c8Sdan# constraint processing.
224a46838cbSdan#
225224d92c8Sdanforeach {tn sql} {
226224d92c8Sdan  1 {
227a46838cbSdan    CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE, c);
228224d92c8Sdan  }
229224d92c8Sdan  2 {
230224d92c8Sdan    CREATE TABLE t1(a INT PRIMARY KEY, b UNIQUE, c);
231224d92c8Sdan  }
232224d92c8Sdan  3 {
233224d92c8Sdan    CREATE TABLE t1(a INT PRIMARY KEY, b UNIQUE, c) WITHOUT ROWID;
234224d92c8Sdan  }
235224d92c8Sdan} {
236224d92c8Sdan  reset_db
237224d92c8Sdan  execsql $sql
238224d92c8Sdan  do_execsql_test 6.1.$tn {
239a46838cbSdan    INSERT INTO t1 VALUES(1, 1, 'one');
240a46838cbSdan    INSERT INTO t1 VALUES(2, 2, 'two');
241a46838cbSdan    INSERT OR REPLACE INTO t1 VALUES(1, 2, 'two') ON CONFLICT(b) DO NOTHING;
242a46838cbSdan    PRAGMA integrity_check;
243a46838cbSdan  } {ok}
244224d92c8Sdan}
245224d92c8Sdan
246224d92c8Sdanforeach {tn sql} {
247224d92c8Sdan  1 {
248224d92c8Sdan    CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE, c UNIQUE);
249224d92c8Sdan  }
250224d92c8Sdan} {
251224d92c8Sdan  reset_db
252224d92c8Sdan  execsql $sql
253224d92c8Sdan
254224d92c8Sdan  do_execsql_test 6.2.$tn.1 {
255224d92c8Sdan    INSERT INTO t1 VALUES(1, 1, 1);
256224d92c8Sdan    INSERT INTO t1 VALUES(2, 2, 2);
257224d92c8Sdan  }
258224d92c8Sdan
259224d92c8Sdan  do_execsql_test 6.2.$tn.2 {
260224d92c8Sdan    INSERT OR REPLACE INTO t1 VALUES(3, 1, 1) ON CONFLICT(b) DO NOTHING;
261224d92c8Sdan    SELECT * FROM t1;
262224d92c8Sdan    PRAGMA integrity_check;
263224d92c8Sdan  } {1 1 1 2 2 2 ok}
264224d92c8Sdan
265224d92c8Sdan  do_execsql_test 6.2.$tn.3 {
266224d92c8Sdan    INSERT OR REPLACE INTO t1 VALUES(3, 2, 2) ON CONFLICT(c) DO NOTHING;
267224d92c8Sdan    SELECT * FROM t1;
268224d92c8Sdan    PRAGMA integrity_check;
269224d92c8Sdan  } {1 1 1 2 2 2 ok}
270224d92c8Sdan
271224d92c8Sdan  do_execsql_test 6.2.$tn.2 {
272224d92c8Sdan    INSERT OR REPLACE INTO t1 VALUES(3, 1, 1) ON CONFLICT(b)
273224d92c8Sdan      DO UPDATE SET b=b||'x';
274224d92c8Sdan    SELECT * FROM t1;
275224d92c8Sdan    PRAGMA integrity_check;
276224d92c8Sdan  } {1 1x 1 2 2 2 ok}
277224d92c8Sdan
278224d92c8Sdan  do_execsql_test 6.2.$tn.2 {
279224d92c8Sdan    INSERT OR REPLACE INTO t1 VALUES(3, 2, 2) ON CONFLICT(c)
280224d92c8Sdan      DO UPDATE SET c=c||'x';
281224d92c8Sdan    SELECT * FROM t1;
282224d92c8Sdan    PRAGMA integrity_check;
283224d92c8Sdan  } {1 1x 1 2 2 2x ok}
284224d92c8Sdan}
285224d92c8Sdan
286224d92c8Sdan#-------------------------------------------------------------------------
287224d92c8Sdan# Test references to "excluded". And using an alias in an INSERT
288224d92c8Sdan# statement.
289224d92c8Sdan#
290224d92c8Sdanforeach {tn sql} {
291224d92c8Sdan  1 {
292224d92c8Sdan    CREATE TABLE t1(w, x, y, z, PRIMARY KEY(x, y));
293224d92c8Sdan    CREATE UNIQUE INDEX zz ON t1(z);
294224d92c8Sdan  }
295224d92c8Sdan  2 {
296224d92c8Sdan    CREATE TABLE t1(w, x, y, z, PRIMARY KEY(x, y)) WITHOUT ROWID;
297224d92c8Sdan    CREATE UNIQUE INDEX zz ON t1(z);
298224d92c8Sdan  }
299224d92c8Sdan} {
300224d92c8Sdan  reset_db
301224d92c8Sdan  execsql $sql
302224d92c8Sdan  do_execsql_test 7.$tn.0 {
303224d92c8Sdan    INSERT INTO t1 VALUES('a', 1, 1, 1);
304224d92c8Sdan    INSERT INTO t1 VALUES('b', 2, 2, 2);
305224d92c8Sdan  }
306224d92c8Sdan
307224d92c8Sdan  do_execsql_test 7.$tn.1 {
308224d92c8Sdan    INSERT INTO t1 VALUES('c', 3, 3, 1) ON CONFLICT(z)
309224d92c8Sdan      DO UPDATE SET w = excluded.w;
310224d92c8Sdan    SELECT * FROM t1;
311224d92c8Sdan  } {c 1 1 1 b 2 2 2}
312224d92c8Sdan
313224d92c8Sdan  do_execsql_test 7.$tn.2 {
314224d92c8Sdan    INSERT INTO t1 VALUES('c', 2, 2, 3) ON CONFLICT(y, x)
315224d92c8Sdan      DO UPDATE SET w = w||w;
316224d92c8Sdan    SELECT * FROM t1;
317224d92c8Sdan  } {c 1 1 1 bb 2 2 2}
318224d92c8Sdan
319224d92c8Sdan  do_execsql_test 7.$tn.3 {
320224d92c8Sdan    INSERT INTO t1 VALUES('c', 2, 2, 3) ON CONFLICT(y, x)
321224d92c8Sdan      DO UPDATE SET w = w||t1.w;
322224d92c8Sdan    SELECT * FROM t1;
323224d92c8Sdan  } {c 1 1 1 bbbb 2 2 2}
324224d92c8Sdan
325224d92c8Sdan  do_execsql_test 7.$tn.4 {
326224d92c8Sdan    INSERT INTO t1 AS tbl VALUES('c', 2, 2, 3) ON CONFLICT(y, x)
327224d92c8Sdan      DO UPDATE SET w = w||tbl.w;
328224d92c8Sdan    SELECT * FROM t1;
329224d92c8Sdan  } {c 1 1 1 bbbbbbbb 2 2 2}
330224d92c8Sdan}
331224d92c8Sdan
332224d92c8Sdanforeach {tn sql} {
333224d92c8Sdan  1 {
334*42d18160Sdan    CREATE TABLE excluded(w, x INTEGER, 'a b', z, PRIMARY KEY(x, 'a b'));
335224d92c8Sdan    CREATE UNIQUE INDEX zz ON excluded(z);
336*42d18160Sdan    CREATE INDEX zz2 ON excluded(z);
337224d92c8Sdan  }
338224d92c8Sdan  2 {
339224d92c8Sdan    CREATE TABLE excluded(w, x, 'a b', z, PRIMARY KEY(x, 'a b')) WITHOUT ROWID;
340224d92c8Sdan    CREATE UNIQUE INDEX zz ON excluded(z);
341*42d18160Sdan    CREATE INDEX zz2 ON excluded(z);
342224d92c8Sdan  }
343224d92c8Sdan} {
344224d92c8Sdan  reset_db
345224d92c8Sdan  execsql $sql
346224d92c8Sdan  do_execsql_test 8.$tn.0 {
347224d92c8Sdan    INSERT INTO excluded VALUES('a', 1, 1, 1);
348224d92c8Sdan    INSERT INTO excluded VALUES('b', 2, 2, 2);
349224d92c8Sdan  }
350224d92c8Sdan
351224d92c8Sdan  # Note: An error in Postgres: "table reference "excluded" is ambiguous".
352224d92c8Sdan  #
353224d92c8Sdan  do_execsql_test 8.$tn.1 {
354224d92c8Sdan    INSERT INTO excluded VALUES('hello', 1, 1, NULL) ON CONFLICT(x, "a b")
355224d92c8Sdan      DO UPDATE SET w=excluded.w;
356224d92c8Sdan    SELECT * FROM excluded;
357224d92c8Sdan  } {a 1 1 1 b 2 2 2}
358224d92c8Sdan
359224d92c8Sdan  do_execsql_test 8.$tn.2 {
360224d92c8Sdan    INSERT INTO excluded AS x1 VALUES('hello', 1, 1, NULL) ON CONFLICT(x, [a b])
361224d92c8Sdan      DO UPDATE SET w=excluded.w;
362224d92c8Sdan    SELECT * FROM excluded;
363224d92c8Sdan  } {hello 1 1 1 b 2 2 2}
364*42d18160Sdan
365*42d18160Sdan  do_execsql_test 8.$tn.3 {
366*42d18160Sdan    INSERT INTO excluded AS x1 VALUES('hello', 1, 1, NULL) ON CONFLICT(x, [a b])
367*42d18160Sdan      DO UPDATE SET w=w||w WHERE excluded.w!='hello';
368*42d18160Sdan    SELECT * FROM excluded;
369*42d18160Sdan  } {hello 1 1 1 b 2 2 2}
370*42d18160Sdan
371*42d18160Sdan  do_execsql_test 8.$tn.4 {
372*42d18160Sdan    INSERT INTO excluded AS x1 VALUES('hello', 1, 1, NULL) ON CONFLICT(x, [a b])
373*42d18160Sdan      DO UPDATE SET w=w||w WHERE excluded.x=1;
374*42d18160Sdan    SELECT * FROM excluded;
375*42d18160Sdan  } {hellohello 1 1 1 b 2 2 2}
376*42d18160Sdan
377*42d18160Sdan  do_catchsql_test 8.$tn.5 {
378*42d18160Sdan    INSERT INTO excluded AS x1 VALUES('hello', 1, 1, NULL)
379*42d18160Sdan      ON CONFLICT(x, [a b]) WHERE y=1
380*42d18160Sdan      DO UPDATE SET w=w||w WHERE excluded.x=1;
381*42d18160Sdan  } {1 {no such column: y}}
382*42d18160Sdan}
383*42d18160Sdan
384*42d18160Sdan#--------------------------------------------------------------------------
385*42d18160Sdan#
386*42d18160Sdando_execsql_test 9.0 {
387*42d18160Sdan  CREATE TABLE v(x INTEGER);
388*42d18160Sdan  CREATE TABLE hist(x INTEGER PRIMARY KEY, cnt INTEGER);
389*42d18160Sdan  CREATE TRIGGER vt AFTER INSERT ON v BEGIN
390*42d18160Sdan    INSERT INTO hist VALUES(new.x, 1) ON CONFLICT(x) DO
391*42d18160Sdan      UPDATE SET cnt=cnt+1;
392*42d18160Sdan  END;
393*42d18160Sdan}
394*42d18160Sdan
395*42d18160Sdando_execsql_test 9.1 {
396*42d18160Sdan  INSERT INTO v VALUES(1), (4), (1), (5), (5), (8), (9), (1);
397*42d18160Sdan  SELECT * FROM hist;
398*42d18160Sdan} {
399*42d18160Sdan  1 3
400*42d18160Sdan  4 1
401*42d18160Sdan  5 2
402*42d18160Sdan  8 1
403*42d18160Sdan  9 1
404224d92c8Sdan}
405224d92c8Sdan
406a46838cbSdan
4072cc00423Sdanfinish_test
408