1 AT_BANNER([OVSDB -- execution])
3 m4_define([ORDINAL_SCHEMA],
8 "number": {"type": "integer"},
9 "name": {"type": "string"}},
10 "indexes": [["number"]]}},
12 "cksum": "12345678 9"}]])
14 m4_define([CONSTRAINT_SCHEMA],
15 [[{"name": "constraints",
19 "a": {"type": "integer"},
20 "a2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
21 "min": 0, "max": "unlimited"}},
22 "a2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
23 "min": 0, "max": "unlimited"}}}},
26 "b": {"type": "integer"},
27 "b2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
28 "min": 0, "max": "unlimited"}},
29 "b2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
30 "min": 0, "max": "unlimited"}},
31 "x": {"type": {"key": "integer", "min": 1, "max": 2}}}},
34 "positive": {"type": {"key": {"type": "integer",
38 m4_define([WEAK_SCHEMA],
43 "a": {"type": "integer"},
44 "a2a": {"type": {"key": {"type": "uuid",
47 "min": 0, "max": "unlimited"}},
48 "a2a1": {"type": {"key": {"type": "uuid",
51 "a2b": {"type": {"key": {"type": "uuid",
53 "refType": "weak"}}}}},
56 "b": {"type": "integer"},
57 "b2a": {"type": {"key": {"type": "uuid",
60 "min": 0, "max": "unlimited"}}}}}}]])
62 m4_define([GC_SCHEMA],
67 "a": {"type": {"key": {"type": "uuid",
69 "min": 0, "max": "unlimited"}}},
73 "a": {"type": "integer"},
74 "a2a": {"type": {"key": {"type": "uuid",
76 "min": 0, "max": "unlimited"}},
77 "a2b": {"type": {"key": {"type": "uuid",
79 "min": 0, "max": "unlimited"}},
80 "wa2a": {"type": {"key": {"type": "uuid",
83 "min": 0, "max": "unlimited"}},
84 "wa2b": {"type": {"key": {"type": "uuid",
87 "min": 0, "max": "unlimited"}}}},
90 "b": {"type": "integer"},
91 "b2a": {"type": {"key": {"type": "uuid",
93 "min": 0, "max": "unlimited"}},
94 "wb2a": {"type": {"key": {"type": "uuid",
97 "min": 0, "max": "unlimited"}}},
100 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
102 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
103 # TRANSACTIONS (which should be a quoted list of quoted strings).
105 # Checks that the overall output is OUTPUT, but UUIDs in the output
106 # are replaced by markers of the form <N> where N is a number. The
107 # first unique UUID is replaced by <0>, the next by <1>, and so on.
108 # If a given UUID appears more than once it is always replaced by the
111 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
112 m4_define([OVSDB_CHECK_EXECUTION],
114 AT_KEYWORDS([ovsdb execute execution positive $5])
115 AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
117 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
120 OVSDB_CHECK_EXECUTION([uuid-name must be <id>],
126 "uuid-name": "0"}]]]],
127 [[[{"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\"}"}]
130 OVSDB_CHECK_EXECUTION([named-uuid must be <id>],
135 "row": {"a2a": ["named-uuid", "0"]}}]]]],
136 [[[{"details":"named-uuid string is not a valid <id>","error":"syntax error","syntax":"[\"named-uuid\",\"0\"]"}]
139 OVSDB_CHECK_EXECUTION([duplicate uuid-name not allowed],
149 "uuid-name": "x"}]]]],
150 [[[{"uuid":["uuid","<0>"]},{"details":"This \"uuid-name\" appeared on an earlier \"insert\" operation.","error":"duplicate uuid-name","syntax":"\"x\""}]
153 m4_define([EXECUTION_EXAMPLES], [
154 dnl At one point the "commit" code ignored new rows with all-default values,
155 dnl so this checks for that problem.
156 OVSDB_CHECK_EXECUTION([insert default row, query table],
166 [[[{"uuid":["uuid","<0>"]}]
167 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
170 OVSDB_CHECK_EXECUTION([insert row, query table],
175 "row": {"number": 0, "name": "zero"}}]]],
180 [[[{"uuid":["uuid","<0>"]}]
181 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
184 OVSDB_CHECK_EXECUTION([insert rows, query by value],
189 "row": {"number": 0, "name": "zero"}}]]],
193 "row": {"number": 1, "name": "one"}}]]],
197 "where": [["name", "==", "zero"]]}]]],
201 "where": [["name", "==", "one"]]}]]]],
202 [[[{"uuid":["uuid","<0>"]}]
203 [{"uuid":["uuid","<1>"]}]
204 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
205 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
208 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
213 "row": {"number": 0, "name": "zero"},
214 "uuid-name": "first"},
217 "row": {"number": 1, "name": "one"},
218 "uuid-name": "second"},
221 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
224 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
225 [[[{"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}]}]
228 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
233 "row": {"number": 0, "name": "zero"},
234 "uuid-name": "first"}]]],
238 "row": {"number": 1, "name": "one"},
239 "uuid-name": "first"}]]],
243 "where": [["name", "==", "zero"]],
244 "row": {"name": "nought"}}]]],
249 "sort": ["number"]}]]]],
250 [[[{"uuid":["uuid","<0>"]}]
251 [{"uuid":["uuid","<1>"]}]
253 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
256 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
261 "row": {"number": 0, "name": "zero"},
262 "uuid-name": "first"}]]],
266 "row": {"number": 1, "name": "one"},
267 "uuid-name": "first"}]]],
271 "where": [["name", "==", "zero"]],
272 "mutations": [["number", "+=", 2]]}]]],
277 "sort": ["number"]}]]]],
278 [[[{"uuid":["uuid","<0>"]}]
279 [{"uuid":["uuid","<1>"]}]
281 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
284 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
289 "row": {"number": 0, "name": "zero"},
290 "uuid-name": "first"},
293 "row": {"number": 1, "name": "one"},
294 "uuid-name": "second"},
297 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
301 "columns": ["name","number"]}]]]],
302 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
305 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
310 "row": {"number": 0, "name": "zero"},
311 "uuid-name": "first"}]]],
315 "row": {"number": 1, "name": "one"},
316 "uuid-name": "first"}]]],
320 "where": [["name", "==", "zero"]]}]]],
325 [[[{"uuid":["uuid","<0>"]}]
326 [{"uuid":["uuid","<1>"]}]
328 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
331 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
336 "row": {"number": 0, "name": "zero"},
337 "uuid-name": "first"}]]],
341 "row": {"number": 1, "name": "one"},
342 "uuid-name": "first"}]]],
346 "where": [["name", "==", "nought"]]}]]],
351 "sort": ["number"]}]]]],
352 [[[{"uuid":["uuid","<0>"]}]
353 [{"uuid":["uuid","<1>"]}]
355 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
358 OVSDB_CHECK_EXECUTION([insert rows, delete all],
363 "row": {"number": 0, "name": "zero"},
364 "uuid-name": "first"},
367 "row": {"number": 1, "name": "one"},
368 "uuid-name": "second"},
375 "columns": ["name","number"]}]]]],
376 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
379 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
384 "row": {"number": 0, "name": "zero"}},
389 "durable": false}]]]],
390 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
393 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
398 "row": {"number": 0, "name": "zero"}},
403 "durable": true}]]]],
404 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
407 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
412 "row": {"number": 0, "name": "zero"}},
415 "row": {"number": 1, "name": "one"}},
420 "columns": ["name", "number"],
422 "rows": [{"name": "zero", "number": 0},
423 {"name": "one", "number": 1}]}]]]],
424 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
427 OVSDB_CHECK_EXECUTION([equality wait with extra row],
432 "row": {"number": 0, "name": "zero"}},
435 "row": {"number": 1, "name": "one"}},
440 "columns": ["name", "number"],
442 "rows": [{"name": "zero", "number": 0},
443 {"name": "one", "number": 1},
444 {"name": "two", "number": 2}]}]]]],
445 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
448 OVSDB_CHECK_EXECUTION([equality wait with missing row],
453 "row": {"number": 0, "name": "zero"}},
456 "row": {"number": 1, "name": "one"}},
461 "columns": ["name", "number"],
463 "rows": [{"name": "one", "number": 1}]}]]]],
464 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
467 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
472 "row": {"number": 0, "name": "zero"}},
475 "row": {"number": 1, "name": "one"}},
480 "columns": ["name", "number"],
482 "rows": [{"name": "zero", "number": 0},
483 {"name": "one", "number": 1}]}]]]],
484 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
487 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
492 "row": {"number": 0, "name": "zero"}},
495 "row": {"number": 1, "name": "one"}},
500 "columns": ["name", "number"],
502 "rows": [{"name": "zero", "number": 0},
503 {"name": "one", "number": 1},
504 {"name": "two", "number": 2}]}]]]],
505 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
508 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
513 "row": {"number": 0, "name": "zero"}},
516 "row": {"number": 1, "name": "one"}},
521 "columns": ["name", "number"],
523 "rows": [{"name": "one", "number": 1}]}]]]],
524 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
527 OVSDB_CHECK_EXECUTION([insert and update constraints],
531 "table": "constrained",
535 "table": "constrained",
536 "row": {"positive": -1}}]]],
539 "table": "constrained",
541 "row": {"positive": -2}}]]],
544 "table": "constrained",
545 "row": {"positive": 1}}]]],
548 "table": "constrained",
549 "row": {"positive": 2}}]]]],
550 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
551 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
552 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
553 [{"uuid":["uuid","<0>"]}]
554 [{"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"}]
557 OVSDB_CHECK_EXECUTION([index uniqueness checking],
559 dnl Insert initial row.
563 "row": {"number": 1, "name": "one"}}]]],
564 dnl Try to insert row with identical value (fails).
568 "row": {"number": 1, "name": "another one"}}]]],
569 dnl Remove initial row and insert new row with identical value in a single
570 dnl transaction (succeeds).
574 "row": {"number": 1, "name": "another one"}},
577 "where": [["name", "==", "one"]]}]]],
578 dnl Remove row and insert two new rows with identical value in a single
579 dnl transaction (fails).
586 "row": {"number": 1, "name": "one"}},
589 "row": {"number": 1, "name": "still another one"}}]]],
590 dnl Add new row with different value (succeeds).
594 "row": {"number": 2, "name": "two"}}]]],
595 dnl Change rows so values collide (fails).
600 "row": {"number": 3}}]]],
601 dnl Swap rows' values (succeeds).
605 "where": [["number", "==", 1]],
606 "row": {"number": 2, "name": "old two"}},
609 "where": [["name", "==", "two"]],
610 "row": {"number": 1, "name": "old one"}}]]],
611 dnl Change all rows' values to values not used before and insert values that
612 dnl collide (only) with their previous values (succeeds).
617 "mutations": [["number", "*=", 10]]},
620 "row": {"number": 1, "name": "new one"}},
623 "row": {"number": 2, "name": "new two"}},
627 "columns": ["number", "name"],
628 "sort": ["number"]}]]]],
629 [[[{"uuid":["uuid","<0>"]}]
630 [{"uuid":["uuid","<1>"]},{"details":"Transaction causes multiple rows in \"ordinals\" table to have identical values (1) for index on column \"number\". First row, with UUID <0>, existed in the database before this transaction and was not modified by the transaction. Second row, with UUID <1>, was inserted by this transaction.","error":"constraint violation"}]
631 [{"uuid":["uuid","<2>"]},{"count":1}]
632 [{"count":1},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]},{"details":"Transaction causes multiple rows in \"ordinals\" table to have identical values (1) for index on column \"number\". First row, with UUID <4>, was inserted by this transaction. Second row, with UUID <3>, was inserted by this transaction.","error":"constraint violation"}]
633 [{"uuid":["uuid","<5>"]}]
634 [{"count":2},{"details":"Transaction causes multiple rows in \"ordinals\" table to have identical values (3) for index on column \"number\". First row, with UUID <5>, had the following index values before the transaction: 2. Second row, with UUID <2>, had the following index values before the transaction: 1.","error":"constraint violation"}]
635 [{"count":1},{"count":1}]
636 [{"count":2},{"uuid":["uuid","<6>"]},{"uuid":["uuid","<7>"]},{"rows":[{"name":"new one","number":1},{"name":"new two","number":2},{"name":"old one","number":10},{"name":"old two","number":20}]}]
639 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
645 "uuid-name": "brow"},
649 "a2b": ["set", [["named-uuid", "brow"]]]}},
653 "a2b": ["set", [["named-uuid", "brow"]]]}},
657 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
662 dnl Check that "mutate" honors number-of-elements constraints on sets and maps.
667 "mutations": [["x", "delete", 0]]}]]],
671 "where": [["a", "==", 0]]}]]],
679 "where": [["a", "==", 1]]}]]],
687 "where": [["a", "==", 2]]}]]],
692 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
693 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
694 [{"details":"Attempted to store 0 elements in set of 1 to 2 integers.","error":"constraint violation"}]
696 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
698 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
703 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
709 "a2b": ["set", [["named-uuid", "row2"]]],
710 "a2a": ["set", [["named-uuid", "row1"]]]},
711 "uuid-name": "row1"},
715 "b2b": ["set", [["named-uuid", "row2"]]],
716 "b2a": ["set", [["named-uuid", "row1"]]]},
717 "uuid-name": "row2"}]]],
721 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
725 "where": [["a", "==", 0]]}]]],
729 "where": [["b", "==", 1]]}]]],
730 dnl Try the deletions again to make sure that the refcounts got rolled back.
734 "where": [["a", "==", 0]]}]]],
738 "where": [["b", "==", 1]]}]]],
742 "where": [["a", "==", 0]]},
745 "where": [["b", "==", 1]]}]]]],
746 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
747 [{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}]
748 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
749 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
750 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
751 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
752 [{"count":1},{"count":1}]
755 OVSDB_CHECK_EXECUTION([weak references],
761 "a2a": ["set", [["named-uuid", "row1"],
762 ["named-uuid", "row2"],
763 ["uuid", "0e767b36-6822-4044-8307-d58467e04669"]]],
764 "a2a1": ["named-uuid", "row1"],
765 "a2b": ["named-uuid", "row3"]},
766 "uuid-name": "row1"},
770 "a2a": ["set", [["named-uuid", "row1"],
771 ["named-uuid", "row2"]]],
772 "a2a1": ["named-uuid", "row2"],
773 "a2b": ["named-uuid", "row3"]},
774 "uuid-name": "row2"},
778 "a2a": ["set", [["named-uuid", "row1"],
779 ["named-uuid", "row2"]]],
780 "a2a1": ["named-uuid", "row2"],
781 "a2b": ["named-uuid", "row4"]}},
785 "b2a": ["named-uuid", "row1"]},
786 "uuid-name": "row3"},
790 "b2a": ["named-uuid", "row2"]},
791 "uuid-name": "row4"}]]],
792 dnl Check that the nonexistent row UUID we added to row a0 was deleted,
793 dnl and that other rows were inserted as requested.
798 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
804 "columns": ["_uuid", "b", "b2a"],
806 dnl Try to insert invalid all-zeros weak reference (the default) into
807 dnl "a2b", which requires exactly one value.
811 "row": {"a2a1": ["named-uuid", "me"]},
812 "uuid-name": "me"}]]],
813 dnl Try to delete row from "b" that is referred to by weak references
814 dnl from "a" table "a2b" column that requires exactly one value.
818 "where": [["b", "==", 3]]}]]],
819 dnl Try to delete row from "a" that is referred to by weak references
820 dnl from "a" table "a2a1" column that requires exactly one value.
824 "where": [["a", "==", 1]]}]]],
825 dnl Delete the row that had the reference that caused the previous
826 dnl deletion to fail, then check that other rows are unchanged.
830 "where": [["a", "==", 2]]}]]],
835 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
841 "columns": ["_uuid", "b", "b2a"],
843 dnl Delete row a0 then check that references to it were removed.
847 "where": [["a", "==", 0]]}]]],
852 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
858 "columns": ["_uuid", "b", "b2a"],
860 dnl Delete row a1 then check that references to it were removed.
864 "where": [["a", "==", 1]]}]]],
869 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
875 "columns": ["_uuid", "b", "b2a"],
877 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
878 [{"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>"]}]}]
879 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
880 [{"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"}]
881 [{"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"}]
882 [{"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"}]
884 [{"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>"]}]}]
885 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
887 [{"rows":[{"_uuid":["uuid","<1>"],"a2a":["uuid","<1>"],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
888 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
891 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}]
894 OVSDB_CHECK_EXECUTION([garbage collection],
896 [dnl Check that inserting a row without any references is a no-op.
905 "columns": ["a"]}]]],
906 dnl Check that inserting a chain of rows that reference each other
907 dnl in turn is also a no-op.
911 "row": {"a": 0, "a2a": ["named-uuid", "row1"]},
912 "uuid-name": "row0"},
915 "row": {"a": 1, "a2a": ["named-uuid", "row2"]},
916 "uuid-name": "row1"},
919 "row": {"a": 2, "a2a": ["named-uuid", "row3"]},
920 "uuid-name": "row2"},
924 "uuid-name": "row3"}]]],
929 "columns": ["a"]}]]],
930 dnl Check that inserting a pair of rows that mutually reference each
931 dnl other causes the rows to be retained.
935 "row": {"a": 4, "a2a": ["named-uuid", "row5"]},
936 "uuid-name": "row4"},
939 "row": {"a": 5, "a2a": ["named-uuid", "row4"]},
940 "uuid-name": "row5"}]]],
947 dnl Check that unreferencing one of the rows causes the other to be deleted.
951 "where": [["a", "==", 4]],
952 "row": {"a2a": ["set", []]}}]]],
957 "columns": ["a"]}]]],
958 dnl Check that inserting a pair of rows that mutually weak reference each
959 dnl other is a no-op.
963 "row": {"a": 6, "wa2a": ["named-uuid", "row7"]},
964 "uuid-name": "row6"},
967 "row": {"a": 7, "wa2a": ["named-uuid", "row6"]},
968 "uuid-name": "row7"}]]],
973 "columns": ["a"]}]]],
974 dnl Check that a circular chain of rows is retained.
978 "row": {"a": 8, "a2a": ["named-uuid", "row9"]},
979 "uuid-name": "row8"},
982 "row": {"a": 9, "a2a": ["named-uuid", "row10"]},
983 "uuid-name": "row9"},
986 "row": {"a": 10, "a2a": ["named-uuid", "row11"]},
987 "uuid-name": "row10"},
990 "row": {"a": 11, "a2a": ["named-uuid", "row8"]},
991 "uuid-name": "row11"}]]],
998 dnl Check that breaking the chain causes all of the rows to be deleted.
1002 "where": [["a", "==", 9]],
1003 "row": {"a2a": ["set", []]}}]]],
1008 "columns": ["a"]}]]],
1009 dnl Check that inserting a row only referenced by itself is a no-op.
1013 "row": {"a": 12, "a2a": ["named-uuid", "self"]},
1014 "uuid-name": "self"}]]],
1019 "columns": ["a"]}]]]],
1020 [[[{"uuid":["uuid","<0>"]}]
1022 [{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
1024 [{"uuid":["uuid","<5>"]},{"uuid":["uuid","<6>"]}]
1025 [{"rows":[{"a":4},{"a":5}]}]
1028 [{"uuid":["uuid","<7>"]},{"uuid":["uuid","<8>"]}]
1030 [{"uuid":["uuid","<9>"]},{"uuid":["uuid","<10>"]},{"uuid":["uuid","<11>"]},{"uuid":["uuid","<12>"]}]
1031 [{"rows":[{"a":8},{"a":9},{"a":10},{"a":11}]}]
1034 [{"uuid":["uuid","<13>"]}]