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])
127 # OVSDB_CHECK_EXECUTION_RO(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
129 # Runs "test-ovsdb execute-readonly" with the given SCHEMA and each of the
130 # TRANSACTIONS (which should be a quoted list of quoted strings).
132 # Checks that the overall output is OUTPUT, but UUIDs in the output
133 # are replaced by markers of the form <N> where N is a number. The
134 # first unique UUID is replaced by <0>, the next by <1>, and so on.
135 # If a given UUID appears more than once it is always replaced by the
138 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
139 m4_define([OVSDB_CHECK_EXECUTION_RO],
141 AT_KEYWORDS([ovsdb execute execution positive $5])
142 AT_CHECK([test-ovsdb execute-readonly "`$2`" m4_foreach([txn], [$3],
143 [ 'txn'])], [0], [stdout], [])
144 AT_CHECK([uuidfilt stdout], [0], [$4])
147 OVSDB_CHECK_EXECUTION_RO([block insert on read only DB],
153 [[[{"details":"insert operation not allowed when database server is in read only mode","error":"not allowed"}]
156 OVSDB_CHECK_EXECUTION_RO([allow select on read only DB],
165 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
167 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
168 # TRANSACTIONS (which should be a quoted list of quoted strings).
170 # Checks that the overall output is OUTPUT, but UUIDs in the output
171 # are replaced by markers of the form <N> where N is a number. The
172 # first unique UUID is replaced by <0>, the next by <1>, and so on.
173 # If a given UUID appears more than once it is always replaced by the
176 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
177 m4_define([OVSDB_CHECK_EXECUTION],
179 AT_KEYWORDS([ovsdb execute execution positive $5])
180 AT_CHECK([test-ovsdb execute "`$2`" m4_foreach([txn], [$3], [ 'txn'])],
182 AT_CHECK([uuidfilt stdout], [0], [$4])
185 OVSDB_CHECK_EXECUTION([uuid-name must be <id>],
191 "uuid-name": "0"}]]]],
192 [[[{"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\"}"}]
195 OVSDB_CHECK_EXECUTION([named-uuid must be <id>],
200 "row": {"a2a": ["named-uuid", "0"]}}]]]],
201 [[[{"details":"named-uuid string is not a valid <id>","error":"syntax error","syntax":"[\"named-uuid\",\"0\"]"}]
204 OVSDB_CHECK_EXECUTION([duplicate uuid-name not allowed],
214 "uuid-name": "x"}]]]],
215 [[[{"uuid":["uuid","<0>"]},{"details":"This \"uuid-name\" appeared on an earlier \"insert\" operation.","error":"duplicate uuid-name","syntax":"\"x\""}]
218 m4_define([ONE_EXECUTION_EXAMPLE], [dnl
219 dnl At one point the "commit" code ignored new rows with all-default values,
220 dnl so this checks for that problem.
221 OVSDB_CHECK_EXECUTION([insert default row, query table],
231 [[[{"uuid":["uuid","<0>"]}]
232 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
236 m4_define([EXECUTION_EXAMPLES], [
237 ONE_EXECUTION_EXAMPLE
238 OVSDB_CHECK_EXECUTION([insert row, query table],
243 "row": {"number": 0, "name": "zero"}}]]],
248 [[[{"uuid":["uuid","<0>"]}]
249 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
252 OVSDB_CHECK_EXECUTION([insert row with uuid, query table],
254 dnl Insert initial row.
257 "uuid": "ffffffff-971b-4cba-bf42-520515973b7e",
259 "row": {"number": 0, "name": "zero"}}]]],
265 dnl Attempt to insert second row with same UUID (fails).
268 "uuid": "ffffffff-971b-4cba-bf42-520515973b7e",
270 "row": {"number": 0, "name": "zero"}}]]]],
271 [[[{"uuid":["uuid","ffffffff-971b-4cba-bf42-520515973b7e"]}]
272 [{"rows":[{"_uuid":["uuid","ffffffff-971b-4cba-bf42-520515973b7e"],"_version":["uuid","<0>"],"name":"zero","number":0}]}]
273 [{"details":"This UUID would duplicate a UUID already present within the table or deleted within the same transaction.","error":"duplicate uuid","syntax":"\"ffffffff-971b-4cba-bf42-520515973b7e\""}]
276 OVSDB_CHECK_EXECUTION([insert rows, query by value],
281 "row": {"number": 0, "name": "zero"}}]]],
285 "row": {"number": 1, "name": "one"}}]]],
289 "where": [["name", "==", "zero"]]}]]],
293 "where": [["name", "==", "one"]]}]]]],
294 [[[{"uuid":["uuid","<0>"]}]
295 [{"uuid":["uuid","<1>"]}]
296 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
297 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
300 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
305 "row": {"number": 0, "name": "zero"},
306 "uuid-name": "first"},
309 "row": {"number": 1, "name": "one"},
310 "uuid-name": "second"},
313 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
316 "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
317 [[[{"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}]}]
320 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
325 "row": {"number": 0, "name": "zero"},
326 "uuid-name": "first"}]]],
330 "row": {"number": 1, "name": "one"},
331 "uuid-name": "first"}]]],
335 "where": [["name", "==", "zero"]],
336 "row": {"name": "nought"}}]]],
341 "sort": ["number"]}]]]],
342 [[[{"uuid":["uuid","<0>"]}]
343 [{"uuid":["uuid","<1>"]}]
345 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
348 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
353 "row": {"number": 0, "name": "zero"},
354 "uuid-name": "first"}]]],
358 "row": {"number": 1, "name": "one"},
359 "uuid-name": "first"}]]],
363 "where": [["name", "==", "zero"]],
364 "mutations": [["number", "+=", 2]]}]]],
369 "sort": ["number"]}]]]],
370 [[[{"uuid":["uuid","<0>"]}]
371 [{"uuid":["uuid","<1>"]}]
373 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
376 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
381 "row": {"number": 0, "name": "zero"},
382 "uuid-name": "first"},
385 "row": {"number": 1, "name": "one"},
386 "uuid-name": "second"},
389 "where": [["_uuid", "==", ["named-uuid", "first"]]]},
393 "columns": ["name","number"]}]]]],
394 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
397 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
402 "row": {"number": 0, "name": "zero"},
403 "uuid-name": "first"}]]],
407 "row": {"number": 1, "name": "one"},
408 "uuid-name": "first"}]]],
412 "where": [["name", "==", "zero"]]}]]],
417 [[[{"uuid":["uuid","<0>"]}]
418 [{"uuid":["uuid","<1>"]}]
420 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
423 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
428 "row": {"number": 0, "name": "zero"},
429 "uuid-name": "first"}]]],
433 "row": {"number": 1, "name": "one"},
434 "uuid-name": "first"}]]],
438 "where": [["name", "==", "nought"]]}]]],
443 "sort": ["number"]}]]]],
444 [[[{"uuid":["uuid","<0>"]}]
445 [{"uuid":["uuid","<1>"]}]
447 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
450 OVSDB_CHECK_EXECUTION([insert rows, delete all],
455 "row": {"number": 0, "name": "zero"},
456 "uuid-name": "first"},
459 "row": {"number": 1, "name": "one"},
460 "uuid-name": "second"},
467 "columns": ["name","number"]}]]]],
468 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
471 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
476 "row": {"number": 0, "name": "zero"}},
481 "durable": false}]]]],
482 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
485 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
490 "row": {"number": 0, "name": "zero"}},
495 "durable": true}]]]],
496 [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
499 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
504 "row": {"number": 0, "name": "zero"}},
507 "row": {"number": 1, "name": "one"}},
512 "columns": ["name", "number"],
514 "rows": [{"name": "zero", "number": 0},
515 {"name": "one", "number": 1}]}]]]],
516 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
519 OVSDB_CHECK_EXECUTION([equality wait with extra row],
524 "row": {"number": 0, "name": "zero"}},
527 "row": {"number": 1, "name": "one"}},
532 "columns": ["name", "number"],
534 "rows": [{"name": "zero", "number": 0},
535 {"name": "one", "number": 1},
536 {"name": "two", "number": 2}]}]]]],
537 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"where\" clause test failed","error":"timed out"}]
540 OVSDB_CHECK_EXECUTION([equality wait with missing row],
545 "row": {"number": 0, "name": "zero"}},
548 "row": {"number": 1, "name": "one"}},
553 "columns": ["name", "number"],
555 "rows": [{"name": "one", "number": 1}]}]]]],
556 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"where\" clause test failed","error":"timed out"}]
559 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
564 "row": {"number": 0, "name": "zero"}},
567 "row": {"number": 1, "name": "one"}},
572 "columns": ["name", "number"],
574 "rows": [{"name": "zero", "number": 0},
575 {"name": "one", "number": 1}]}]]]],
576 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"where\" clause test failed","error":"timed out"}]
579 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
584 "row": {"number": 0, "name": "zero"}},
587 "row": {"number": 1, "name": "one"}},
592 "columns": ["name", "number"],
594 "rows": [{"name": "zero", "number": 0},
595 {"name": "one", "number": 1},
596 {"name": "two", "number": 2}]}]]]],
597 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
600 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
605 "row": {"number": 0, "name": "zero"}},
608 "row": {"number": 1, "name": "one"}},
613 "columns": ["name", "number"],
615 "rows": [{"name": "one", "number": 1}]}]]]],
616 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
619 OVSDB_CHECK_EXECUTION([insert and update constraints],
623 "table": "constrained",
627 "table": "constrained",
628 "row": {"positive": -1}}]]],
631 "table": "constrained",
633 "row": {"positive": -2}}]]],
636 "table": "constrained",
637 "row": {"positive": 1}}]]],
640 "table": "constrained",
641 "row": {"positive": 2}}]]]],
642 [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
643 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
644 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
645 [{"uuid":["uuid","<0>"]}]
646 [{"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"}]
649 OVSDB_CHECK_EXECUTION([index uniqueness checking],
651 dnl Insert initial row.
655 "row": {"number": 1, "name": "one"}}]]],
656 dnl Try to insert row with identical value (fails).
660 "row": {"number": 1, "name": "another one"}}]]],
661 dnl Remove initial row and insert new row with identical value in a single
662 dnl transaction (succeeds).
666 "row": {"number": 1, "name": "another one"}},
669 "where": [["name", "==", "one"]]}]]],
670 dnl Remove row and insert two new rows with identical value in a single
671 dnl transaction (fails).
678 "row": {"number": 1, "name": "one"}},
681 "row": {"number": 1, "name": "still another one"}}]]],
682 dnl Add new row with different value (succeeds).
686 "row": {"number": 2, "name": "two"}}]]],
687 dnl Change rows so values collide (fails).
692 "row": {"number": 3}}]]],
693 dnl Swap rows' values (succeeds).
697 "where": [["number", "==", 1]],
698 "row": {"number": 2, "name": "old two"}},
701 "where": [["name", "==", "two"]],
702 "row": {"number": 1, "name": "old one"}}]]],
703 dnl Change all rows' values to values not used before and insert values that
704 dnl collide (only) with their previous values (succeeds).
709 "mutations": [["number", "*=", 10]]},
712 "row": {"number": 1, "name": "new one"}},
715 "row": {"number": 2, "name": "new two"}},
719 "columns": ["number", "name"],
720 "sort": ["number"]}]]]],
721 [[[{"uuid":["uuid","<0>"]}]
722 [{"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"}]
723 [{"uuid":["uuid","<2>"]},{"count":1}]
724 [{"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"}]
725 [{"uuid":["uuid","<5>"]}]
726 [{"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"}]
727 [{"count":1},{"count":1}]
728 [{"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}]}]
731 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
737 "uuid-name": "brow"},
741 "a2b": ["set", [["named-uuid", "brow"]]]}},
745 "a2b": ["set", [["named-uuid", "brow"]]]}},
749 "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
754 dnl Check that "mutate" honors number-of-elements constraints on sets and maps.
759 "mutations": [["x", "delete", 0]]}]]],
763 "where": [["a", "==", 0]]}]]],
771 "where": [["a", "==", 1]]}]]],
779 "where": [["a", "==", 2]]}]]],
784 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
785 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
786 [{"details":"Attempted to store 0 elements in set of 1 to 2 integers.","error":"constraint violation"}]
788 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
790 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
795 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
801 "a2b": ["set", [["named-uuid", "row2"]]],
802 "a2a": ["set", [["named-uuid", "row1"]]]},
803 "uuid-name": "row1"},
807 "b2b": ["set", [["named-uuid", "row2"]]],
808 "b2a": ["set", [["named-uuid", "row1"]]]},
809 "uuid-name": "row2"}]]],
813 "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
817 "where": [["a", "==", 0]]}]]],
821 "where": [["b", "==", 1]]}]]],
822 dnl Try the deletions again to make sure that the refcounts got rolled back.
826 "where": [["a", "==", 0]]}]]],
830 "where": [["b", "==", 1]]}]]],
834 "where": [["a", "==", 0]]},
837 "where": [["b", "==", 1]]}]]]],
838 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
839 [{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}]
840 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
841 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
842 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
843 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
844 [{"count":1},{"count":1}]
847 OVSDB_CHECK_EXECUTION([weak references],
853 "a2a": ["set", [["named-uuid", "row1"],
854 ["named-uuid", "row2"],
855 ["uuid", "0e767b36-6822-4044-8307-d58467e04669"]]],
856 "a2a1": ["named-uuid", "row1"],
857 "a2b": ["named-uuid", "row3"]},
858 "uuid-name": "row1"},
862 "a2a": ["set", [["named-uuid", "row1"],
863 ["named-uuid", "row2"]]],
864 "a2a1": ["named-uuid", "row2"],
865 "a2b": ["named-uuid", "row3"]},
866 "uuid-name": "row2"},
870 "a2a": ["set", [["named-uuid", "row1"],
871 ["named-uuid", "row2"]]],
872 "a2a1": ["named-uuid", "row2"],
873 "a2b": ["named-uuid", "row4"]}},
877 "b2a": ["named-uuid", "row1"]},
878 "uuid-name": "row3"},
882 "b2a": ["named-uuid", "row2"]},
883 "uuid-name": "row4"}]]],
884 dnl Check that the nonexistent row UUID we added to row a0 was deleted,
885 dnl and that other rows were inserted as requested.
890 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
896 "columns": ["_uuid", "b", "b2a"],
898 dnl Try to insert invalid all-zeros weak reference (the default) into
899 dnl "a2b", which requires exactly one value.
903 "row": {"a2a1": ["named-uuid", "me"]},
904 "uuid-name": "me"}]]],
905 dnl Try to delete row from "b" that is referred to by weak references
906 dnl from "a" table "a2b" column that requires exactly one value.
910 "where": [["b", "==", 3]]}]]],
911 dnl Try to delete row from "a" that is referred to by weak references
912 dnl from "a" table "a2a1" column that requires exactly one value.
916 "where": [["a", "==", 1]]}]]],
917 dnl Delete the row that had the reference that caused the previous
918 dnl deletion to fail, then check that other rows are unchanged.
922 "where": [["a", "==", 2]]}]]],
927 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
933 "columns": ["_uuid", "b", "b2a"],
935 dnl Delete row a0 then check that references to it were removed.
939 "where": [["a", "==", 0]]}]]],
944 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
950 "columns": ["_uuid", "b", "b2a"],
952 dnl Delete row a1 then check that references to it were removed.
956 "where": [["a", "==", 1]]}]]],
961 "columns": ["_uuid", "a2a", "a2a1", "a2b"],
967 "columns": ["_uuid", "b", "b2a"],
969 [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
970 [{"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>"]}]}]
971 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
972 [{"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"}]
973 [{"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"}]
974 [{"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"}]
976 [{"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>"]}]}]
977 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
979 [{"rows":[{"_uuid":["uuid","<1>"],"a2a":["uuid","<1>"],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}]
980 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}]
983 [{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}]
986 OVSDB_CHECK_EXECUTION([immutable columns],
992 "uuid-name": "row1"}]]],
1007 "mutations": [["i", "-=", 5]]}]]],
1012 "mutations": [["i", "*=", 1]]}]]]],
1013 [[[{"uuid":["uuid","<0>"]}]
1014 [{"details":"Cannot update immutable column i in table a.","error":"constraint violation","syntax":"{\"op\":\"update\",\"row\":{\"i\":10},\"table\":\"a\",\"where\":[]}"}]
1015 [{"details":"Cannot update immutable column i in table a.","error":"constraint violation","syntax":"{\"op\":\"update\",\"row\":{\"i\":5},\"table\":\"a\",\"where\":[]}"}]
1016 [{"details":"Cannot mutate immutable column i in table a.","error":"constraint violation","syntax":"[\"i\",\"-=\",5]"}]
1017 [{"details":"Cannot mutate immutable column i in table a.","error":"constraint violation","syntax":"[\"i\",\"*=\",1]"}]
1020 OVSDB_CHECK_EXECUTION([garbage collection],
1022 [dnl Check that inserting a row without any references is a no-op.
1026 "row": {"a": 0}}]]],
1031 "columns": ["a"]}]]],
1032 dnl Check that inserting a chain of rows that reference each other
1033 dnl in turn is also a no-op.
1037 "row": {"a": 0, "a2a": ["named-uuid", "row1"]},
1038 "uuid-name": "row0"},
1041 "row": {"a": 1, "a2a": ["named-uuid", "row2"]},
1042 "uuid-name": "row1"},
1045 "row": {"a": 2, "a2a": ["named-uuid", "row3"]},
1046 "uuid-name": "row2"},
1050 "uuid-name": "row3"}]]],
1055 "columns": ["a"]}]]],
1056 dnl Check that inserting a pair of rows that mutually reference each
1057 dnl other causes the rows to be retained.
1061 "row": {"a": 4, "a2a": ["named-uuid", "row5"]},
1062 "uuid-name": "row4"},
1065 "row": {"a": 5, "a2a": ["named-uuid", "row4"]},
1066 "uuid-name": "row5"}]]],
1073 dnl Check that unreferencing one of the rows causes the other to be deleted.
1077 "where": [["a", "==", 4]],
1078 "row": {"a2a": ["set", []]}}]]],
1083 "columns": ["a"]}]]],
1084 dnl Check that inserting a pair of rows that mutually weak reference each
1085 dnl other is a no-op.
1089 "row": {"a": 6, "wa2a": ["named-uuid", "row7"]},
1090 "uuid-name": "row6"},
1093 "row": {"a": 7, "wa2a": ["named-uuid", "row6"]},
1094 "uuid-name": "row7"}]]],
1099 "columns": ["a"]}]]],
1100 dnl Check that a circular chain of rows is retained.
1104 "row": {"a": 8, "a2a": ["named-uuid", "row9"]},
1105 "uuid-name": "row8"},
1108 "row": {"a": 9, "a2a": ["named-uuid", "row10"]},
1109 "uuid-name": "row9"},
1112 "row": {"a": 10, "a2a": ["named-uuid", "row11"]},
1113 "uuid-name": "row10"},
1116 "row": {"a": 11, "a2a": ["named-uuid", "row8"]},
1117 "uuid-name": "row11"}]]],
1124 dnl Check that breaking the chain causes all of the rows to be deleted.
1128 "where": [["a", "==", 9]],
1129 "row": {"a2a": ["set", []]}}]]],
1134 "columns": ["a"]}]]],
1135 dnl Check that inserting a row only referenced by itself is a no-op.
1139 "row": {"a": 12, "a2a": ["named-uuid", "self"]},
1140 "uuid-name": "self"}]]],
1145 "columns": ["a"]}]]]],
1146 [[[{"uuid":["uuid","<0>"]}]
1148 [{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
1150 [{"uuid":["uuid","<5>"]},{"uuid":["uuid","<6>"]}]
1151 [{"rows":[{"a":4},{"a":5}]}]
1154 [{"uuid":["uuid","<7>"]},{"uuid":["uuid","<8>"]}]
1156 [{"uuid":["uuid","<9>"]},{"uuid":["uuid","<10>"]},{"uuid":["uuid","<11>"]},{"uuid":["uuid","<12>"]}]
1157 [{"rows":[{"a":8},{"a":9},{"a":10},{"a":11}]}]
1160 [{"uuid":["uuid","<13>"]}]