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"}},
30 "x": {"type": {"key": "integer", "min": 1, "max": 2}}}},
33 "positive": {"type": {"key": {"type": "integer",
37 m4_define([WEAK_SCHEMA],
42 "a": {"type": "integer"},
43 "a2a": {"type": {"key": {"type": "uuid",
46 "min": 0, "max": "unlimited"}},
47 "a2a1": {"type": {"key": {"type": "uuid",
50 "a2b": {"type": {"key": {"type": "uuid",
52 "refType": "weak"}}}}},
55 "b": {"type": "integer"},
56 "b2a": {"type": {"key": {"type": "uuid",
59 "min": 0, "max": "unlimited"}}}}}}]])
61 m4_define([GC_SCHEMA],
66 "a": {"type": {"key": {"type": "uuid",
68 "min": 0, "max": "unlimited"}}},
72 "a": {"type": "integer"},
73 "a2a": {"type": {"key": {"type": "uuid",
75 "min": 0, "max": "unlimited"}},
76 "a2b": {"type": {"key": {"type": "uuid",
78 "min": 0, "max": "unlimited"}},
79 "wa2a": {"type": {"key": {"type": "uuid",
82 "min": 0, "max": "unlimited"}},
83 "wa2b": {"type": {"key": {"type": "uuid",
86 "min": 0, "max": "unlimited"}}}},
89 "b": {"type": "integer"},
90 "b2a": {"type": {"key": {"type": "uuid",
92 "min": 0, "max": "unlimited"}},
93 "wb2a": {"type": {"key": {"type": "uuid",
96 "min": 0, "max": "unlimited"}}},
99 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
101 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
102 # TRANSACTIONS (which should be a quoted list of quoted strings).
104 # Checks that the overall output is OUTPUT, but UUIDs in the output
105 # are replaced by markers of the form <N> where N is a number. The
106 # first unique UUID is replaced by <0>, the next by <1>, and so on.
107 # If a given UUID appears more than once it is always replaced by the
110 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
111 m4_define([OVSDB_CHECK_EXECUTION],
113 AT_KEYWORDS([ovsdb execute execution positive $5])
114 AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
116 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
119 OVSDB_CHECK_EXECUTION([uuid-name must be <id>],
125 "uuid-name": "0"}]]]],
126 [[[{"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\"}"}]
129 OVSDB_CHECK_EXECUTION([named-uuid must be <id>],
134 "row": {"a2a": ["named-uuid", "0"]}}]]]],
135 [[[{"details":"named-uuid string is not a valid <id>","error":"syntax error","syntax":"[\"named-uuid\",\"0\"]"}]
138 OVSDB_CHECK_EXECUTION([duplicate uuid-name not allowed],
148 "uuid-name": "x"}]]]],
149 [[[{"uuid":["uuid","<0>"]},{"details":"This \"uuid-name\" appeared on an earlier \"insert\" operation.","error":"duplicate uuid-name","syntax":"\"x\""}]
152 m4_define([EXECUTION_EXAMPLES], [
153 dnl At one point the "commit" code ignored new rows with all-default values,
154 dnl so this checks for that problem.
155 OVSDB_CHECK_EXECUTION([insert default row, query table],
165 [[[{"uuid":["uuid","<0>"]}]
166 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
169 OVSDB_CHECK_EXECUTION([insert row, query table],
174 "row": {"number": 0, "name": "zero"}}]]],
179 [[[{"uuid":["uuid","<0>"]}]
180 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
183 OVSDB_CHECK_EXECUTION([insert rows, query by value],
188 "row": {"number": 0, "name": "zero"}}]]],
192 "row": {"number": 1, "name": "one"}}]]],
196 "where": [["name", "==", "zero"]]}]]],
200 "where": [["name", "==", "one"]]}]]]],
201 [[[{"uuid":["uuid","<0>"]}]
202 [{"uuid":["uuid","<1>"]}]
203 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
204 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
207 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
212 "row": {"number": 0, "name": "zero"},
213 "uuid-name": "first"},
216 "row": {"number": 1, "name": "one"},
217 "uuid-name": "second"},
220 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
223 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
224 [[[{"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}]}]
227 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
232 "row": {"number": 0, "name": "zero"},
233 "uuid-name": "first"}]]],
237 "row": {"number": 1, "name": "one"},
238 "uuid-name": "first"}]]],
242 "where": [["name", "==", "zero"]],
243 "row": {"name": "nought"}}]]],
248 "sort": ["number"]}]]]],
249 [[[{"uuid":["uuid","<0>"]}]
250 [{"uuid":["uuid","<1>"]}]
252 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
255 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
260 "row": {"number": 0, "name": "zero"},
261 "uuid-name": "first"}]]],
265 "row": {"number": 1, "name": "one"},
266 "uuid-name": "first"}]]],
270 "where": [["name", "==", "zero"]],
271 "mutations": [["number", "+=", 2]]}]]],
276 "sort": ["number"]}]]]],
277 [[[{"uuid":["uuid","<0>"]}]
278 [{"uuid":["uuid","<1>"]}]
280 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
283 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
288 "row": {"number": 0, "name": "zero"},
289 "uuid-name": "first"},
292 "row": {"number": 1, "name": "one"},
293 "uuid-name": "second"},
296 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
300 "columns": ["name","number"]}]]]],
301 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
304 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
309 "row": {"number": 0, "name": "zero"},
310 "uuid-name": "first"}]]],
314 "row": {"number": 1, "name": "one"},
315 "uuid-name": "first"}]]],
319 "where": [["name", "==", "zero"]]}]]],
324 [[[{"uuid":["uuid","<0>"]}]
325 [{"uuid":["uuid","<1>"]}]
327 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
330 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
335 "row": {"number": 0, "name": "zero"},
336 "uuid-name": "first"}]]],
340 "row": {"number": 1, "name": "one"},
341 "uuid-name": "first"}]]],
345 "where": [["name", "==", "nought"]]}]]],
350 "sort": ["number"]}]]]],
351 [[[{"uuid":["uuid","<0>"]}]
352 [{"uuid":["uuid","<1>"]}]
354 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
357 OVSDB_CHECK_EXECUTION([insert rows, delete all],
362 "row": {"number": 0, "name": "zero"},
363 "uuid-name": "first"},
366 "row": {"number": 1, "name": "one"},
367 "uuid-name": "second"},
374 "columns": ["name","number"]}]]]],
375 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
378 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
383 "row": {"number": 0, "name": "zero"}},
388 "durable": false}]]]],
389 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
392 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
397 "row": {"number": 0, "name": "zero"}},
402 "durable": true}]]]],
403 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
406 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
411 "row": {"number": 0, "name": "zero"}},
414 "row": {"number": 1, "name": "one"}},
419 "columns": ["name", "number"],
421 "rows": [{"name": "zero", "number": 0},
422 {"name": "one", "number": 1}]}]]]],
423 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
426 OVSDB_CHECK_EXECUTION([equality wait with extra row],
431 "row": {"number": 0, "name": "zero"}},
434 "row": {"number": 1, "name": "one"}},
439 "columns": ["name", "number"],
441 "rows": [{"name": "zero", "number": 0},
442 {"name": "one", "number": 1},
443 {"name": "two", "number": 2}]}]]]],
444 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
447 OVSDB_CHECK_EXECUTION([equality wait with missing row],
452 "row": {"number": 0, "name": "zero"}},
455 "row": {"number": 1, "name": "one"}},
460 "columns": ["name", "number"],
462 "rows": [{"name": "one", "number": 1}]}]]]],
463 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
466 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
471 "row": {"number": 0, "name": "zero"}},
474 "row": {"number": 1, "name": "one"}},
479 "columns": ["name", "number"],
481 "rows": [{"name": "zero", "number": 0},
482 {"name": "one", "number": 1}]}]]]],
483 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
486 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
491 "row": {"number": 0, "name": "zero"}},
494 "row": {"number": 1, "name": "one"}},
499 "columns": ["name", "number"],
501 "rows": [{"name": "zero", "number": 0},
502 {"name": "one", "number": 1},
503 {"name": "two", "number": 2}]}]]]],
504 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
507 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
512 "row": {"number": 0, "name": "zero"}},
515 "row": {"number": 1, "name": "one"}},
520 "columns": ["name", "number"],
522 "rows": [{"name": "one", "number": 1}]}]]]],
523 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
526 OVSDB_CHECK_EXECUTION([insert and update constraints],
530 "table": "constrained",
534 "table": "constrained",
535 "row": {"positive": -1}}]]],
538 "table": "constrained",
540 "row": {"positive": -2}}]]],
543 "table": "constrained",
544 "row": {"positive": 1}}]]],
547 "table": "constrained",
548 "row": {"positive": 2}}]]]],
549 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
550 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
551 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
552 [{"uuid":["uuid","<0>"]}]
553 [{"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"}]
556 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
562 "uuid-name": "brow"},
566 "a2b": ["set", [["named-uuid", "brow"]]]}},
570 "a2b": ["set", [["named-uuid", "brow"]]]}},
574 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
579 dnl Check that "mutate" honors number-of-elements constraints on sets and maps.
584 "mutations": [["x", "delete", 0]]}]]],
588 "where": [["a", "==", 0]]}]]],
596 "where": [["a", "==", 1]]}]]],
604 "where": [["a", "==", 2]]}]]],
609 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
610 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
611 [{"details":"Attempted to store 0 elements in set of 1 to 2 integers.","error":"constraint violation"}]
613 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
615 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
620 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
626 "a2b": ["set", [["named-uuid", "row2"]]],
627 "a2a": ["set", [["named-uuid", "row1"]]]},
628 "uuid-name": "row1"},
632 "b2b": ["set", [["named-uuid", "row2"]]],
633 "b2a": ["set", [["named-uuid", "row1"]]]},
634 "uuid-name": "row2"}]]],
638 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
642 "where": [["a", "==", 0]]}]]],
646 "where": [["b", "==", 1]]}]]],
647 dnl Try the deletions again to make sure that the refcounts got rolled back.
651 "where": [["a", "==", 0]]}]]],
655 "where": [["b", "==", 1]]}]]],
659 "where": [["a", "==", 0]]},
662 "where": [["b", "==", 1]]}]]]],
663 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
664 [{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}]
665 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
666 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
667 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
668 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
669 [{"count":1},{"count":1}]
672 OVSDB_CHECK_EXECUTION([weak references],
678 "a2a": ["set", [["named-uuid", "row1"],
679 ["named-uuid", "row2"],
680 ["uuid", "0e767b36-6822-4044-8307-d58467e04669"]]],
681 "a2a1": ["named-uuid", "row1"],
682 "a2b": ["named-uuid", "row3"]},
683 "uuid-name": "row1"},
687 "a2a": ["set", [["named-uuid", "row1"],
688 ["named-uuid", "row2"]]],
689 "a2a1": ["named-uuid", "row2"],
690 "a2b": ["named-uuid", "row3"]},
691 "uuid-name": "row2"},
695 "a2a": ["set", [["named-uuid", "row1"],
696 ["named-uuid", "row2"]]],
697 "a2a1": ["named-uuid", "row2"],
698 "a2b": ["named-uuid", "row4"]}},
702 "b2a": ["named-uuid", "row1"]},
703 "uuid-name": "row3"},
707 "b2a": ["named-uuid", "row2"]},
708 "uuid-name": "row4"}]]],
709 dnl Check that the nonexistent row UUID we added to row a0 was deleted,
710 dnl and that other rows were inserted as requested.
715 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
721 "columns": ["_uuid", "b", "b2a"],
723 dnl Try to insert invalid all-zeros weak reference (the default) into
724 dnl "a2b", which requires exactly one value.
728 "row": {"a2a1": ["named-uuid", "me"]},
729 "uuid-name": "me"}]]],
730 dnl Try to delete row from "b" that is referred to by weak references
731 dnl from "a" table "a2b" column that requires exactly one value.
735 "where": [["b", "==", 3]]}]]],
736 dnl Try to delete row from "a" that is referred to by weak references
737 dnl from "a" table "a2a1" column that requires exactly one value.
741 "where": [["a", "==", 1]]}]]],
742 dnl Delete the row that had the reference that caused the previous
743 dnl deletion to fail, then check that other rows are unchanged.
747 "where": [["a", "==", 2]]}]]],
752 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
758 "columns": ["_uuid", "b", "b2a"],
760 dnl Delete row a0 then check that references to it were removed.
764 "where": [["a", "==", 0]]}]]],
769 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
775 "columns": ["_uuid", "b", "b2a"],
777 dnl Delete row a1 then check that references to it were removed.
781 "where": [["a", "==", 1]]}]]],
786 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
792 "columns": ["_uuid", "b", "b2a"],
794 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
795 [{"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>"]}]}]
796 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
797 [{"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"}]
798 [{"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"}]
799 [{"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"}]
801 [{"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>"]}]}]
802 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
804 [{"rows":[{"_uuid":["uuid","<1>"],"a2a":["uuid","<1>"],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
805 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
808 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}]
811 OVSDB_CHECK_EXECUTION([garbage collection],
813 [dnl Check that inserting a row without any references is a no-op.
822 "columns": ["a"]}]]],
823 dnl Check that inserting a chain of rows that reference each other
824 dnl in turn is also a no-op.
828 "row": {"a": 0, "a2a": ["named-uuid", "row1"]},
829 "uuid-name": "row0"},
832 "row": {"a": 1, "a2a": ["named-uuid", "row2"]},
833 "uuid-name": "row1"},
836 "row": {"a": 2, "a2a": ["named-uuid", "row3"]},
837 "uuid-name": "row2"},
841 "uuid-name": "row3"}]]],
846 "columns": ["a"]}]]],
847 dnl Check that inserting a pair of rows that mutually reference each
848 dnl other causes the rows to be retained.
852 "row": {"a": 4, "a2a": ["named-uuid", "row5"]},
853 "uuid-name": "row4"},
856 "row": {"a": 5, "a2a": ["named-uuid", "row4"]},
857 "uuid-name": "row5"}]]],
864 dnl Check that unreferencing one of the rows causes the other to be deleted.
868 "where": [["a", "==", 4]],
869 "row": {"a2a": ["set", []]}}]]],
874 "columns": ["a"]}]]],
875 dnl Check that inserting a pair of rows that mutually weak reference each
876 dnl other is a no-op.
880 "row": {"a": 6, "wa2a": ["named-uuid", "row7"]},
881 "uuid-name": "row6"},
884 "row": {"a": 7, "wa2a": ["named-uuid", "row6"]},
885 "uuid-name": "row7"}]]],
890 "columns": ["a"]}]]],
891 dnl Check that a circular chain of rows is retained.
895 "row": {"a": 8, "a2a": ["named-uuid", "row9"]},
896 "uuid-name": "row8"},
899 "row": {"a": 9, "a2a": ["named-uuid", "row10"]},
900 "uuid-name": "row9"},
903 "row": {"a": 10, "a2a": ["named-uuid", "row11"]},
904 "uuid-name": "row10"},
907 "row": {"a": 11, "a2a": ["named-uuid", "row8"]},
908 "uuid-name": "row11"}]]],
915 dnl Check that breaking the chain causes all of the rows to be deleted.
919 "where": [["a", "==", 9]],
920 "row": {"a2a": ["set", []]}}]]],
925 "columns": ["a"]}]]],
926 dnl Check that inserting a row only referenced by itself is a no-op.
930 "row": {"a": 12, "a2a": ["named-uuid", "self"]},
931 "uuid-name": "self"}]]],
936 "columns": ["a"]}]]]],
937 [[[{"uuid":["uuid","<0>"]}]
939 [{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
941 [{"uuid":["uuid","<5>"]},{"uuid":["uuid","<6>"]}]
942 [{"rows":[{"a":4},{"a":5}]}]
945 [{"uuid":["uuid","<7>"]},{"uuid":["uuid","<8>"]}]
947 [{"uuid":["uuid","<9>"]},{"uuid":["uuid","<10>"]},{"uuid":["uuid","<11>"]},{"uuid":["uuid","<12>"]}]
948 [{"rows":[{"a":8},{"a":9},{"a":10},{"a":11}]}]
951 [{"uuid":["uuid","<13>"]}]