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 immutable_schema () {
117 {"name": "immutable",
120 "columns": {"i": {"type": "integer", "mutable": false}}}}}
124 m4_divert_pop([PREPARE_TESTS])
126 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
128 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
129 # TRANSACTIONS (which should be a quoted list of quoted strings).
131 # Checks that the overall output is OUTPUT, but UUIDs in the output
132 # are replaced by markers of the form <N> where N is a number. The
133 # first unique UUID is replaced by <0>, the next by <1>, and so on.
134 # If a given UUID appears more than once it is always replaced by the
137 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
138 m4_define([OVSDB_CHECK_EXECUTION],
140 AT_KEYWORDS([ovsdb execute execution positive $5])
141 OVS_RUNDIR=`pwd`; export OVS_RUNDIR
142 AT_CHECK([test-ovsdb execute "`$2`" m4_foreach([txn], [$3], [ 'txn'])],
144 AT_CHECK([${PERL} $srcdir/uuidfilt.pl stdout], [0], [$4])
147 OVSDB_CHECK_EXECUTION([uuid-name must be <id>],
153 "uuid-name": "0"}]]]],
154 [[[{"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\"}"}]
157 OVSDB_CHECK_EXECUTION([named-uuid must be <id>],
162 "row": {"a2a": ["named-uuid", "0"]}}]]]],
163 [[[{"details":"named-uuid string is not a valid <id>","error":"syntax error","syntax":"[\"named-uuid\",\"0\"]"}]
166 OVSDB_CHECK_EXECUTION([duplicate uuid-name not allowed],
176 "uuid-name": "x"}]]]],
177 [[[{"uuid":["uuid","<0>"]},{"details":"This \"uuid-name\" appeared on an earlier \"insert\" operation.","error":"duplicate uuid-name","syntax":"\"x\""}]
180 m4_define([ONE_EXECUTION_EXAMPLE], [dnl
181 dnl At one point the "commit" code ignored new rows with all-default values,
182 dnl so this checks for that problem.
183 OVSDB_CHECK_EXECUTION([insert default row, query table],
193 [[[{"uuid":["uuid","<0>"]}]
194 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
198 m4_define([EXECUTION_EXAMPLES], [
199 ONE_EXECUTION_EXAMPLE
200 OVSDB_CHECK_EXECUTION([insert row, query table],
205 "row": {"number": 0, "name": "zero"}}]]],
210 [[[{"uuid":["uuid","<0>"]}]
211 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
214 OVSDB_CHECK_EXECUTION([insert rows, query by value],
219 "row": {"number": 0, "name": "zero"}}]]],
223 "row": {"number": 1, "name": "one"}}]]],
227 "where": [["name", "==", "zero"]]}]]],
231 "where": [["name", "==", "one"]]}]]]],
232 [[[{"uuid":["uuid","<0>"]}]
233 [{"uuid":["uuid","<1>"]}]
234 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
235 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
238 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
243 "row": {"number": 0, "name": "zero"},
244 "uuid-name": "first"},
247 "row": {"number": 1, "name": "one"},
248 "uuid-name": "second"},
251 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
254 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
255 [[[{"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}]}]
258 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
263 "row": {"number": 0, "name": "zero"},
264 "uuid-name": "first"}]]],
268 "row": {"number": 1, "name": "one"},
269 "uuid-name": "first"}]]],
273 "where": [["name", "==", "zero"]],
274 "row": {"name": "nought"}}]]],
279 "sort": ["number"]}]]]],
280 [[[{"uuid":["uuid","<0>"]}]
281 [{"uuid":["uuid","<1>"]}]
283 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
286 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
291 "row": {"number": 0, "name": "zero"},
292 "uuid-name": "first"}]]],
296 "row": {"number": 1, "name": "one"},
297 "uuid-name": "first"}]]],
301 "where": [["name", "==", "zero"]],
302 "mutations": [["number", "+=", 2]]}]]],
307 "sort": ["number"]}]]]],
308 [[[{"uuid":["uuid","<0>"]}]
309 [{"uuid":["uuid","<1>"]}]
311 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
314 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
319 "row": {"number": 0, "name": "zero"},
320 "uuid-name": "first"},
323 "row": {"number": 1, "name": "one"},
324 "uuid-name": "second"},
327 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
331 "columns": ["name","number"]}]]]],
332 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
335 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
340 "row": {"number": 0, "name": "zero"},
341 "uuid-name": "first"}]]],
345 "row": {"number": 1, "name": "one"},
346 "uuid-name": "first"}]]],
350 "where": [["name", "==", "zero"]]}]]],
355 [[[{"uuid":["uuid","<0>"]}]
356 [{"uuid":["uuid","<1>"]}]
358 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
361 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
366 "row": {"number": 0, "name": "zero"},
367 "uuid-name": "first"}]]],
371 "row": {"number": 1, "name": "one"},
372 "uuid-name": "first"}]]],
376 "where": [["name", "==", "nought"]]}]]],
381 "sort": ["number"]}]]]],
382 [[[{"uuid":["uuid","<0>"]}]
383 [{"uuid":["uuid","<1>"]}]
385 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
388 OVSDB_CHECK_EXECUTION([insert rows, delete all],
393 "row": {"number": 0, "name": "zero"},
394 "uuid-name": "first"},
397 "row": {"number": 1, "name": "one"},
398 "uuid-name": "second"},
405 "columns": ["name","number"]}]]]],
406 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
409 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
414 "row": {"number": 0, "name": "zero"}},
419 "durable": false}]]]],
420 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
423 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
428 "row": {"number": 0, "name": "zero"}},
433 "durable": true}]]]],
434 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
437 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
442 "row": {"number": 0, "name": "zero"}},
445 "row": {"number": 1, "name": "one"}},
450 "columns": ["name", "number"],
452 "rows": [{"name": "zero", "number": 0},
453 {"name": "one", "number": 1}]}]]]],
454 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
457 OVSDB_CHECK_EXECUTION([equality wait with extra row],
462 "row": {"number": 0, "name": "zero"}},
465 "row": {"number": 1, "name": "one"}},
470 "columns": ["name", "number"],
472 "rows": [{"name": "zero", "number": 0},
473 {"name": "one", "number": 1},
474 {"name": "two", "number": 2}]}]]]],
475 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
478 OVSDB_CHECK_EXECUTION([equality wait with missing row],
483 "row": {"number": 0, "name": "zero"}},
486 "row": {"number": 1, "name": "one"}},
491 "columns": ["name", "number"],
493 "rows": [{"name": "one", "number": 1}]}]]]],
494 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
497 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
502 "row": {"number": 0, "name": "zero"}},
505 "row": {"number": 1, "name": "one"}},
510 "columns": ["name", "number"],
512 "rows": [{"name": "zero", "number": 0},
513 {"name": "one", "number": 1}]}]]]],
514 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
517 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
522 "row": {"number": 0, "name": "zero"}},
525 "row": {"number": 1, "name": "one"}},
530 "columns": ["name", "number"],
532 "rows": [{"name": "zero", "number": 0},
533 {"name": "one", "number": 1},
534 {"name": "two", "number": 2}]}]]]],
535 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
538 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
543 "row": {"number": 0, "name": "zero"}},
546 "row": {"number": 1, "name": "one"}},
551 "columns": ["name", "number"],
553 "rows": [{"name": "one", "number": 1}]}]]]],
554 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
557 OVSDB_CHECK_EXECUTION([insert and update constraints],
561 "table": "constrained",
565 "table": "constrained",
566 "row": {"positive": -1}}]]],
569 "table": "constrained",
571 "row": {"positive": -2}}]]],
574 "table": "constrained",
575 "row": {"positive": 1}}]]],
578 "table": "constrained",
579 "row": {"positive": 2}}]]]],
580 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
581 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
582 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
583 [{"uuid":["uuid","<0>"]}]
584 [{"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"}]
587 OVSDB_CHECK_EXECUTION([index uniqueness checking],
589 dnl Insert initial row.
593 "row": {"number": 1, "name": "one"}}]]],
594 dnl Try to insert row with identical value (fails).
598 "row": {"number": 1, "name": "another one"}}]]],
599 dnl Remove initial row and insert new row with identical value in a single
600 dnl transaction (succeeds).
604 "row": {"number": 1, "name": "another one"}},
607 "where": [["name", "==", "one"]]}]]],
608 dnl Remove row and insert two new rows with identical value in a single
609 dnl transaction (fails).
616 "row": {"number": 1, "name": "one"}},
619 "row": {"number": 1, "name": "still another one"}}]]],
620 dnl Add new row with different value (succeeds).
624 "row": {"number": 2, "name": "two"}}]]],
625 dnl Change rows so values collide (fails).
630 "row": {"number": 3}}]]],
631 dnl Swap rows' values (succeeds).
635 "where": [["number", "==", 1]],
636 "row": {"number": 2, "name": "old two"}},
639 "where": [["name", "==", "two"]],
640 "row": {"number": 1, "name": "old one"}}]]],
641 dnl Change all rows' values to values not used before and insert values that
642 dnl collide (only) with their previous values (succeeds).
647 "mutations": [["number", "*=", 10]]},
650 "row": {"number": 1, "name": "new one"}},
653 "row": {"number": 2, "name": "new two"}},
657 "columns": ["number", "name"],
658 "sort": ["number"]}]]]],
659 [[[{"uuid":["uuid","<0>"]}]
660 [{"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"}]
661 [{"uuid":["uuid","<2>"]},{"count":1}]
662 [{"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"}]
663 [{"uuid":["uuid","<5>"]}]
664 [{"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"}]
665 [{"count":1},{"count":1}]
666 [{"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}]}]
669 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
675 "uuid-name": "brow"},
679 "a2b": ["set", [["named-uuid", "brow"]]]}},
683 "a2b": ["set", [["named-uuid", "brow"]]]}},
687 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
692 dnl Check that "mutate" honors number-of-elements constraints on sets and maps.
697 "mutations": [["x", "delete", 0]]}]]],
701 "where": [["a", "==", 0]]}]]],
709 "where": [["a", "==", 1]]}]]],
717 "where": [["a", "==", 2]]}]]],
722 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
723 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
724 [{"details":"Attempted to store 0 elements in set of 1 to 2 integers.","error":"constraint violation"}]
726 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
728 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
733 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
739 "a2b": ["set", [["named-uuid", "row2"]]],
740 "a2a": ["set", [["named-uuid", "row1"]]]},
741 "uuid-name": "row1"},
745 "b2b": ["set", [["named-uuid", "row2"]]],
746 "b2a": ["set", [["named-uuid", "row1"]]]},
747 "uuid-name": "row2"}]]],
751 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
755 "where": [["a", "==", 0]]}]]],
759 "where": [["b", "==", 1]]}]]],
760 dnl Try the deletions again to make sure that the refcounts got rolled back.
764 "where": [["a", "==", 0]]}]]],
768 "where": [["b", "==", 1]]}]]],
772 "where": [["a", "==", 0]]},
775 "where": [["b", "==", 1]]}]]]],
776 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
777 [{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}]
778 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
779 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
780 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
781 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
782 [{"count":1},{"count":1}]
785 OVSDB_CHECK_EXECUTION([weak references],
791 "a2a": ["set", [["named-uuid", "row1"],
792 ["named-uuid", "row2"],
793 ["uuid", "0e767b36-6822-4044-8307-d58467e04669"]]],
794 "a2a1": ["named-uuid", "row1"],
795 "a2b": ["named-uuid", "row3"]},
796 "uuid-name": "row1"},
800 "a2a": ["set", [["named-uuid", "row1"],
801 ["named-uuid", "row2"]]],
802 "a2a1": ["named-uuid", "row2"],
803 "a2b": ["named-uuid", "row3"]},
804 "uuid-name": "row2"},
808 "a2a": ["set", [["named-uuid", "row1"],
809 ["named-uuid", "row2"]]],
810 "a2a1": ["named-uuid", "row2"],
811 "a2b": ["named-uuid", "row4"]}},
815 "b2a": ["named-uuid", "row1"]},
816 "uuid-name": "row3"},
820 "b2a": ["named-uuid", "row2"]},
821 "uuid-name": "row4"}]]],
822 dnl Check that the nonexistent row UUID we added to row a0 was deleted,
823 dnl and that other rows were inserted as requested.
828 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
834 "columns": ["_uuid", "b", "b2a"],
836 dnl Try to insert invalid all-zeros weak reference (the default) into
837 dnl "a2b", which requires exactly one value.
841 "row": {"a2a1": ["named-uuid", "me"]},
842 "uuid-name": "me"}]]],
843 dnl Try to delete row from "b" that is referred to by weak references
844 dnl from "a" table "a2b" column that requires exactly one value.
848 "where": [["b", "==", 3]]}]]],
849 dnl Try to delete row from "a" that is referred to by weak references
850 dnl from "a" table "a2a1" column that requires exactly one value.
854 "where": [["a", "==", 1]]}]]],
855 dnl Delete the row that had the reference that caused the previous
856 dnl deletion to fail, then check that other rows are unchanged.
860 "where": [["a", "==", 2]]}]]],
865 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
871 "columns": ["_uuid", "b", "b2a"],
873 dnl Delete row a0 then check that references to it were removed.
877 "where": [["a", "==", 0]]}]]],
882 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
888 "columns": ["_uuid", "b", "b2a"],
890 dnl Delete row a1 then check that references to it were removed.
894 "where": [["a", "==", 1]]}]]],
899 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
905 "columns": ["_uuid", "b", "b2a"],
907 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
908 [{"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>"]}]}]
909 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
910 [{"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"}]
911 [{"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"}]
912 [{"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"}]
914 [{"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>"]}]}]
915 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
917 [{"rows":[{"_uuid":["uuid","<1>"],"a2a":["uuid","<1>"],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
918 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
921 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}]
924 OVSDB_CHECK_EXECUTION([immutable columns],
930 "uuid-name": "row1"}]]],
945 "mutations": [["i", "-=", 5]]}]]],
950 "mutations": [["i", "*=", 1]]}]]]],
951 [[[{"uuid":["uuid","<0>"]}]
952 [{"details":"Cannot update immutable column i in table a.","error":"constraint violation","syntax":"{\"op\":\"update\",\"row\":{\"i\":10},\"table\":\"a\",\"where\":[]}"}]
953 [{"details":"Cannot update immutable column i in table a.","error":"constraint violation","syntax":"{\"op\":\"update\",\"row\":{\"i\":5},\"table\":\"a\",\"where\":[]}"}]
954 [{"details":"Cannot mutate immutable column i in table a.","error":"constraint violation","syntax":"[\"i\",\"-=\",5]"}]
955 [{"details":"Cannot mutate immutable column i in table a.","error":"constraint violation","syntax":"[\"i\",\"*=\",1]"}]
958 OVSDB_CHECK_EXECUTION([garbage collection],
960 [dnl Check that inserting a row without any references is a no-op.
969 "columns": ["a"]}]]],
970 dnl Check that inserting a chain of rows that reference each other
971 dnl in turn is also a no-op.
975 "row": {"a": 0, "a2a": ["named-uuid", "row1"]},
976 "uuid-name": "row0"},
979 "row": {"a": 1, "a2a": ["named-uuid", "row2"]},
980 "uuid-name": "row1"},
983 "row": {"a": 2, "a2a": ["named-uuid", "row3"]},
984 "uuid-name": "row2"},
988 "uuid-name": "row3"}]]],
993 "columns": ["a"]}]]],
994 dnl Check that inserting a pair of rows that mutually reference each
995 dnl other causes the rows to be retained.
999 "row": {"a": 4, "a2a": ["named-uuid", "row5"]},
1000 "uuid-name": "row4"},
1003 "row": {"a": 5, "a2a": ["named-uuid", "row4"]},
1004 "uuid-name": "row5"}]]],
1011 dnl Check that unreferencing one of the rows causes the other to be deleted.
1015 "where": [["a", "==", 4]],
1016 "row": {"a2a": ["set", []]}}]]],
1021 "columns": ["a"]}]]],
1022 dnl Check that inserting a pair of rows that mutually weak reference each
1023 dnl other is a no-op.
1027 "row": {"a": 6, "wa2a": ["named-uuid", "row7"]},
1028 "uuid-name": "row6"},
1031 "row": {"a": 7, "wa2a": ["named-uuid", "row6"]},
1032 "uuid-name": "row7"}]]],
1037 "columns": ["a"]}]]],
1038 dnl Check that a circular chain of rows is retained.
1042 "row": {"a": 8, "a2a": ["named-uuid", "row9"]},
1043 "uuid-name": "row8"},
1046 "row": {"a": 9, "a2a": ["named-uuid", "row10"]},
1047 "uuid-name": "row9"},
1050 "row": {"a": 10, "a2a": ["named-uuid", "row11"]},
1051 "uuid-name": "row10"},
1054 "row": {"a": 11, "a2a": ["named-uuid", "row8"]},
1055 "uuid-name": "row11"}]]],
1062 dnl Check that breaking the chain causes all of the rows to be deleted.
1066 "where": [["a", "==", 9]],
1067 "row": {"a2a": ["set", []]}}]]],
1072 "columns": ["a"]}]]],
1073 dnl Check that inserting a row only referenced by itself is a no-op.
1077 "row": {"a": 12, "a2a": ["named-uuid", "self"]},
1078 "uuid-name": "self"}]]],
1083 "columns": ["a"]}]]]],
1084 [[[{"uuid":["uuid","<0>"]}]
1086 [{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
1088 [{"uuid":["uuid","<5>"]},{"uuid":["uuid","<6>"]}]
1089 [{"rows":[{"a":4},{"a":5}]}]
1092 [{"uuid":["uuid","<7>"]},{"uuid":["uuid","<8>"]}]
1094 [{"uuid":["uuid","<9>"]},{"uuid":["uuid","<10>"]},{"uuid":["uuid","<11>"]},{"uuid":["uuid","<12>"]}]
1095 [{"rows":[{"a":8},{"a":9},{"a":10},{"a":11}]}]
1098 [{"uuid":["uuid","<13>"]}]