1 AT_BANNER([OVSDB -- mutations])
3 OVSDB_CHECK_POSITIVE([null mutation],
5 '{"columns": {"name": {"type": "string"}}}' \
9 OVSDB_CHECK_POSITIVE([mutations on scalars],
12 {"i": {"type": "integer"},
13 "r": {"type": "real"},
14 "b": {"type": "boolean"},
15 "s": {"type": "string"},
16 "u": {"type": "uuid"}}}' \
22 '[["r", "+=", 0.5]]' \
23 '[["r", "-=", 1.5]]' \
24 '[["r", "*=", 2.5]]' \
25 '[["r", "/=", 3.5]]']],
37 AT_SETUP([disallowed mutations on scalars])
38 AT_KEYWORDS([ovsdb negative mutation])
39 AT_CHECK([[test-ovsdb parse-mutations \
41 {"i": {"type": "integer"},
42 "r": {"type": "real"},
43 "b": {"type": "boolean"},
44 "s": {"type": "string"},
45 "u": {"type": "uuid"}}}' \
47 '[["i", "insert", 1]]' \
48 '[["i", "delete", 2]]' \
49 '[["r", "%=", 0.5]]' \
50 '[["r", "insert", 1.5]]' \
51 '[["r", "delete", 2.5]]' \
52 '[["b", "+=", true]]' \
53 '[["b", "-=", false]]' \
54 '[["b", "*=", true]]' \
55 '[["b", "/=", false]]' \
56 '[["b", "%=", true]]' \
57 '[["b", "insert", false]]' \
58 '[["b", "delete", true]]' \
59 '[["s", "+=", "a"]]' \
60 '[["s", "-=", "b"]]' \
61 '[["s", "*=", "c"]]' \
62 '[["s", "/=", "d"]]' \
63 '[["s", "%=", "e"]]' \
64 '[["s", "insert", "f"]]' \
65 '[["s", "delete", "g"]]' \
66 '[["u", "+=", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]]' \
67 '[["u", "-=", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]]' \
68 '[["u", "*=", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]]' \
69 '[["u", "/=", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]]' \
70 '[["u", "insert", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]]' \
71 '[["u", "delete", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]]']],
73 [[test-ovsdb: unknown mutator: No mutator named xxx.
74 test-ovsdb: syntax "["i","insert",1]": syntax error: Type mismatch: "insert" operator may not be applied to column i of type integer.
75 test-ovsdb: syntax "["i","delete",2]": syntax error: Type mismatch: "delete" operator may not be applied to column i of type integer.
76 test-ovsdb: syntax "["r","%=",0.5]": syntax error: Type mismatch: "%=" operator may not be applied to column r of type real.
77 test-ovsdb: syntax "["r","insert",1.5]": syntax error: Type mismatch: "insert" operator may not be applied to column r of type real.
78 test-ovsdb: syntax "["r","delete",2.5]": syntax error: Type mismatch: "delete" operator may not be applied to column r of type real.
79 test-ovsdb: syntax "["b","+=",true]": syntax error: Type mismatch: "+=" operator may not be applied to column b of type boolean.
80 test-ovsdb: syntax "["b","-=",false]": syntax error: Type mismatch: "-=" operator may not be applied to column b of type boolean.
81 test-ovsdb: syntax "["b","*=",true]": syntax error: Type mismatch: "*=" operator may not be applied to column b of type boolean.
82 test-ovsdb: syntax "["b","/=",false]": syntax error: Type mismatch: "/=" operator may not be applied to column b of type boolean.
83 test-ovsdb: syntax "["b","%=",true]": syntax error: Type mismatch: "%=" operator may not be applied to column b of type boolean.
84 test-ovsdb: syntax "["b","insert",false]": syntax error: Type mismatch: "insert" operator may not be applied to column b of type boolean.
85 test-ovsdb: syntax "["b","delete",true]": syntax error: Type mismatch: "delete" operator may not be applied to column b of type boolean.
86 test-ovsdb: syntax "["s","+=","a"]": syntax error: Type mismatch: "+=" operator may not be applied to column s of type string.
87 test-ovsdb: syntax "["s","-=","b"]": syntax error: Type mismatch: "-=" operator may not be applied to column s of type string.
88 test-ovsdb: syntax "["s","*=","c"]": syntax error: Type mismatch: "*=" operator may not be applied to column s of type string.
89 test-ovsdb: syntax "["s","/=","d"]": syntax error: Type mismatch: "/=" operator may not be applied to column s of type string.
90 test-ovsdb: syntax "["s","%=","e"]": syntax error: Type mismatch: "%=" operator may not be applied to column s of type string.
91 test-ovsdb: syntax "["s","insert","f"]": syntax error: Type mismatch: "insert" operator may not be applied to column s of type string.
92 test-ovsdb: syntax "["s","delete","g"]": syntax error: Type mismatch: "delete" operator may not be applied to column s of type string.
93 test-ovsdb: syntax "["u","+=",["uuid","9179ca6d-6d65-400a-b455-3ad92783a099"]]": syntax error: Type mismatch: "+=" operator may not be applied to column u of type uuid.
94 test-ovsdb: syntax "["u","-=",["uuid","9179ca6d-6d65-400a-b455-3ad92783a099"]]": syntax error: Type mismatch: "-=" operator may not be applied to column u of type uuid.
95 test-ovsdb: syntax "["u","*=",["uuid","9179ca6d-6d65-400a-b455-3ad92783a099"]]": syntax error: Type mismatch: "*=" operator may not be applied to column u of type uuid.
96 test-ovsdb: syntax "["u","/=",["uuid","9179ca6d-6d65-400a-b455-3ad92783a099"]]": syntax error: Type mismatch: "/=" operator may not be applied to column u of type uuid.
97 test-ovsdb: syntax "["u","insert",["uuid","9179ca6d-6d65-400a-b455-3ad92783a099"]]": syntax error: Type mismatch: "insert" operator may not be applied to column u of type uuid.
98 test-ovsdb: syntax "["u","delete",["uuid","9179ca6d-6d65-400a-b455-3ad92783a099"]]": syntax error: Type mismatch: "delete" operator may not be applied to column u of type uuid.
102 AT_SETUP([disallowed mutations on immutable columns])
103 AT_KEYWORDS([ovsdb negative mutation])
104 AT_CHECK([[test-ovsdb parse-mutations \
106 {"i": {"type": "integer", "mutable": false}}}' \
110 [[test-ovsdb: syntax "["i","+=",1]": constraint violation: Cannot mutate immutable column i in table mytable.
114 OVSDB_CHECK_POSITIVE([mutations on sets],
117 {"i": {"type": {"key": "integer", "min": 0, "max": "unlimited"}},
118 "r": {"type": {"key": "real", "min": 0, "max": "unlimited"}},
119 "b": {"type": {"key": "boolean", "min": 0, "max": "unlimited"}},
120 "s": {"type": {"key": "string", "min": 0, "max": "unlimited"}},
121 "u": {"type": {"key": "uuid", "min": 0, "max": "unlimited"}}}}' \
127 '[["i", "insert", ["set", [1, 2]]]]' \
128 '[["i", "delete", ["set", [1, 2, 3]]]]' \
133 '[["r", "insert", ["set", [1, 2]]]]' \
134 '[["r", "delete", ["set", [1, 2, 3]]]]' \
135 '[["b", "insert", ["set", [true]]]]' \
136 '[["b", "delete", ["set", [false]]]]' \
137 '[["s", "insert", ["set", ["a"]]]]' \
138 '[["s", "delete", ["set", ["a", "b"]]]]' \
140 ["set", [["uuid", "b10d28f7-af18-4a67-9e78-2a6394516c59"]]]]]' \
142 ["set", [["uuid", "b10d28f7-af18-4a67-9e78-2a6394516c59"],
143 ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]]]]' \
150 [["i","insert",["set",[1,2]]]]
151 [["i","delete",["set",[1,2,3]]]]
156 [["r","insert",["set",[1,2]]]]
157 [["r","delete",["set",[1,2,3]]]]
158 [["b","insert",true]]
159 [["b","delete",false]]
161 [["s","delete",["set",["a","b"]]]]
162 [["u","insert",["uuid","b10d28f7-af18-4a67-9e78-2a6394516c59"]]]
163 [["u","delete",["set",[["uuid","9179ca6d-6d65-400a-b455-3ad92783a099"],["uuid","b10d28f7-af18-4a67-9e78-2a6394516c59"]]]]]]],
166 OVSDB_CHECK_POSITIVE([executing null mutation],
167 [[execute-mutations \
168 '{"columns": {"i": {"type": "integer"}}}' \
179 OVSDB_CHECK_POSITIVE([executing mutations on integers],
180 [[execute-mutations \
181 '{"columns": {"i": {"type": "integer"}}}' \
216 OVSDB_CHECK_POSITIVE([integer overflow detection],
217 [[execute-mutations \
218 '{"columns": {"i": {"type": "integer"}}}' \
219 '[[["i", "+=", 9223372036854775807]],
220 [["i", "+=", -9223372036854775808]],
221 [["i", "-=", -9223372036854775808]],
222 [["i", "-=", 9223372036854775807]],
223 [["i", "*=", 3037000500]],
229 {"i": 9223372036854775807},
230 {"i": -9223372036854775808},
232 {"i": -3037000500}']]],
234 row 0: {"i":9223372036854775807}
235 row 1: range error: Result of "+=" operation is out of range.
236 row 2: {"i":9223372036854775806}
237 row 3: range error: Result of "+=" operation is out of range.
239 row 5: range error: Result of "+=" operation is out of range.
240 row 6: {"i":9223372033817775307}
243 row 0: {"i":-9223372036854775808}
244 row 1: {"i":-9223372036854775807}
245 row 2: range error: Result of "+=" operation is out of range.
247 row 4: range error: Result of "+=" operation is out of range.
248 row 5: {"i":-9223372033817775308}
249 row 6: range error: Result of "+=" operation is out of range.
252 row 0: range error: Result of "-=" operation is out of range.
253 row 1: range error: Result of "-=" operation is out of range.
254 row 2: {"i":9223372036854775807}
255 row 3: range error: Result of "-=" operation is out of range.
257 row 5: range error: Result of "-=" operation is out of range.
258 row 6: {"i":9223372033817775308}
261 row 0: {"i":-9223372036854775807}
262 row 1: {"i":-9223372036854775806}
263 row 2: {"i":-9223372036854775808}
265 row 4: range error: Result of "-=" operation is out of range.
266 row 5: {"i":-9223372033817775307}
267 row 6: range error: Result of "-=" operation is out of range.
271 row 1: {"i":3037000500}
272 row 2: {"i":-3037000500}
273 row 3: range error: Result of "*=" operation is out of range.
274 row 4: range error: Result of "*=" operation is out of range.
275 row 5: range error: Result of "*=" operation is out of range.
276 row 6: range error: Result of "*=" operation is out of range.
282 row 3: {"i":-9223372036854775807}
283 row 4: range error: Result of "/=" operation is out of range.
284 row 5: {"i":-3037000500}
285 row 6: {"i":3037000500}
288 row 0: domain error: Division by zero.
289 row 1: domain error: Division by zero.
290 row 2: domain error: Division by zero.
291 row 3: domain error: Division by zero.
292 row 4: domain error: Division by zero.
293 row 5: domain error: Division by zero.
294 row 6: domain error: Division by zero.
297 OVSDB_CHECK_POSITIVE([executing mutations on integers with constraints],
298 [[execute-mutations \
299 '{"columns": {"i": {"type": {"key": {"type": "integer",
301 "maxInteger": 2}}}}}' \
313 row 2: constraint violation: 3 is not in the valid range 0 to 2 (inclusive)
316 row 0: constraint violation: -2 is not in the valid range 0 to 2 (inclusive)
317 row 1: constraint violation: -1 is not in the valid range 0 to 2 (inclusive)
322 row 1: constraint violation: 3 is not in the valid range 0 to 2 (inclusive)
323 row 2: constraint violation: 6 is not in the valid range 0 to 2 (inclusive)
336 OVSDB_CHECK_POSITIVE([executing mutations on reals],
337 [[execute-mutations \
338 '{"columns": {"r": {"type": "real"}}}' \
339 '[[["r", "+=", 0.5]],
367 OVSDB_CHECK_POSITIVE([real overflow detection],
368 [[execute-mutations \
369 '{"columns": {"r": {"type": "real"}}}' \
370 '[[["r", "+=", 1.7976931348623157e+308]],
371 [["r", "-=", 1.7976931348623157e+308]],
377 {"r": 1.7976931348623157e+308},
378 {"r": -1.7976931348623157e+308}']]],
380 row 0: {"r":1.79769313486232e+308}
381 row 1: range error: Result of "+=" operation is out of range.
385 row 0: {"r":-1.79769313486232e+308}
387 row 2: range error: Result of "-=" operation is out of range.
391 row 1: range error: Result of "*=" operation is out of range.
392 row 2: range error: Result of "*=" operation is out of range.
396 row 1: {"r":4.49423283715579e+307}
397 row 2: {"r":-4.49423283715579e+307}
401 row 1: range error: Result of "/=" operation is out of range.
402 row 2: range error: Result of "/=" operation is out of range.
405 row 0: domain error: Division by zero.
406 row 1: domain error: Division by zero.
407 row 2: domain error: Division by zero.
410 OVSDB_CHECK_POSITIVE([executing mutations on reals with constraints],
411 [[execute-mutations \
412 '{"columns": {"r": {"type": {"key": {"type": "real",
414 "maxReal": 1.75}}}}}' \
415 '[[["r", "+=", 0.5]],
429 row 1: constraint violation: -4 is not in the valid range -2.5 to 1.75 (inclusive)
434 row 1: constraint violation: -6.25 is not in the valid range -2.5 to 1.75 (inclusive)
435 row 2: constraint violation: 3.125 is not in the valid range -2.5 to 1.75 (inclusive)
443 OVSDB_CHECK_POSITIVE([executing mutations on integer sets],
444 [[execute-mutations \
445 '{"columns": {"i": {"type": {"key": {"type": "integer",
448 "max": "unlimited"}}}}' \
454 [["i", "insert", ["set", [1]]]],
455 [["i", "insert", ["set", [2, 3]]]],
456 [["i", "delete", ["set", [1]]]],
457 [["i", "delete", ["set", [2, 3]]]]]' \
458 '[{"i": ["set", []]},
460 {"i": ["set", [0, 1]]},
461 {"i": ["set", [0, 1, 2]]}']]],
465 row 2: {"i":["set",[1,2]]}
466 row 3: {"i":["set",[1,2,3]]}
471 row 2: {"i":["set",[-2,-1]]}
472 row 3: {"i":["set",[-2,-1,0]]}
477 row 2: {"i":["set",[0,3]]}
478 row 3: constraint violation: 6 is greater than maximum allowed value 5
483 row 2: constraint violation: Result of "/=" operation contains duplicates.
484 row 3: constraint violation: Result of "/=" operation contains duplicates.
490 row 3: constraint violation: Result of "%=" operation contains duplicates.
494 row 1: {"i":["set",[0,1]]}
499 row 0: {"i":["set",[2,3]]}
500 row 1: {"i":["set",[0,2,3]]}
501 row 2: {"i":["set",[0,1,2,3]]}
502 row 3: {"i":["set",[0,1,2,3]]}
508 row 3: {"i":["set",[0,2]]}
514 row 3: {"i":["set",[0,1]]}
517 OVSDB_CHECK_POSITIVE([executing mutations on integer sets with constraints],
518 [[execute-mutations \
519 '{"columns": {"i": {"type": {"key": "integer",
522 '[[["i", "insert", ["set", [1]]]],
523 [["i", "insert", ["set", [2]]]],
524 [["i", "delete", ["set", [1]]]],
525 [["i", "delete", ["set", [2]]]],
526 [["i", "delete", ["set", [0, 1]]]]]' \
527 '[{"i": ["set", [0]]},
529 {"i": ["set", [0, 1]]}']]],
531 row 0: {"i":["set",[0,1]]}
532 row 1: {"i":["set",[1,2]]}
536 row 0: {"i":["set",[0,2]]}
538 row 2: constraint violation: Attempted to store 3 elements in set of 1 to 2 integers.
547 row 1: constraint violation: Attempted to store 0 elements in set of 1 to 2 integers.
551 row 0: constraint violation: Attempted to store 0 elements in set of 1 to 2 integers.
553 row 2: constraint violation: Attempted to store 0 elements in set of 1 to 2 integers.
556 OVSDB_CHECK_POSITIVE([executing mutations on real sets],
557 [[execute-mutations \
558 '{"columns": {"r": {"type": {"key": {"type": "real",
560 "min": 0, "max": "unlimited"}}}}' \
561 '[[["r", "+=", 0.5]],
566 [["r", "insert", 1.5]],
567 [["r", "insert", 3]],
568 [["r", "delete", ["set", [1.5, 3.5]]]],
569 [["r", "delete", ["set", [0.5, 1.5, 2.5]]]]]' \
570 '[{"r": ["set", []]},
572 {"r": ["set", [0.5, 1.5]]},
573 {"r": ["set", [0.5, 1.5, 2.5]]}']]],
577 row 2: {"r":["set",[1,2]]}
578 row 3: {"r":["set",[1,2,3]]}
583 row 2: {"r":["set",[-1,0]]}
584 row 3: {"r":["set",[-1,0,1]]}
589 row 2: {"r":["set",[1.25,3.75]]}
590 row 3: constraint violation: 6.25 is greater than maximum allowed value 6
595 row 2: {"r":["set",[0.125,0.375]]}
596 row 3: {"r":["set",[0.125,0.375,0.625]]}
601 row 2: constraint violation: Result of "*=" operation contains duplicates.
602 row 3: constraint violation: Result of "*=" operation contains duplicates.
606 row 1: {"r":["set",[0.5,1.5]]}
612 row 1: {"r":["set",[0.5,3]]}
613 row 2: {"r":["set",[0.5,1.5,3]]}
614 row 3: {"r":["set",[0.5,1.5,2.5,3]]}
620 row 3: {"r":["set",[0.5,2.5]]}
624 row 1: {"r":["set",[]]}
625 row 2: {"r":["set",[]]}
626 row 3: {"r":["set",[]]}
629 OVSDB_CHECK_POSITIVE([executing mutations on boolean sets],
630 [[execute-mutations \
631 '{"columns": {"b": {"type": {"key": "boolean", "min": 0, "max": "unlimited"}}}}' \
632 '[[["b", "insert", ["set", [false]]]],
633 [["b", "insert", ["set", [true]]]],
634 [["b", "insert", ["set", [false, true]]]],
635 [["b", "delete", ["set", [false]]]],
636 [["b", "delete", ["set", [true]]]],
637 [["b", "delete", ["set", [true, false]]]]]' \
638 '[{"b": ["set", []]},
639 {"b": ["set", [false]]},
640 {"b": ["set", [true]]},
641 {"b": ["set", [false, true]]}']]],
645 row 2: {"b":["set",[false,true]]}
650 row 1: {"b":["set",[false,true]]}
655 row 0: {"b":["set",[false,true]]}
656 row 1: {"b":["set",[false,true]]}
657 row 2: {"b":["set",[false,true]]}
662 row 1: {"b":["set",[]]}
669 row 2: {"b":["set",[]]}
674 row 1: {"b":["set",[]]}
675 row 2: {"b":["set",[]]}
676 row 3: {"b":["set",[]]}
679 OVSDB_CHECK_POSITIVE([executing mutations on string sets],
680 [[execute-mutations \
681 '{"columns": {"s": {"type": {"key": "string", "min": 0, "max": "unlimited"}}}}' \
682 '[[["s", "insert", ["set", ["a"]]]],
683 [["s", "insert", ["set", ["b"]]]],
684 [["s", "insert", ["set", ["c", "d"]]]],
685 [["s", "delete", ["set", ["a"]]]],
686 [["s", "delete", ["set", ["b"]]]],
687 [["s", "delete", ["set", ["c", "d"]]]]]' \
688 '[{"s": ["set", []]},
689 {"s": ["set", ["a"]]},
690 {"s": ["set", ["a", "b"]]},
691 {"s": ["set", ["a", "b", "c", "d"]]}']]],
700 row 1: {"s":["set",["a","b"]]}
705 row 0: {"s":["set",["c","d"]]}
706 row 1: {"s":["set",["a","c","d"]]}
707 row 2: {"s":["set",["a","b","c","d"]]}
712 row 1: {"s":["set",[]]}
714 row 3: {"s":["set",["b","c","d"]]}
720 row 3: {"s":["set",["a","c","d"]]}
726 row 3: {"s":["set",["a","b"]]}
729 OVSDB_CHECK_POSITIVE([executing mutations on uuid sets],
730 [[execute-mutations \
731 '{"columns": {"u": {"type": {"key": "uuid", "min": 0, "max": "unlimited"}}}}' \
732 '[[["u", "insert", ["set", [["uuid", "ddd9e79d-7782-414c-8b22-1046c60b6ec2"]]]]],
733 [["u", "insert", ["set", [["uuid", "a60fe7ff-317b-4568-9106-892b37445313"]]]]],
734 [["u", "insert", ["set", [["uuid", "2607d30e-e652-4927-9fec-8bbf1b60c7e9"]]]]],
735 [["u", "delete", ["set", [["uuid", "ddd9e79d-7782-414c-8b22-1046c60b6ec2"]]]]],
736 [["u", "delete", ["set", [["uuid", "a60fe7ff-317b-4568-9106-892b37445313"]]]]],
737 [["u", "delete", ["set", [["uuid", "2607d30e-e652-4927-9fec-8bbf1b60c7e9"]]]]]]' \
738 '[{"u": ["set", []]},
739 {"u": ["set", [["uuid", "ddd9e79d-7782-414c-8b22-1046c60b6ec2"]]]},
740 {"u": ["set", [["uuid", "a60fe7ff-317b-4568-9106-892b37445313"]]]},
741 {"u": ["set", [["uuid", "2607d30e-e652-4927-9fec-8bbf1b60c7e9"]]]}']]],
743 row 0: {"u":["uuid","ddd9e79d-7782-414c-8b22-1046c60b6ec2"]}
745 row 2: {"u":["set",[["uuid","a60fe7ff-317b-4568-9106-892b37445313"],["uuid","ddd9e79d-7782-414c-8b22-1046c60b6ec2"]]]}
746 row 3: {"u":["set",[["uuid","2607d30e-e652-4927-9fec-8bbf1b60c7e9"],["uuid","ddd9e79d-7782-414c-8b22-1046c60b6ec2"]]]}
749 row 0: {"u":["uuid","a60fe7ff-317b-4568-9106-892b37445313"]}
750 row 1: {"u":["set",[["uuid","a60fe7ff-317b-4568-9106-892b37445313"],["uuid","ddd9e79d-7782-414c-8b22-1046c60b6ec2"]]]}
752 row 3: {"u":["set",[["uuid","2607d30e-e652-4927-9fec-8bbf1b60c7e9"],["uuid","a60fe7ff-317b-4568-9106-892b37445313"]]]}
755 row 0: {"u":["uuid","2607d30e-e652-4927-9fec-8bbf1b60c7e9"]}
756 row 1: {"u":["set",[["uuid","2607d30e-e652-4927-9fec-8bbf1b60c7e9"],["uuid","ddd9e79d-7782-414c-8b22-1046c60b6ec2"]]]}
757 row 2: {"u":["set",[["uuid","2607d30e-e652-4927-9fec-8bbf1b60c7e9"],["uuid","a60fe7ff-317b-4568-9106-892b37445313"]]]}
762 row 1: {"u":["set",[]]}
769 row 2: {"u":["set",[]]}
776 row 3: {"u":["set",[]]}
779 OVSDB_CHECK_POSITIVE([executing mutations on integer maps],
780 [[execute-mutations \
781 '{"columns": {"i": {"type": {"key": "integer", "value": "integer", "min": 0, "max": "unlimited"}}}}' \
782 '[[["i", "insert", ["map", [[1, 2]]]]],
783 [["i", "insert", ["map", [[2, 4], [3, 5]]]]],
784 [["i", "delete", ["map", [[1, 2]]]]],
785 [["i", "delete", ["map", [[2, 3]]]]],
786 [["i", "delete", ["set", [1]]]],
787 [["i", "delete", ["set", [2, 3]]]]]' \
788 '[{"i": ["map", []]},
789 {"i": ["map", [[1, 2]]]},
790 {"i": ["map", [[1, 3], [2, 3]]]},
791 {"i": ["map", [[3, 5]]]}']]],
793 row 0: {"i":["map",[[1,2]]]}
796 row 3: {"i":["map",[[1,2],[3,5]]]}
799 row 0: {"i":["map",[[2,4],[3,5]]]}
800 row 1: {"i":["map",[[1,2],[2,4],[3,5]]]}
801 row 2: {"i":["map",[[1,3],[2,3],[3,5]]]}
802 row 3: {"i":["map",[[2,4],[3,5]]]}
806 row 1: {"i":["map",[]]}
813 row 2: {"i":["map",[[1,3]]]}
818 row 1: {"i":["map",[]]}
819 row 2: {"i":["map",[[2,3]]]}
825 row 2: {"i":["map",[[1,3]]]}
826 row 3: {"i":["map",[]]}