1 AT_BANNER([OVSDB -- execution])
3 m4_define([ORDINAL_SCHEMA],
8 "number": {"type": "integer"},
9 "name": {"type": "string"}}}},
11 "cksum": "12345678 9"}]])
13 m4_define([CONSTRAINT_SCHEMA],
14 [[{"name": "constraints",
18 "a": {"type": "integer"},
19 "a2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
20 "min": 0, "max": "unlimited"}},
21 "a2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
22 "min": 0, "max": "unlimited"}}}},
25 "b": {"type": "integer"},
26 "b2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
27 "min": 0, "max": "unlimited"}},
28 "b2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
29 "min": 0, "max": "unlimited"}}}},
32 "positive": {"type": {"key": {"type": "integer",
36 m4_define([WEAK_SCHEMA],
41 "a": {"type": "integer"},
42 "a2a": {"type": {"key": {"type": "uuid",
45 "min": 0, "max": "unlimited"}},
46 "a2a1": {"type": {"key": {"type": "uuid",
49 "a2b": {"type": {"key": {"type": "uuid",
51 "refType": "weak"}}}}},
54 "b": {"type": "integer"},
55 "b2a": {"type": {"key": {"type": "uuid",
58 "min": 0, "max": "unlimited"}}}}}}]])
60 m4_define([GC_SCHEMA],
65 "a": {"type": {"key": {"type": "uuid",
67 "min": 0, "max": "unlimited"}}},
71 "a": {"type": "integer"},
72 "a2a": {"type": {"key": {"type": "uuid",
74 "min": 0, "max": "unlimited"}},
75 "a2b": {"type": {"key": {"type": "uuid",
77 "min": 0, "max": "unlimited"}},
78 "wa2a": {"type": {"key": {"type": "uuid",
81 "min": 0, "max": "unlimited"}},
82 "wa2b": {"type": {"key": {"type": "uuid",
85 "min": 0, "max": "unlimited"}}}},
88 "b": {"type": "integer"},
89 "b2a": {"type": {"key": {"type": "uuid",
91 "min": 0, "max": "unlimited"}},
92 "wb2a": {"type": {"key": {"type": "uuid",
95 "min": 0, "max": "unlimited"}}},
98 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
100 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
101 # TRANSACTIONS (which should be a quoted list of quoted strings).
103 # Checks that the overall output is OUTPUT, but UUIDs in the output
104 # are replaced by markers of the form <N> where N is a number. The
105 # first unique UUID is replaced by <0>, the next by <1>, and so on.
106 # If a given UUID appears more than once it is always replaced by the
109 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
110 m4_define([OVSDB_CHECK_EXECUTION],
112 AT_KEYWORDS([ovsdb execute execution positive $5])
113 AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
115 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
118 OVSDB_CHECK_EXECUTION([uuid-name must be <id>],
124 "uuid-name": "0"}]]]],
125 [[[{"details":"Parsing ovsdb operation 1 of 1 failed: Type mismatch for member 'uuid-name'.","error":"syntax error","syntax":"{\"op\":\"insert\",\"row\":{},\"table\":\"a\",\"uuid-name\":\"0\"}"}]
128 OVSDB_CHECK_EXECUTION([named-uuid must be <id>],
133 "row": {"a2a": ["named-uuid", "0"]}}]]]],
134 [[[{"details":"named-uuid string is not a valid <id>","error":"syntax error","syntax":"[\"named-uuid\",\"0\"]"}]
137 OVSDB_CHECK_EXECUTION([duplicate uuid-name not allowed],
147 "uuid-name": "x"}]]]],
148 [[[{"uuid":["uuid","<0>"]},{"details":"This \"uuid-name\" appeared on an earlier \"insert\" operation.","error":"duplicate uuid-name","syntax":"\"x\""}]
151 m4_define([EXECUTION_EXAMPLES], [
152 dnl At one point the "commit" code ignored new rows with all-default values,
153 dnl so this checks for that problem.
154 OVSDB_CHECK_EXECUTION([insert default row, query table],
164 [[[{"uuid":["uuid","<0>"]}]
165 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
168 OVSDB_CHECK_EXECUTION([insert row, query table],
173 "row": {"number": 0, "name": "zero"}}]]],
178 [[[{"uuid":["uuid","<0>"]}]
179 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
182 OVSDB_CHECK_EXECUTION([insert rows, query by value],
187 "row": {"number": 0, "name": "zero"}}]]],
191 "row": {"number": 1, "name": "one"}}]]],
195 "where": [["name", "==", "zero"]]}]]],
199 "where": [["name", "==", "one"]]}]]]],
200 [[[{"uuid":["uuid","<0>"]}]
201 [{"uuid":["uuid","<1>"]}]
202 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
203 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
206 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
211 "row": {"number": 0, "name": "zero"},
212 "uuid-name": "first"},
215 "row": {"number": 1, "name": "one"},
216 "uuid-name": "second"},
219 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
222 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
223 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]},{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
226 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
231 "row": {"number": 0, "name": "zero"},
232 "uuid-name": "first"}]]],
236 "row": {"number": 1, "name": "one"},
237 "uuid-name": "first"}]]],
241 "where": [["name", "==", "zero"]],
242 "row": {"name": "nought"}}]]],
247 "sort": ["number"]}]]]],
248 [[[{"uuid":["uuid","<0>"]}]
249 [{"uuid":["uuid","<1>"]}]
251 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
254 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
259 "row": {"number": 0, "name": "zero"},
260 "uuid-name": "first"}]]],
264 "row": {"number": 1, "name": "one"},
265 "uuid-name": "first"}]]],
269 "where": [["name", "==", "zero"]],
270 "mutations": [["number", "+=", 2]]}]]],
275 "sort": ["number"]}]]]],
276 [[[{"uuid":["uuid","<0>"]}]
277 [{"uuid":["uuid","<1>"]}]
279 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
282 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
287 "row": {"number": 0, "name": "zero"},
288 "uuid-name": "first"},
291 "row": {"number": 1, "name": "one"},
292 "uuid-name": "second"},
295 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
299 "columns": ["name","number"]}]]]],
300 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
303 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
308 "row": {"number": 0, "name": "zero"},
309 "uuid-name": "first"}]]],
313 "row": {"number": 1, "name": "one"},
314 "uuid-name": "first"}]]],
318 "where": [["name", "==", "zero"]]}]]],
323 [[[{"uuid":["uuid","<0>"]}]
324 [{"uuid":["uuid","<1>"]}]
326 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
329 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
334 "row": {"number": 0, "name": "zero"},
335 "uuid-name": "first"}]]],
339 "row": {"number": 1, "name": "one"},
340 "uuid-name": "first"}]]],
344 "where": [["name", "==", "nought"]]}]]],
349 "sort": ["number"]}]]]],
350 [[[{"uuid":["uuid","<0>"]}]
351 [{"uuid":["uuid","<1>"]}]
353 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
356 OVSDB_CHECK_EXECUTION([insert rows, delete all],
361 "row": {"number": 0, "name": "zero"},
362 "uuid-name": "first"},
365 "row": {"number": 1, "name": "one"},
366 "uuid-name": "second"},
373 "columns": ["name","number"]}]]]],
374 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
377 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
382 "row": {"number": 0, "name": "zero"}},
387 "durable": false}]]]],
388 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
391 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
396 "row": {"number": 0, "name": "zero"}},
401 "durable": true}]]]],
402 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
405 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
410 "row": {"number": 0, "name": "zero"}},
413 "row": {"number": 1, "name": "one"}},
418 "columns": ["name", "number"],
420 "rows": [{"name": "zero", "number": 0},
421 {"name": "one", "number": 1}]}]]]],
422 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
425 OVSDB_CHECK_EXECUTION([equality wait with extra row],
430 "row": {"number": 0, "name": "zero"}},
433 "row": {"number": 1, "name": "one"}},
438 "columns": ["name", "number"],
440 "rows": [{"name": "zero", "number": 0},
441 {"name": "one", "number": 1},
442 {"name": "two", "number": 2}]}]]]],
443 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
446 OVSDB_CHECK_EXECUTION([equality wait with missing row],
451 "row": {"number": 0, "name": "zero"}},
454 "row": {"number": 1, "name": "one"}},
459 "columns": ["name", "number"],
461 "rows": [{"name": "one", "number": 1}]}]]]],
462 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
465 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
470 "row": {"number": 0, "name": "zero"}},
473 "row": {"number": 1, "name": "one"}},
478 "columns": ["name", "number"],
480 "rows": [{"name": "zero", "number": 0},
481 {"name": "one", "number": 1}]}]]]],
482 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
485 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
490 "row": {"number": 0, "name": "zero"}},
493 "row": {"number": 1, "name": "one"}},
498 "columns": ["name", "number"],
500 "rows": [{"name": "zero", "number": 0},
501 {"name": "one", "number": 1},
502 {"name": "two", "number": 2}]}]]]],
503 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
506 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
511 "row": {"number": 0, "name": "zero"}},
514 "row": {"number": 1, "name": "one"}},
519 "columns": ["name", "number"],
521 "rows": [{"name": "one", "number": 1}]}]]]],
522 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
525 OVSDB_CHECK_EXECUTION([insert and update constraints],
529 "table": "constrained",
533 "table": "constrained",
534 "row": {"positive": -1}}]]],
537 "table": "constrained",
539 "row": {"positive": -2}}]]],
542 "table": "constrained",
543 "row": {"positive": 1}}]]],
546 "table": "constrained",
547 "row": {"positive": 2}}]]]],
548 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
549 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
550 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
551 [{"uuid":["uuid","<0>"]}]
552 [{"uuid":["uuid","<1>"]},{"details":"transaction causes \"constrained\" table to contain 2 rows, greater than the schema-defined limit of 1 row(s)","error":"constraint violation"}]
555 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
561 "uuid-name": "brow"},
565 "a2b": ["set", [["named-uuid", "brow"]]]}},
569 "a2b": ["set", [["named-uuid", "brow"]]]}},
573 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
581 "where": [["a", "==", 0]]}]]],
589 "where": [["a", "==", 1]]}]]],
597 "where": [["a", "==", 2]]}]]],
602 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
603 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
605 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
607 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
612 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
618 "a2b": ["set", [["named-uuid", "row2"]]],
619 "a2a": ["set", [["named-uuid", "row1"]]]},
620 "uuid-name": "row1"},
624 "b2b": ["set", [["named-uuid", "row2"]]],
625 "b2a": ["set", [["named-uuid", "row1"]]]},
626 "uuid-name": "row2"}]]],
630 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
634 "where": [["a", "==", 0]]}]]],
638 "where": [["b", "==", 1]]}]]],
639 dnl Try the deletions again to make sure that the refcounts got rolled back.
643 "where": [["a", "==", 0]]}]]],
647 "where": [["b", "==", 1]]}]]],
651 "where": [["a", "==", 0]]},
654 "where": [["b", "==", 1]]}]]]],
655 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
656 [{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}]
657 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
658 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
659 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
660 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
661 [{"count":1},{"count":1}]
664 OVSDB_CHECK_EXECUTION([weak references],
670 "a2a": ["set", [["named-uuid", "row1"],
671 ["named-uuid", "row2"],
672 ["uuid", "0e767b36-6822-4044-8307-d58467e04669"]]],
673 "a2a1": ["named-uuid", "row1"],
674 "a2b": ["named-uuid", "row3"]},
675 "uuid-name": "row1"},
679 "a2a": ["set", [["named-uuid", "row1"],
680 ["named-uuid", "row2"]]],
681 "a2a1": ["named-uuid", "row2"],
682 "a2b": ["named-uuid", "row3"]},
683 "uuid-name": "row2"},
687 "a2a": ["set", [["named-uuid", "row1"],
688 ["named-uuid", "row2"]]],
689 "a2a1": ["named-uuid", "row2"],
690 "a2b": ["named-uuid", "row4"]}},
694 "b2a": ["named-uuid", "row1"]},
695 "uuid-name": "row3"},
699 "b2a": ["named-uuid", "row2"]},
700 "uuid-name": "row4"}]]],
701 dnl Check that the nonexistent row UUID we added to row a0 was deleted,
702 dnl and that other rows were inserted as requested.
707 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
713 "columns": ["_uuid", "b", "b2a"],
715 dnl Try to insert invalid all-zeros weak reference (the default) into
716 dnl "a2b", which requires exactly one value.
720 "row": {"a2a1": ["named-uuid", "me"]},
721 "uuid-name": "me"}]]],
722 dnl Try to delete row from "b" that is referred to by weak references
723 dnl from "a" table "a2b" column that requires exactly one value.
727 "where": [["b", "==", 3]]}]]],
728 dnl Try to delete row from "a" that is referred to by weak references
729 dnl from "a" table "a2a1" column that requires exactly one value.
733 "where": [["a", "==", 1]]}]]],
734 dnl Delete the row that had the reference that caused the previous
735 dnl deletion to fail, then check that other rows are unchanged.
739 "where": [["a", "==", 2]]}]]],
744 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
750 "columns": ["_uuid", "b", "b2a"],
752 dnl Delete row a0 then check that references to it were removed.
756 "where": [["a", "==", 0]]}]]],
761 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
767 "columns": ["_uuid", "b", "b2a"],
769 dnl Delete row a1 then check that references to it were removed.
773 "where": [["a", "==", 1]]}]]],
778 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
784 "columns": ["_uuid", "b", "b2a"],
786 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
787 [{"rows":[{"_uuid":["uuid","<0>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<0>"],"a2b":["uuid","<3>"]},{"_uuid":["uuid","<1>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]},{"_uuid":["uuid","<2>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<1>"],"a2b":["uuid","<4>"]}]}]
788 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
789 [{"uuid":["uuid","<5>"]},{"details":"Weak reference column \"a2b\" in \"a\" row <5> (inserted within this transaction) contained all-zeros UUID (probably as the default value for this column) but deleting this value caused a constraint volation because this column is not allowed to be empty.","error":"constraint violation"}]
790 [{"count":1},{"details":"Deletion of 1 weak reference(s) to deleted (or never-existing) rows from column \"a2b\" in \"a\" row <2> caused this column to become empty, but constraints on this column disallow an empty column.","error":"constraint violation"}]
791 [{"count":1},{"details":"Deletion of 1 weak reference(s) to deleted (or never-existing) rows from column \"a2a1\" in \"a\" row <2> caused this column to become empty, but constraints on this column disallow an empty column.","error":"constraint violation"}]
793 [{"rows":[{"_uuid":["uuid","<0>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<0>"],"a2b":["uuid","<3>"]},{"_uuid":["uuid","<1>"],"a2a":["set",[["uuid","<0>"],["uuid","<1>"]]],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
794 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
796 [{"rows":[{"_uuid":["uuid","<1>"],"a2a":["uuid","<1>"],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
797 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
800 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}]
803 OVSDB_CHECK_EXECUTION([garbage collection],
805 [dnl Check that inserting a row without any references is a no-op.
814 "columns": ["a"]}]]],
815 dnl Check that inserting a chain of rows that reference each other
816 dnl in turn is also a no-op.
820 "row": {"a": 0, "a2a": ["named-uuid", "row1"]},
821 "uuid-name": "row0"},
824 "row": {"a": 1, "a2a": ["named-uuid", "row2"]},
825 "uuid-name": "row1"},
828 "row": {"a": 2, "a2a": ["named-uuid", "row3"]},
829 "uuid-name": "row2"},
833 "uuid-name": "row3"}]]],
838 "columns": ["a"]}]]],
839 dnl Check that inserting a pair of rows that mutually reference each
840 dnl other causes the rows to be retained.
844 "row": {"a": 4, "a2a": ["named-uuid", "row5"]},
845 "uuid-name": "row4"},
848 "row": {"a": 5, "a2a": ["named-uuid", "row4"]},
849 "uuid-name": "row5"}]]],
856 dnl Check that unreferencing one of the rows causes the other to be deleted.
860 "where": [["a", "==", 4]],
861 "row": {"a2a": ["set", []]}}]]],
866 "columns": ["a"]}]]],
867 dnl Check that inserting a pair of rows that mutually weak reference each
868 dnl other is a no-op.
872 "row": {"a": 6, "wa2a": ["named-uuid", "row7"]},
873 "uuid-name": "row6"},
876 "row": {"a": 7, "wa2a": ["named-uuid", "row6"]},
877 "uuid-name": "row7"}]]],
882 "columns": ["a"]}]]],
883 dnl Check that a circular chain of rows is retained.
887 "row": {"a": 8, "a2a": ["named-uuid", "row9"]},
888 "uuid-name": "row8"},
891 "row": {"a": 9, "a2a": ["named-uuid", "row10"]},
892 "uuid-name": "row9"},
895 "row": {"a": 10, "a2a": ["named-uuid", "row11"]},
896 "uuid-name": "row10"},
899 "row": {"a": 11, "a2a": ["named-uuid", "row8"]},
900 "uuid-name": "row11"}]]],
907 dnl Check that breaking the chain causes all of the rows to be deleted.
911 "where": [["a", "==", 9]],
912 "row": {"a2a": ["set", []]}}]]],
917 "columns": ["a"]}]]],
918 dnl Check that inserting a row only referenced by itself is a no-op.
922 "row": {"a": 12, "a2a": ["named-uuid", "self"]},
923 "uuid-name": "self"}]]],
928 "columns": ["a"]}]]]],
929 [[[{"uuid":["uuid","<0>"]}]
931 [{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
933 [{"uuid":["uuid","<5>"]},{"uuid":["uuid","<6>"]}]
934 [{"rows":[{"a":4},{"a":5}]}]
937 [{"uuid":["uuid","<7>"]},{"uuid":["uuid","<8>"]}]
939 [{"uuid":["uuid","<9>"]},{"uuid":["uuid","<10>"]},{"uuid":["uuid","<11>"]},{"uuid":["uuid","<12>"]}]
940 [{"rows":[{"a":8},{"a":9},{"a":10},{"a":11}]}]
943 [{"uuid":["uuid","<13>"]}]