1 AT_BANNER([OVSDB -- execution])
3 m4_divert_push([PREPARE_TESTS])
12 "number": {"type": "integer"},
13 "name": {"type": "string"}},
14 "indexes": [["number"]]}},
16 "cksum": "12345678 9"}
20 constraint_schema () {
22 {"name": "constraints",
26 "a": {"type": "integer"},
27 "a2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
28 "min": 0, "max": "unlimited"}},
29 "a2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
30 "min": 0, "max": "unlimited"}}}},
33 "b": {"type": "integer"},
34 "b2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
35 "min": 0, "max": "unlimited"}},
36 "b2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
37 "min": 0, "max": "unlimited"}},
38 "x": {"type": {"key": "integer", "min": 1, "max": 2}}}},
41 "positive": {"type": {"key": {"type": "integer",
53 "a": {"type": "integer"},
54 "a2a": {"type": {"key": {"type": "uuid",
57 "min": 0, "max": "unlimited"}},
58 "a2a1": {"type": {"key": {"type": "uuid",
61 "a2b": {"type": {"key": {"type": "uuid",
63 "refType": "weak"}}}}},
66 "b": {"type": "integer"},
67 "b2a": {"type": {"key": {"type": "uuid",
70 "min": 0, "max": "unlimited"}}}}}}
80 "a": {"type": {"key": {"type": "uuid",
82 "min": 0, "max": "unlimited"}}},
86 "a": {"type": "integer"},
87 "a2a": {"type": {"key": {"type": "uuid",
89 "min": 0, "max": "unlimited"}},
90 "a2b": {"type": {"key": {"type": "uuid",
92 "min": 0, "max": "unlimited"}},
93 "wa2a": {"type": {"key": {"type": "uuid",
96 "min": 0, "max": "unlimited"}},
97 "wa2b": {"type": {"key": {"type": "uuid",
100 "min": 0, "max": "unlimited"}}}},
103 "b": {"type": "integer"},
104 "b2a": {"type": {"key": {"type": "uuid",
106 "min": 0, "max": "unlimited"}},
107 "wb2a": {"type": {"key": {"type": "uuid",
110 "min": 0, "max": "unlimited"}}},
115 m4_divert_pop([PREPARE_TESTS])
117 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
119 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
120 # TRANSACTIONS (which should be a quoted list of quoted strings).
122 # Checks that the overall output is OUTPUT, but UUIDs in the output
123 # are replaced by markers of the form <N> where N is a number. The
124 # first unique UUID is replaced by <0>, the next by <1>, and so on.
125 # If a given UUID appears more than once it is always replaced by the
128 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
129 m4_define([OVSDB_CHECK_EXECUTION],
131 AT_KEYWORDS([ovsdb execute execution positive $5])
132 AT_CHECK([test-ovsdb execute "`$2`" m4_foreach([txn], [$3], [ 'txn'])],
134 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
137 OVSDB_CHECK_EXECUTION([uuid-name must be <id>],
143 "uuid-name": "0"}]]]],
144 [[[{"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\"}"}]
147 OVSDB_CHECK_EXECUTION([named-uuid must be <id>],
152 "row": {"a2a": ["named-uuid", "0"]}}]]]],
153 [[[{"details":"named-uuid string is not a valid <id>","error":"syntax error","syntax":"[\"named-uuid\",\"0\"]"}]
156 OVSDB_CHECK_EXECUTION([duplicate uuid-name not allowed],
166 "uuid-name": "x"}]]]],
167 [[[{"uuid":["uuid","<0>"]},{"details":"This \"uuid-name\" appeared on an earlier \"insert\" operation.","error":"duplicate uuid-name","syntax":"\"x\""}]
170 m4_define([EXECUTION_EXAMPLES], [
171 dnl At one point the "commit" code ignored new rows with all-default values,
172 dnl so this checks for that problem.
173 OVSDB_CHECK_EXECUTION([insert default row, query table],
183 [[[{"uuid":["uuid","<0>"]}]
184 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
187 OVSDB_CHECK_EXECUTION([insert row, query table],
192 "row": {"number": 0, "name": "zero"}}]]],
197 [[[{"uuid":["uuid","<0>"]}]
198 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
201 OVSDB_CHECK_EXECUTION([insert rows, query by value],
206 "row": {"number": 0, "name": "zero"}}]]],
210 "row": {"number": 1, "name": "one"}}]]],
214 "where": [["name", "==", "zero"]]}]]],
218 "where": [["name", "==", "one"]]}]]]],
219 [[[{"uuid":["uuid","<0>"]}]
220 [{"uuid":["uuid","<1>"]}]
221 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
222 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
225 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
230 "row": {"number": 0, "name": "zero"},
231 "uuid-name": "first"},
234 "row": {"number": 1, "name": "one"},
235 "uuid-name": "second"},
238 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
241 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
242 [[[{"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}]}]
245 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
250 "row": {"number": 0, "name": "zero"},
251 "uuid-name": "first"}]]],
255 "row": {"number": 1, "name": "one"},
256 "uuid-name": "first"}]]],
260 "where": [["name", "==", "zero"]],
261 "row": {"name": "nought"}}]]],
266 "sort": ["number"]}]]]],
267 [[[{"uuid":["uuid","<0>"]}]
268 [{"uuid":["uuid","<1>"]}]
270 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
273 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
278 "row": {"number": 0, "name": "zero"},
279 "uuid-name": "first"}]]],
283 "row": {"number": 1, "name": "one"},
284 "uuid-name": "first"}]]],
288 "where": [["name", "==", "zero"]],
289 "mutations": [["number", "+=", 2]]}]]],
294 "sort": ["number"]}]]]],
295 [[[{"uuid":["uuid","<0>"]}]
296 [{"uuid":["uuid","<1>"]}]
298 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
301 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
306 "row": {"number": 0, "name": "zero"},
307 "uuid-name": "first"},
310 "row": {"number": 1, "name": "one"},
311 "uuid-name": "second"},
314 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
318 "columns": ["name","number"]}]]]],
319 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
322 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
327 "row": {"number": 0, "name": "zero"},
328 "uuid-name": "first"}]]],
332 "row": {"number": 1, "name": "one"},
333 "uuid-name": "first"}]]],
337 "where": [["name", "==", "zero"]]}]]],
342 [[[{"uuid":["uuid","<0>"]}]
343 [{"uuid":["uuid","<1>"]}]
345 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
348 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
353 "row": {"number": 0, "name": "zero"},
354 "uuid-name": "first"}]]],
358 "row": {"number": 1, "name": "one"},
359 "uuid-name": "first"}]]],
363 "where": [["name", "==", "nought"]]}]]],
368 "sort": ["number"]}]]]],
369 [[[{"uuid":["uuid","<0>"]}]
370 [{"uuid":["uuid","<1>"]}]
372 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
375 OVSDB_CHECK_EXECUTION([insert rows, delete all],
380 "row": {"number": 0, "name": "zero"},
381 "uuid-name": "first"},
384 "row": {"number": 1, "name": "one"},
385 "uuid-name": "second"},
392 "columns": ["name","number"]}]]]],
393 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
396 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
401 "row": {"number": 0, "name": "zero"}},
406 "durable": false}]]]],
407 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
410 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
415 "row": {"number": 0, "name": "zero"}},
420 "durable": true}]]]],
421 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
424 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
429 "row": {"number": 0, "name": "zero"}},
432 "row": {"number": 1, "name": "one"}},
437 "columns": ["name", "number"],
439 "rows": [{"name": "zero", "number": 0},
440 {"name": "one", "number": 1}]}]]]],
441 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
444 OVSDB_CHECK_EXECUTION([equality wait with extra row],
449 "row": {"number": 0, "name": "zero"}},
452 "row": {"number": 1, "name": "one"}},
457 "columns": ["name", "number"],
459 "rows": [{"name": "zero", "number": 0},
460 {"name": "one", "number": 1},
461 {"name": "two", "number": 2}]}]]]],
462 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
465 OVSDB_CHECK_EXECUTION([equality wait with missing row],
470 "row": {"number": 0, "name": "zero"}},
473 "row": {"number": 1, "name": "one"}},
478 "columns": ["name", "number"],
480 "rows": [{"name": "one", "number": 1}]}]]]],
481 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
484 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
489 "row": {"number": 0, "name": "zero"}},
492 "row": {"number": 1, "name": "one"}},
497 "columns": ["name", "number"],
499 "rows": [{"name": "zero", "number": 0},
500 {"name": "one", "number": 1}]}]]]],
501 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
504 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
509 "row": {"number": 0, "name": "zero"}},
512 "row": {"number": 1, "name": "one"}},
517 "columns": ["name", "number"],
519 "rows": [{"name": "zero", "number": 0},
520 {"name": "one", "number": 1},
521 {"name": "two", "number": 2}]}]]]],
522 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
525 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
530 "row": {"number": 0, "name": "zero"}},
533 "row": {"number": 1, "name": "one"}},
538 "columns": ["name", "number"],
540 "rows": [{"name": "one", "number": 1}]}]]]],
541 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
544 OVSDB_CHECK_EXECUTION([insert and update constraints],
548 "table": "constrained",
552 "table": "constrained",
553 "row": {"positive": -1}}]]],
556 "table": "constrained",
558 "row": {"positive": -2}}]]],
561 "table": "constrained",
562 "row": {"positive": 1}}]]],
565 "table": "constrained",
566 "row": {"positive": 2}}]]]],
567 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
568 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
569 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
570 [{"uuid":["uuid","<0>"]}]
571 [{"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"}]
574 OVSDB_CHECK_EXECUTION([index uniqueness checking],
576 dnl Insert initial row.
580 "row": {"number": 1, "name": "one"}}]]],
581 dnl Try to insert row with identical value (fails).
585 "row": {"number": 1, "name": "another one"}}]]],
586 dnl Remove initial row and insert new row with identical value in a single
587 dnl transaction (succeeds).
591 "row": {"number": 1, "name": "another one"}},
594 "where": [["name", "==", "one"]]}]]],
595 dnl Remove row and insert two new rows with identical value in a single
596 dnl transaction (fails).
603 "row": {"number": 1, "name": "one"}},
606 "row": {"number": 1, "name": "still another one"}}]]],
607 dnl Add new row with different value (succeeds).
611 "row": {"number": 2, "name": "two"}}]]],
612 dnl Change rows so values collide (fails).
617 "row": {"number": 3}}]]],
618 dnl Swap rows' values (succeeds).
622 "where": [["number", "==", 1]],
623 "row": {"number": 2, "name": "old two"}},
626 "where": [["name", "==", "two"]],
627 "row": {"number": 1, "name": "old one"}}]]],
628 dnl Change all rows' values to values not used before and insert values that
629 dnl collide (only) with their previous values (succeeds).
634 "mutations": [["number", "*=", 10]]},
637 "row": {"number": 1, "name": "new one"}},
640 "row": {"number": 2, "name": "new two"}},
644 "columns": ["number", "name"],
645 "sort": ["number"]}]]]],
646 [[[{"uuid":["uuid","<0>"]}]
647 [{"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"}]
648 [{"uuid":["uuid","<2>"]},{"count":1}]
649 [{"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"}]
650 [{"uuid":["uuid","<5>"]}]
651 [{"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"}]
652 [{"count":1},{"count":1}]
653 [{"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}]}]
656 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
662 "uuid-name": "brow"},
666 "a2b": ["set", [["named-uuid", "brow"]]]}},
670 "a2b": ["set", [["named-uuid", "brow"]]]}},
674 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
679 dnl Check that "mutate" honors number-of-elements constraints on sets and maps.
684 "mutations": [["x", "delete", 0]]}]]],
688 "where": [["a", "==", 0]]}]]],
696 "where": [["a", "==", 1]]}]]],
704 "where": [["a", "==", 2]]}]]],
709 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
710 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
711 [{"details":"Attempted to store 0 elements in set of 1 to 2 integers.","error":"constraint violation"}]
713 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
715 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
720 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
726 "a2b": ["set", [["named-uuid", "row2"]]],
727 "a2a": ["set", [["named-uuid", "row1"]]]},
728 "uuid-name": "row1"},
732 "b2b": ["set", [["named-uuid", "row2"]]],
733 "b2a": ["set", [["named-uuid", "row1"]]]},
734 "uuid-name": "row2"}]]],
738 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
742 "where": [["a", "==", 0]]}]]],
746 "where": [["b", "==", 1]]}]]],
747 dnl Try the deletions again to make sure that the refcounts got rolled back.
751 "where": [["a", "==", 0]]}]]],
755 "where": [["b", "==", 1]]}]]],
759 "where": [["a", "==", 0]]},
762 "where": [["b", "==", 1]]}]]]],
763 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
764 [{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}]
765 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
766 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
767 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
768 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
769 [{"count":1},{"count":1}]
772 OVSDB_CHECK_EXECUTION([weak references],
778 "a2a": ["set", [["named-uuid", "row1"],
779 ["named-uuid", "row2"],
780 ["uuid", "0e767b36-6822-4044-8307-d58467e04669"]]],
781 "a2a1": ["named-uuid", "row1"],
782 "a2b": ["named-uuid", "row3"]},
783 "uuid-name": "row1"},
787 "a2a": ["set", [["named-uuid", "row1"],
788 ["named-uuid", "row2"]]],
789 "a2a1": ["named-uuid", "row2"],
790 "a2b": ["named-uuid", "row3"]},
791 "uuid-name": "row2"},
795 "a2a": ["set", [["named-uuid", "row1"],
796 ["named-uuid", "row2"]]],
797 "a2a1": ["named-uuid", "row2"],
798 "a2b": ["named-uuid", "row4"]}},
802 "b2a": ["named-uuid", "row1"]},
803 "uuid-name": "row3"},
807 "b2a": ["named-uuid", "row2"]},
808 "uuid-name": "row4"}]]],
809 dnl Check that the nonexistent row UUID we added to row a0 was deleted,
810 dnl and that other rows were inserted as requested.
815 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
821 "columns": ["_uuid", "b", "b2a"],
823 dnl Try to insert invalid all-zeros weak reference (the default) into
824 dnl "a2b", which requires exactly one value.
828 "row": {"a2a1": ["named-uuid", "me"]},
829 "uuid-name": "me"}]]],
830 dnl Try to delete row from "b" that is referred to by weak references
831 dnl from "a" table "a2b" column that requires exactly one value.
835 "where": [["b", "==", 3]]}]]],
836 dnl Try to delete row from "a" that is referred to by weak references
837 dnl from "a" table "a2a1" column that requires exactly one value.
841 "where": [["a", "==", 1]]}]]],
842 dnl Delete the row that had the reference that caused the previous
843 dnl deletion to fail, then check that other rows are unchanged.
847 "where": [["a", "==", 2]]}]]],
852 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
858 "columns": ["_uuid", "b", "b2a"],
860 dnl Delete row a0 then check that references to it were removed.
864 "where": [["a", "==", 0]]}]]],
869 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
875 "columns": ["_uuid", "b", "b2a"],
877 dnl Delete row a1 then check that references to it were removed.
881 "where": [["a", "==", 1]]}]]],
886 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
892 "columns": ["_uuid", "b", "b2a"],
894 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
895 [{"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>"]}]}]
896 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
897 [{"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"}]
898 [{"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"}]
899 [{"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"}]
901 [{"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>"]}]}]
902 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
904 [{"rows":[{"_uuid":["uuid","<1>"],"a2a":["uuid","<1>"],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
905 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
908 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}]
911 OVSDB_CHECK_EXECUTION([garbage collection],
913 [dnl Check that inserting a row without any references is a no-op.
922 "columns": ["a"]}]]],
923 dnl Check that inserting a chain of rows that reference each other
924 dnl in turn is also a no-op.
928 "row": {"a": 0, "a2a": ["named-uuid", "row1"]},
929 "uuid-name": "row0"},
932 "row": {"a": 1, "a2a": ["named-uuid", "row2"]},
933 "uuid-name": "row1"},
936 "row": {"a": 2, "a2a": ["named-uuid", "row3"]},
937 "uuid-name": "row2"},
941 "uuid-name": "row3"}]]],
946 "columns": ["a"]}]]],
947 dnl Check that inserting a pair of rows that mutually reference each
948 dnl other causes the rows to be retained.
952 "row": {"a": 4, "a2a": ["named-uuid", "row5"]},
953 "uuid-name": "row4"},
956 "row": {"a": 5, "a2a": ["named-uuid", "row4"]},
957 "uuid-name": "row5"}]]],
964 dnl Check that unreferencing one of the rows causes the other to be deleted.
968 "where": [["a", "==", 4]],
969 "row": {"a2a": ["set", []]}}]]],
974 "columns": ["a"]}]]],
975 dnl Check that inserting a pair of rows that mutually weak reference each
976 dnl other is a no-op.
980 "row": {"a": 6, "wa2a": ["named-uuid", "row7"]},
981 "uuid-name": "row6"},
984 "row": {"a": 7, "wa2a": ["named-uuid", "row6"]},
985 "uuid-name": "row7"}]]],
990 "columns": ["a"]}]]],
991 dnl Check that a circular chain of rows is retained.
995 "row": {"a": 8, "a2a": ["named-uuid", "row9"]},
996 "uuid-name": "row8"},
999 "row": {"a": 9, "a2a": ["named-uuid", "row10"]},
1000 "uuid-name": "row9"},
1003 "row": {"a": 10, "a2a": ["named-uuid", "row11"]},
1004 "uuid-name": "row10"},
1007 "row": {"a": 11, "a2a": ["named-uuid", "row8"]},
1008 "uuid-name": "row11"}]]],
1015 dnl Check that breaking the chain causes all of the rows to be deleted.
1019 "where": [["a", "==", 9]],
1020 "row": {"a2a": ["set", []]}}]]],
1025 "columns": ["a"]}]]],
1026 dnl Check that inserting a row only referenced by itself is a no-op.
1030 "row": {"a": 12, "a2a": ["named-uuid", "self"]},
1031 "uuid-name": "self"}]]],
1036 "columns": ["a"]}]]]],
1037 [[[{"uuid":["uuid","<0>"]}]
1039 [{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
1041 [{"uuid":["uuid","<5>"]},{"uuid":["uuid","<6>"]}]
1042 [{"rows":[{"a":4},{"a":5}]}]
1045 [{"uuid":["uuid","<7>"]},{"uuid":["uuid","<8>"]}]
1047 [{"uuid":["uuid","<9>"]},{"uuid":["uuid","<10>"]},{"uuid":["uuid","<11>"]},{"uuid":["uuid","<12>"]}]
1048 [{"rows":[{"a":8},{"a":9},{"a":10},{"a":11}]}]
1051 [{"uuid":["uuid","<13>"]}]