X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Fovsdb-execution.at;h=394fcba721c26042744878acd99befbfa99fa6e2;hb=d1b680c61626595b2777f4bf25997a9178acb60c;hp=e62929804452afbe69f9dc3ce66061983742d7e3;hpb=f85f8ebbfac946c19b3c6eb0f4170f579d0a4d25;p=openvswitch diff --git a/tests/ovsdb-execution.at b/tests/ovsdb-execution.at index e6292980..394fcba7 100644 --- a/tests/ovsdb-execution.at +++ b/tests/ovsdb-execution.at @@ -1,51 +1,129 @@ AT_BANNER([OVSDB -- execution]) m4_define([ORDINAL_SCHEMA], - [['{"name": "mydb", + [[{"name": "ordinals", "tables": { "ordinals": { "columns": { "number": {"type": "integer"}, - "name": {"type": "string"}}}}}']]) + "name": {"type": "string"}}}}}]]) -# This is like OVSDB_CHECK_POSITIVE, except that UUIDs in the output +m4_define([CONSTRAINT_SCHEMA], + [[{"name": "constraints", + "tables": { + "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"}}}}, + "b": { + "columns": { + "b": {"type": "integer"}, + "b2a": {"type": {"key": {"type": "uuid", "refTable": "a"}, + "min": 0, "max": "unlimited"}}, + "b2b": {"type": {"key": {"type": "uuid", "refTable": "b"}, + "min": 0, "max": "unlimited"}}}}, + "constrained": { + "columns": { + "positive": {"type": {"key": {"type": "integer", + "minInteger": 1}}}}, + "maxRows": 1}}}]]) + +m4_define([WEAK_SCHEMA], + [[{"name": "weak", + "tables": { + "a": { + "columns": { + "a": {"type": "integer"}, + "a2a": {"type": {"key": {"type": "uuid", + "refTable": "a", + "refType": "weak"}, + "min": 0, "max": "unlimited"}}, + "a2a1": {"type": {"key": {"type": "uuid", + "refTable": "a", + "refType": "weak"}}}, + "a2b": {"type": {"key": {"type": "uuid", + "refTable": "b", + "refType": "weak"}}}}}, + "b": { + "columns": { + "b": {"type": "integer"}, + "b2a": {"type": {"key": {"type": "uuid", + "refTable": "a", + "refType": "weak"}, + "min": 0, "max": "unlimited"}}}}}}]]) + +# OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS]) +# +# Runs "test-ovsdb execute" with the given SCHEMA and each of the +# TRANSACTIONS (which should be a quoted list of quoted strings). +# +# Checks that the overall output is OUTPUT, but UUIDs in the output # are replaced by markers of the form where N is a number. The # first unique UUID is replaced by <0>, the next by <1>, and so on. # If a given UUID appears more than once it is always replaced by the # same marker. +# +# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS. m4_define([OVSDB_CHECK_EXECUTION], [AT_SETUP([$1]) - AT_KEYWORDS([ovsdb execute execution positive $4]) - OVS_CHECK_LCOV([test-ovsdb execute $2], [0], [stdout], []) - AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$3]) + AT_KEYWORDS([ovsdb execute execution positive $5]) + AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])], + [0], [stdout], []) + AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4]) AT_CLEANUP]) +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. +OVSDB_CHECK_EXECUTION([insert default row, query table], + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", + "table": "ordinals", + "row": {}}]]], + [[["ordinals", + {"op": "select", + "table": "ordinals", + "where": []}]]]], + [[[{"uuid":["uuid","<0>"]}] +[{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}] +]]) + OVSDB_CHECK_EXECUTION([insert row, query table], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", - "row": {"number": 0, "name": "zero"}}]' \ - '[{"op": "select", + "row": {"number": 0, "name": "zero"}}]]], + [[["ordinals", + {"op": "select", "table": "ordinals", - "where": []}]']], + "where": []}]]]], [[[{"uuid":["uuid","<0>"]}] [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}] ]]) OVSDB_CHECK_EXECUTION([insert rows, query by value], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", - "row": {"number": 0, "name": "zero"}}]' \ - '[{"op": "insert", + "row": {"number": 0, "name": "zero"}}]]], + [[["ordinals", + {"op": "insert", "table": "ordinals", - "row": {"number": 1, "name": "one"}}]' \ - '[{"op": "select", + "row": {"number": 1, "name": "one"}}]]], + [[["ordinals", + {"op": "select", "table": "ordinals", - "where": [["name", "==", "zero"]]}]'\ - '[{"op": "select", + "where": [["name", "==", "zero"]]}]]], + [[["ordinals", + {"op": "select", "table": "ordinals", - "where": [["name", "==", "one"]]}]']], + "where": [["name", "==", "one"]]}]]]], [[[{"uuid":["uuid","<0>"]}] [{"uuid":["uuid","<1>"]}] [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}] @@ -53,8 +131,9 @@ OVSDB_CHECK_EXECUTION([insert rows, query by value], ]]) OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}, "uuid-name": "first"}, @@ -67,37 +146,70 @@ OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid], "where": [["_uuid", "==", ["named-uuid", "first"]]]}, {"op": "select", "table": "ordinals", - "where": [["_uuid", "==", ["named-uuid", "second"]]]}]']], + "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]], [[[{"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}]}] ]]) OVSDB_CHECK_EXECUTION([insert rows, update rows by value], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}, - "uuid-name": "first"}]' \ - '[{"op": "insert", + "uuid-name": "first"}]]], + [[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 1, "name": "one"}, - "uuid-name": "first"}]' \ - '[{"op": "update", + "uuid-name": "first"}]]], + [[["ordinals", + {"op": "update", "table": "ordinals", "where": [["name", "==", "zero"]], - "row": {"name": "nought"}}]' \ - '[{"op": "select", + "row": {"name": "nought"}}]]], + [[["ordinals", + {"op": "select", "table": "ordinals", "where": [], - "sort": ["number"]}]']], + "sort": ["number"]}]]]], [[[{"uuid":["uuid","<0>"]}] [{"uuid":["uuid","<1>"]}] [{"count":1}] [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}] ]]) +OVSDB_CHECK_EXECUTION([insert rows, mutate rows], + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", + "table": "ordinals", + "row": {"number": 0, "name": "zero"}, + "uuid-name": "first"}]]], + [[["ordinals", + {"op": "insert", + "table": "ordinals", + "row": {"number": 1, "name": "one"}, + "uuid-name": "first"}]]], + [[["ordinals", + {"op": "mutate", + "table": "ordinals", + "where": [["name", "==", "zero"]], + "mutations": [["number", "+=", 2]]}]]], + [[["ordinals", + {"op": "select", + "table": "ordinals", + "where": [], + "sort": ["number"]}]]]], + [[[{"uuid":["uuid","<0>"]}] +[{"uuid":["uuid","<1>"]}] +[{"count":1}] +[{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}] +]]) + OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}, "uuid-name": "first"}, @@ -111,26 +223,30 @@ OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid], {"op": "select", "table": "ordinals", "where": [], - "columns": ["name","number"]}]']], + "columns": ["name","number"]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}] ]]) OVSDB_CHECK_EXECUTION([insert rows, delete rows by value], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}, - "uuid-name": "first"}]' \ - '[{"op": "insert", + "uuid-name": "first"}]]], + [[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 1, "name": "one"}, - "uuid-name": "first"}]' \ - '[{"op": "delete", + "uuid-name": "first"}]]], + [[["ordinals", + {"op": "delete", "table": "ordinals", - "where": [["name", "==", "zero"]]}]' \ - '[{"op": "select", + "where": [["name", "==", "zero"]]}]]], + [[["ordinals", + {"op": "select", "table": "ordinals", - "where": []}]']], + "where": []}]]]], [[[{"uuid":["uuid","<0>"]}] [{"uuid":["uuid","<1>"]}] [{"count":1}] @@ -138,22 +254,26 @@ OVSDB_CHECK_EXECUTION([insert rows, delete rows by value], ]]) OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}, - "uuid-name": "first"}]' \ - '[{"op": "insert", + "uuid-name": "first"}]]], + [[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 1, "name": "one"}, - "uuid-name": "first"}]' \ - '[{"op": "delete", + "uuid-name": "first"}]]], + [[["ordinals", + {"op": "delete", "table": "ordinals", - "where": [["name", "==", "nought"]]}]' \ - '[{"op": "select", + "where": [["name", "==", "nought"]]}]]], + [[["ordinals", + {"op": "select", "table": "ordinals", "where": [], - "sort": ["number"]}]']], + "sort": ["number"]}]]]], [[[{"uuid":["uuid","<0>"]}] [{"uuid":["uuid","<1>"]}] [{"count":0}] @@ -161,8 +281,9 @@ OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value], ]]) OVSDB_CHECK_EXECUTION([insert rows, delete all], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}, "uuid-name": "first"}, @@ -176,39 +297,42 @@ OVSDB_CHECK_EXECUTION([insert rows, delete all], {"op": "select", "table": "ordinals", "where": [], - "columns": ["name","number"]}]']], + "columns": ["name","number"]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}] ]]) OVSDB_CHECK_EXECUTION([insert row, query table, commit], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}}, {"op": "select", "table": "ordinals", "where": []}, {"op": "commit", - "durable": false}]']], + "durable": false}]]]], [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}] ]]) OVSDB_CHECK_EXECUTION([insert row, query table, commit durably], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}}, {"op": "select", "table": "ordinals", "where": []}, {"op": "commit", - "durable": true}]']], + "durable": true}]]]], [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}] ]]) OVSDB_CHECK_EXECUTION([equality wait with correct rows], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}}, {"op": "insert", @@ -221,13 +345,14 @@ OVSDB_CHECK_EXECUTION([equality wait with correct rows], "columns": ["name", "number"], "until": "==", "rows": [{"name": "zero", "number": 0}, - {"name": "one", "number": 1}]}]']], + {"name": "one", "number": 1}]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}] ]]) OVSDB_CHECK_EXECUTION([equality wait with extra row], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}}, {"op": "insert", @@ -241,13 +366,14 @@ OVSDB_CHECK_EXECUTION([equality wait with extra row], "until": "==", "rows": [{"name": "zero", "number": 0}, {"name": "one", "number": 1}, - {"name": "two", "number": 2}]}]']], + {"name": "two", "number": 2}]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}] ]]) OVSDB_CHECK_EXECUTION([equality wait with missing row], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}}, {"op": "insert", @@ -259,13 +385,14 @@ OVSDB_CHECK_EXECUTION([equality wait with missing row], "where": [], "columns": ["name", "number"], "until": "==", - "rows": [{"name": "one", "number": 1}]}]']], + "rows": [{"name": "one", "number": 1}]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}] ]]) OVSDB_CHECK_EXECUTION([inequality wait with correct rows], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}}, {"op": "insert", @@ -278,13 +405,14 @@ OVSDB_CHECK_EXECUTION([inequality wait with correct rows], "columns": ["name", "number"], "until": "!=", "rows": [{"name": "zero", "number": 0}, - {"name": "one", "number": 1}]}]']], + {"name": "one", "number": 1}]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}] ]]) OVSDB_CHECK_EXECUTION([inequality wait with extra row], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}}, {"op": "insert", @@ -298,13 +426,14 @@ OVSDB_CHECK_EXECUTION([inequality wait with extra row], "until": "!=", "rows": [{"name": "zero", "number": 0}, {"name": "one", "number": 1}, - {"name": "two", "number": 2}]}]']], + {"name": "two", "number": 2}]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}] ]]) OVSDB_CHECK_EXECUTION([inequality wait with missing row], - [ORDINAL_SCHEMA [\ - '[{"op": "insert", + [ORDINAL_SCHEMA], + [[[["ordinals", + {"op": "insert", "table": "ordinals", "row": {"number": 0, "name": "zero"}}, {"op": "insert", @@ -316,6 +445,286 @@ OVSDB_CHECK_EXECUTION([inequality wait with missing row], "where": [], "columns": ["name", "number"], "until": "!=", - "rows": [{"name": "one", "number": 1}]}]']], + "rows": [{"name": "one", "number": 1}]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}] ]]) + +OVSDB_CHECK_EXECUTION([insert and update constraints], + [CONSTRAINT_SCHEMA], + [[[["constraints", + {"op": "insert", + "table": "constrained", + "row": {}}]]], + [[["constraints", + {"op": "insert", + "table": "constrained", + "row": {"positive": -1}}]]], + [[["constraints", + {"op": "update", + "table": "constrained", + "where": [], + "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], + [CONSTRAINT_SCHEMA], + [[[["constraints", + {"op": "insert", + "table": "b", + "row": {"b": 1}, + "uuid-name": "brow"}, + {"op": "insert", + "table": "a", + "row": {"a": 0, + "a2b": ["set", [["named-uuid", "brow"]]]}}, + {"op": "insert", + "table": "a", + "row": {"a": 1, + "a2b": ["set", [["named-uuid", "brow"]]]}}, + {"op": "insert", + "table": "a", + "row": {"a": 2, + "a2b": ["set", [["named-uuid", "brow"]]]}}]]], + [[["constraints", + {"op": "delete", + "table": "b", + "where": []}]]], + [[["constraints", + {"op": "delete", + "table": "a", + "where": [["a", "==", 0]]}]]], + [[["constraints", + {"op": "delete", + "table": "b", + "where": []}]]], + [[["constraints", + {"op": "delete", + "table": "a", + "where": [["a", "==", 1]]}]]], + [[["constraints", + {"op": "delete", + "table": "b", + "where": []}]]], + [[["constraints", + {"op": "delete", + "table": "a", + "where": [["a", "==", 2]]}]]], + [[["constraints", + {"op": "delete", + "table": "b", + "where": []}]]]], + [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}] +[{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}] +[{"count":1}] +[{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}] +[{"count":1}] +[{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}] +[{"count":1}] +[{"count":1}] +]]) + +OVSDB_CHECK_EXECUTION([referential integrity -- mutual references], + [CONSTRAINT_SCHEMA], + [[[["constraints", + {"op": "insert", + "table": "a", + "row": {"a": 0, + "a2b": ["set", [["named-uuid", "row2"]]], + "a2a": ["set", [["named-uuid", "row1"]]]}, + "uuid-name": "row1"}, + {"op": "insert", + "table": "b", + "row": {"b": 1, + "b2b": ["set", [["named-uuid", "row2"]]], + "b2a": ["set", [["named-uuid", "row1"]]]}, + "uuid-name": "row2"}]]], + [[["constraints", + {"op": "insert", + "table": "a", + "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]], + [[["constraints", + {"op": "delete", + "table": "a", + "where": [["a", "==", 0]]}]]], + [[["constraints", + {"op": "delete", + "table": "b", + "where": [["b", "==", 1]]}]]], + dnl Try the deletions again to make sure that the refcounts got rolled back. + [[["constraints", + {"op": "delete", + "table": "a", + "where": [["a", "==", 0]]}]]], + [[["constraints", + {"op": "delete", + "table": "b", + "where": [["b", "==", 1]]}]]], + [[["constraints", + {"op": "delete", + "table": "a", + "where": [["a", "==", 0]]}, + {"op": "delete", + "table": "b", + "where": [["b", "==", 1]]}]]]], + [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}] +[{"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"}] +[{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}] +[{"count":1},{"count":1}] +]]) + +OVSDB_CHECK_EXECUTION([weak references], + [WEAK_SCHEMA], + [[[["weak", + {"op": "insert", + "table": "a", + "row": {"a": 0, + "a2a": ["set", [["named-uuid", "row1"], + ["named-uuid", "row2"], + ["uuid", "0e767b36-6822-4044-8307-d58467e04669"]]], + "a2a1": ["named-uuid", "row1"], + "a2b": ["named-uuid", "row3"]}, + "uuid-name": "row1"}, + {"op": "insert", + "table": "a", + "row": {"a": 1, + "a2a": ["set", [["named-uuid", "row1"], + ["named-uuid", "row2"]]], + "a2a1": ["named-uuid", "row2"], + "a2b": ["named-uuid", "row3"]}, + "uuid-name": "row2"}, + {"op": "insert", + "table": "a", + "row": {"a": 2, + "a2a": ["set", [["named-uuid", "row1"], + ["named-uuid", "row2"]]], + "a2a1": ["named-uuid", "row2"], + "a2b": ["named-uuid", "row4"]}}, + {"op": "insert", + "table": "b", + "row": {"b": 2, + "b2a": ["named-uuid", "row1"]}, + "uuid-name": "row3"}, + {"op": "insert", + "table": "b", + "row": {"b": 3, + "b2a": ["named-uuid", "row2"]}, + "uuid-name": "row4"}]]], + dnl Check that the nonexistent row UUID we added to row a0 was deleted, + dnl and that other rows were inserted as requested. + [[["weak", + {"op": "select", + "table": "a", + "where": [], + "columns": ["_uuid", "a2a", "a2a1", "a2b"], + "sort": ["a"]}]]], + [[["weak", + {"op": "select", + "table": "b", + "where": [], + "columns": ["_uuid", "b", "b2a"], + "sort": ["b"]}]]], + dnl Try to insert invalid all-zeros weak reference (the default) into + dnl "a2b", which requires exactly one value. + [[["weak", + {"op": "insert", + "table": "a", + "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", + {"op": "delete", + "table": "b", + "where": [["b", "==", 3]]}]]], + dnl Try to delete row from "a" that is referred to by weak references + dnl from "a" table "a2a1" column that requires exactly one value. + [[["weak", + {"op": "delete", + "table": "a", + "where": [["a", "==", 1]]}]]], + dnl Delete the row that had the reference that caused the previous + dnl deletion to fail, then check that other rows are unchanged. + [[["weak", + {"op": "delete", + "table": "a", + "where": [["a", "==", 2]]}]]], + [[["weak", + {"op": "select", + "table": "a", + "where": [], + "columns": ["_uuid", "a2a", "a2a1", "a2b"], + "sort": ["a"]}]]], + [[["weak", + {"op": "select", + "table": "b", + "where": [], + "columns": ["_uuid", "b", "b2a"], + "sort": ["b"]}]]], + dnl Delete row a0 then check that references to it were removed. + [[["weak", + {"op": "delete", + "table": "a", + "where": [["a", "==", 0]]}]]], + [[["weak", + {"op": "select", + "table": "a", + "where": [], + "columns": ["_uuid", "a2a", "a2a1", "a2b"], + "sort": ["a"]}]]], + [[["weak", + {"op": "select", + "table": "b", + "where": [], + "columns": ["_uuid", "b", "b2a"], + "sort": ["b"]}]]], + dnl Delete row a1 then check that references to it were removed. + [[["weak", + {"op": "delete", + "table": "a", + "where": [["a", "==", 1]]}]]], + [[["weak", + {"op": "select", + "table": "a", + "where": [], + "columns": ["_uuid", "a2a", "a2a1", "a2b"], + "sort": ["a"]}]]], + [[["weak", + {"op": "select", + "table": "b", + "where": [], + "columns": ["_uuid", "b", "b2a"], + "sort": ["b"]}]]]], + [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]},{"uuid":["uuid","<4>"]}] +[{"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>"]}]}] +[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}] +[{"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"}] +[{"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"}] +[{"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"}] +[{"count":1}] +[{"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>"]}]}] +[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["uuid","<0>"]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}] +[{"count":1}] +[{"rows":[{"_uuid":["uuid","<1>"],"a2a":["uuid","<1>"],"a2a1":["uuid","<1>"],"a2b":["uuid","<3>"]}]}] +[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["uuid","<1>"]}]}] +[{"count":1}] +[{"rows":[]}] +[{"rows":[{"_uuid":["uuid","<3>"],"b":2,"b2a":["set",[]]},{"_uuid":["uuid","<4>"],"b":3,"b2a":["set",[]]}]}] +]])]) + +EXECUTION_EXAMPLES