"ordinals": {
"columns": {
"number": {"type": "integer"},
- "name": {"type": "string"}}}}}]])
+ "name": {"type": "string"}}}},
+ "version": "5.1.3",
+ "cksum": "12345678 9"}]])
m4_define([CONSTRAINT_SCHEMA],
[[{"name": "constraints",
"constrained": {
"columns": {
"positive": {"type": {"key": {"type": "integer",
- "minInteger": 1}}}}}}}]])
+ "minInteger": 1}}}},
+ "maxRows": 1}}}]])
m4_define([WEAK_SCHEMA],
[[{"name": "weak",
"refType": "weak"},
"min": 0, "max": "unlimited"}}}}}}]])
+m4_define([GC_SCHEMA],
+ [[{"name": "gc",
+ "tables": {
+ "root": {
+ "columns": {
+ "a": {"type": {"key": {"type": "uuid",
+ "refTable": "a"},
+ "min": 0, "max": "unlimited"}}},
+ "isRoot": true},
+ "a": {
+ "columns": {
+ "a": {"type": "integer"},
+ "a2a": {"type": {"key": {"type": "uuid",
+ "refTable": "a"},
+ "min": 0, "max": "unlimited"}},
+ "a2b": {"type": {"key": {"type": "uuid",
+ "refTable": "b"},
+ "min": 0, "max": "unlimited"}},
+ "wa2a": {"type": {"key": {"type": "uuid",
+ "refTable": "a",
+ "refType": "weak"},
+ "min": 0, "max": "unlimited"}},
+ "wa2b": {"type": {"key": {"type": "uuid",
+ "refTable": "b",
+ "refType": "weak"},
+ "min": 0, "max": "unlimited"}}}},
+ "b": {
+ "columns": {
+ "b": {"type": "integer"},
+ "b2a": {"type": {"key": {"type": "uuid",
+ "refTable": "a"},
+ "min": 0, "max": "unlimited"}},
+ "wb2a": {"type": {"key": {"type": "uuid",
+ "refTable": "a",
+ "refType": "weak"},
+ "min": 0, "max": "unlimited"}}},
+ "isRoot": false}}}]])
+
# OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
#
# Runs "test-ovsdb execute" with the given SCHEMA and each of the
AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
AT_CLEANUP])
+OVSDB_CHECK_EXECUTION([uuid-name must be <id>],
+ [CONSTRAINT_SCHEMA],
+ [[[["constraints",
+ {"op": "insert",
+ "table": "a",
+ "row": {},
+ "uuid-name": "0"}]]]],
+ [[[{"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\"}"}]
+]])
+
+OVSDB_CHECK_EXECUTION([named-uuid must be <id>],
+ [CONSTRAINT_SCHEMA],
+ [[[["constraints",
+ {"op": "insert",
+ "table": "a",
+ "row": {"a2a": ["named-uuid", "0"]}}]]]],
+ [[[{"details":"named-uuid string is not a valid <id>","error":"syntax error","syntax":"[\"named-uuid\",\"0\"]"}]
+]])
+
+OVSDB_CHECK_EXECUTION([duplicate uuid-name not allowed],
+ [ORDINAL_SCHEMA],
+ [[[["ordinals",
+ {"op": "insert",
+ "table": "ordinals",
+ "row": {},
+ "uuid-name": "x"},
+ {"op": "insert",
+ "table": "ordinals",
+ "row": {},
+ "uuid-name": "x"}]]]],
+ [[[{"uuid":["uuid","<0>"]},{"details":"This \"uuid-name\" appeared on an earlier \"insert\" operation.","error":"duplicate uuid-name","syntax":"\"x\""}]
+]])
+
m4_define([EXECUTION_EXAMPLES], [
dnl At one point the "commit" code ignored new rows with all-default values,
dnl so this checks for that problem.
{"op": "update",
"table": "constrained",
"where": [],
- "row": {"positive": -2}}]]]],
+ "row": {"positive": -2}}]]],
+ [[["constraints",
+ {"op": "insert",
+ "table": "constrained",
+ "row": {"positive": 1}}]]],
+ [[["constraints",
+ {"op": "insert",
+ "table": "constrained",
+ "row": {"positive": 2}}]]]],
[[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
[{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
[{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
+[{"uuid":["uuid","<0>"]}]
+[{"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"}]
]])
OVSDB_CHECK_EXECUTION([referential integrity -- simple],
"table": "b",
"where": [["b", "==", 1]]}]]]],
[[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
-[{"uuid":["uuid","<2>"]},{"details":"reference to nonexistent row <3>","error":"referential integrity violation"}]
+[{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}]
[{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
[{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
[{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
[[["weak",
{"op": "insert",
"table": "a",
- "row": {}}]]],
+ "row": {"a2a1": ["named-uuid", "me"]},
+ "uuid-name": "me"}]]],
dnl Try to delete row from "b" that is referred to by weak references
dnl from "a" table "a2b" column that requires exactly one value.
[[["weak",
[{"count":1}]
[{"rows":[]}]
[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}]
+]])
+
+OVSDB_CHECK_EXECUTION([garbage collection],
+ [GC_SCHEMA],
+ [dnl Check that inserting a row without any references is a no-op.
+ [[["gc",
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 0}}]]],
+ [[["gc",
+ {"op": "select",
+ "table": "a",
+ "where": [],
+ "columns": ["a"]}]]],
+ dnl Check that inserting a chain of rows that reference each other
+ dnl in turn is also a no-op.
+ [[["gc",
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 0, "a2a": ["named-uuid", "row1"]},
+ "uuid-name": "row0"},
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 1, "a2a": ["named-uuid", "row2"]},
+ "uuid-name": "row1"},
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 2, "a2a": ["named-uuid", "row3"]},
+ "uuid-name": "row2"},
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 3},
+ "uuid-name": "row3"}]]],
+ [[["gc",
+ {"op": "select",
+ "table": "a",
+ "where": [],
+ "columns": ["a"]}]]],
+ dnl Check that inserting a pair of rows that mutually reference each
+ dnl other causes the rows to be retained.
+ [[["gc",
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 4, "a2a": ["named-uuid", "row5"]},
+ "uuid-name": "row4"},
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 5, "a2a": ["named-uuid", "row4"]},
+ "uuid-name": "row5"}]]],
+ [[["gc",
+ {"op": "select",
+ "table": "a",
+ "where": [],
+ "columns": ["a"],
+ "sort": ["a"]}]]],
+ dnl Check that unreferencing one of the rows causes the other to be deleted.
+ [[["gc",
+ {"op": "update",
+ "table": "a",
+ "where": [["a", "==", 4]],
+ "row": {"a2a": ["set", []]}}]]],
+ [[["gc",
+ {"op": "select",
+ "table": "a",
+ "where": [],
+ "columns": ["a"]}]]],
+ dnl Check that inserting a pair of rows that mutually weak reference each
+ dnl other is a no-op.
+ [[["gc",
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 6, "wa2a": ["named-uuid", "row7"]},
+ "uuid-name": "row6"},
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 7, "wa2a": ["named-uuid", "row6"]},
+ "uuid-name": "row7"}]]],
+ [[["gc",
+ {"op": "select",
+ "table": "a",
+ "where": [],
+ "columns": ["a"]}]]],
+ dnl Check that a circular chain of rows is retained.
+ [[["gc",
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 8, "a2a": ["named-uuid", "row9"]},
+ "uuid-name": "row8"},
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 9, "a2a": ["named-uuid", "row10"]},
+ "uuid-name": "row9"},
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 10, "a2a": ["named-uuid", "row11"]},
+ "uuid-name": "row10"},
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 11, "a2a": ["named-uuid", "row8"]},
+ "uuid-name": "row11"}]]],
+ [[["gc",
+ {"op": "select",
+ "table": "a",
+ "where": [],
+ "columns": ["a"],
+ "sort": ["a"]}]]],
+ dnl Check that breaking the chain causes all of the rows to be deleted.
+ [[["gc",
+ {"op": "update",
+ "table": "a",
+ "where": [["a", "==", 9]],
+ "row": {"a2a": ["set", []]}}]]],
+ [[["gc",
+ {"op": "select",
+ "table": "a",
+ "where": [],
+ "columns": ["a"]}]]],
+ dnl Check that inserting a row only referenced by itself is a no-op.
+ [[["gc",
+ {"op": "insert",
+ "table": "a",
+ "row": {"a": 12, "a2a": ["named-uuid", "self"]},
+ "uuid-name": "self"}]]],
+ [[["gc",
+ {"op": "select",
+ "table": "a",
+ "where": [],
+ "columns": ["a"]}]]]],
+ [[[{"uuid":["uuid","<0>"]}]
+[{"rows":[]}]
+[{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}]
+[{"rows":[]}]
+[{"uuid":["uuid","<5>"]},{"uuid":["uuid","<6>"]}]
+[{"rows":[{"a":4},{"a":5}]}]
+[{"count":1}]
+[{"rows":[]}]
+[{"uuid":["uuid","<7>"]},{"uuid":["uuid","<8>"]}]
+[{"rows":[]}]
+[{"uuid":["uuid","<9>"]},{"uuid":["uuid","<10>"]},{"uuid":["uuid","<11>"]},{"uuid":["uuid","<12>"]}]
+[{"rows":[{"a":8},{"a":9},{"a":10},{"a":11}]}]
+[{"count":1}]
+[{"rows":[]}]
+[{"uuid":["uuid","<13>"]}]
+[{"rows":[]}]
]])])
EXECUTION_EXAMPLES