diff --git a/src/test/isolation/README b/src/test/isolation/README index 9d568e53543..8457a5689fb 100644 --- a/src/test/isolation/README +++ b/src/test/isolation/README @@ -80,7 +80,7 @@ teardown { } this to clean up in preparation for the next permutation, e.g dropping any test tables created by setup. This part is optional. -session "" +session There are normally several "session" parts in a spec file. Each session is executed in its own connection. A session part consists @@ -91,17 +91,17 @@ session "" Each step has the syntax - step "" { } + step { } - where is a name identifying this step, and SQL is a SQL statement + where is a name identifying this step, and is a SQL statement (or statements, separated by semicolons) that is executed in the step. Step names must be unique across the whole spec file. -permutation "" ... +permutation ... A permutation line specifies a list of steps that are run in that order. Any number of permutation lines can appear. If no permutation lines are - given, the test program automatically generates all possible orderings + given, the test program automatically runs all possible interleavings of the steps from each session (running the steps of any one session in order). Note that the list of steps in a manually specified "permutation" line doesn't actually have to be a permutation of the @@ -109,7 +109,17 @@ permutation "" ... or leave others out. Also, each step name can be annotated with some parenthesized markers, which are described below. -Lines beginning with a # are considered comments. +Session and step names are SQL identifiers, either plain or double-quoted. +A difference from standard SQL is that no case-folding occurs, so that +FOO and "FOO" are the same name while FOO and Foo are different, +whether you quote them or not. You must use quotes if you want to use +an isolation test keyword (such as "permutation") as a name. + +A # character begins a comment, which extends to the end of the line. +(This does not work inside blocks, however. Use the usual SQL +comment conventions there.) + +There is no way to include a "}" character in an block. For each permutation of the session steps (whether these are manually specified in the spec file, or automatically generated), the isolation diff --git a/src/test/isolation/specparse.y b/src/test/isolation/specparse.y index 33bbbdaaf1c..a0222136ea6 100644 --- a/src/test/isolation/specparse.y +++ b/src/test/isolation/specparse.y @@ -49,7 +49,7 @@ TestSpec parseresult; /* result of parsing is left here */ %type permutation_step %type blocker -%token sqlblock string_literal +%token sqlblock identifier %token INTEGER %token NOTICES PERMUTATION SESSION SETUP STEP TEARDOWN TEST @@ -117,7 +117,7 @@ session_list: ; session: - SESSION string_literal opt_setup step_list opt_teardown + SESSION identifier opt_setup step_list opt_teardown { $$ = pg_malloc(sizeof(Session)); $$->name = $2; @@ -146,7 +146,7 @@ step_list: step: - STEP string_literal sqlblock + STEP identifier sqlblock { $$ = pg_malloc(sizeof(Step)); $$->name = $2; @@ -211,7 +211,7 @@ permutation_step_list: ; permutation_step: - string_literal + identifier { $$ = pg_malloc(sizeof(PermutationStep)); $$->name = $1; @@ -219,7 +219,7 @@ permutation_step: $$->nblockers = 0; $$->step = NULL; } - | string_literal '(' blocker_list ')' + | identifier '(' blocker_list ')' { $$ = pg_malloc(sizeof(PermutationStep)); $$->name = $1; @@ -246,7 +246,7 @@ blocker_list: ; blocker: - string_literal + identifier { $$ = pg_malloc(sizeof(PermutationStepBlocker)); $$->stepname = $1; @@ -255,7 +255,7 @@ blocker: $$->step = NULL; $$->target_notices = -1; } - | string_literal NOTICES INTEGER + | identifier NOTICES INTEGER { $$ = pg_malloc(sizeof(PermutationStepBlocker)); $$->stepname = $1; diff --git a/src/test/isolation/specs/aborted-keyrevoke.spec b/src/test/isolation/specs/aborted-keyrevoke.spec index 08945d8b31c..4f6f9027ccb 100644 --- a/src/test/isolation/specs/aborted-keyrevoke.spec +++ b/src/test/isolation/specs/aborted-keyrevoke.spec @@ -17,30 +17,30 @@ teardown DROP TABLE foo; } -session "s1" +session s1 setup { BEGIN; } -step "s1s" { SAVEPOINT f; } -step "s1u" { UPDATE foo SET key = 2; } # obtain KEY REVOKE -step "s1r" { ROLLBACK TO f; } # lose KEY REVOKE -step "s1l" { SELECT * FROM foo FOR KEY SHARE; } -step "s1c" { COMMIT; } +step s1s { SAVEPOINT f; } +step s1u { UPDATE foo SET key = 2; } # obtain KEY REVOKE +step s1r { ROLLBACK TO f; } # lose KEY REVOKE +step s1l { SELECT * FROM foo FOR KEY SHARE; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2l" { SELECT * FROM foo FOR KEY SHARE; } -step "s2c" { COMMIT; } +step s2l { SELECT * FROM foo FOR KEY SHARE; } +step s2c { COMMIT; } -permutation "s1s" "s1u" "s1r" "s1l" "s1c" "s2l" "s2c" -permutation "s1s" "s1u" "s1r" "s1l" "s2l" "s1c" "s2c" -permutation "s1s" "s1u" "s1r" "s1l" "s2l" "s2c" "s1c" -permutation "s1s" "s1u" "s1r" "s2l" "s1l" "s1c" "s2c" -permutation "s1s" "s1u" "s1r" "s2l" "s1l" "s2c" "s1c" -permutation "s1s" "s1u" "s1r" "s2l" "s2c" "s1l" "s1c" -permutation "s1s" "s1u" "s2l" "s1r" "s1l" "s1c" "s2c" -permutation "s1s" "s1u" "s2l" "s1r" "s1l" "s2c" "s1c" -permutation "s1s" "s1u" "s2l" "s1r" "s2c" "s1l" "s1c" -permutation "s1s" "s2l" "s1u" "s2c" "s1r" "s1l" "s1c" -permutation "s1s" "s2l" "s2c" "s1u" "s1r" "s1l" "s1c" -permutation "s2l" "s1s" "s1u" "s2c" "s1r" "s1l" "s1c" -permutation "s2l" "s1s" "s2c" "s1u" "s1r" "s1l" "s1c" -permutation "s2l" "s2c" "s1s" "s1u" "s1r" "s1l" "s1c" +permutation s1s s1u s1r s1l s1c s2l s2c +permutation s1s s1u s1r s1l s2l s1c s2c +permutation s1s s1u s1r s1l s2l s2c s1c +permutation s1s s1u s1r s2l s1l s1c s2c +permutation s1s s1u s1r s2l s1l s2c s1c +permutation s1s s1u s1r s2l s2c s1l s1c +permutation s1s s1u s2l s1r s1l s1c s2c +permutation s1s s1u s2l s1r s1l s2c s1c +permutation s1s s1u s2l s1r s2c s1l s1c +permutation s1s s2l s1u s2c s1r s1l s1c +permutation s1s s2l s2c s1u s1r s1l s1c +permutation s2l s1s s1u s2c s1r s1l s1c +permutation s2l s1s s2c s1u s1r s1l s1c +permutation s2l s2c s1s s1u s1r s1l s1c diff --git a/src/test/isolation/specs/alter-table-1.spec b/src/test/isolation/specs/alter-table-1.spec index 10e463f6bcf..dfd0ce70945 100644 --- a/src/test/isolation/specs/alter-table-1.spec +++ b/src/test/isolation/specs/alter-table-1.spec @@ -16,155 +16,155 @@ teardown DROP TABLE a, b; } -session "s1" -step "s1" { BEGIN; } -step "at1" { ALTER TABLE b ADD CONSTRAINT bfk FOREIGN KEY (a_id) REFERENCES a (i) NOT VALID; } -step "sc1" { COMMIT; } -step "s2" { BEGIN; } -step "at2" { ALTER TABLE b VALIDATE CONSTRAINT bfk; } -step "sc2" { COMMIT; } +session s1 +step s1 { BEGIN; } +step at1 { ALTER TABLE b ADD CONSTRAINT bfk FOREIGN KEY (a_id) REFERENCES a (i) NOT VALID; } +step sc1 { COMMIT; } +step s2 { BEGIN; } +step at2 { ALTER TABLE b VALIDATE CONSTRAINT bfk; } +step sc2 { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "rx1" { SELECT * FROM b WHERE a_id = 1 LIMIT 1; } -step "wx" { INSERT INTO b VALUES (0); } -step "rx3" { SELECT * FROM b WHERE a_id = 3 LIMIT 3; } -step "c2" { COMMIT; } +step rx1 { SELECT * FROM b WHERE a_id = 1 LIMIT 1; } +step wx { INSERT INTO b VALUES (0); } +step rx3 { SELECT * FROM b WHERE a_id = 3 LIMIT 3; } +step c2 { COMMIT; } -permutation "s1" "at1" "sc1" "s2" "at2" "sc2" "rx1" "wx" "rx3" "c2" -permutation "s1" "at1" "sc1" "s2" "at2" "rx1" "sc2" "wx" "rx3" "c2" -permutation "s1" "at1" "sc1" "s2" "at2" "rx1" "wx" "sc2" "rx3" "c2" -permutation "s1" "at1" "sc1" "s2" "at2" "rx1" "wx" "rx3" "sc2" "c2" -permutation "s1" "at1" "sc1" "s2" "at2" "rx1" "wx" "rx3" "c2" "sc2" -permutation "s1" "at1" "sc1" "s2" "rx1" "at2" "sc2" "wx" "rx3" "c2" -permutation "s1" "at1" "sc1" "s2" "rx1" "at2" "wx" "sc2" "rx3" "c2" -permutation "s1" "at1" "sc1" "s2" "rx1" "at2" "wx" "rx3" "sc2" "c2" -permutation "s1" "at1" "sc1" "s2" "rx1" "at2" "wx" "rx3" "c2" "sc2" -permutation "s1" "at1" "sc1" "s2" "rx1" "wx" "at2" "sc2" "rx3" "c2" -permutation "s1" "at1" "sc1" "s2" "rx1" "wx" "at2" "rx3" "sc2" "c2" -permutation "s1" "at1" "sc1" "s2" "rx1" "wx" "at2" "rx3" "c2" "sc2" -permutation "s1" "at1" "sc1" "s2" "rx1" "wx" "rx3" "at2" "sc2" "c2" -permutation "s1" "at1" "sc1" "s2" "rx1" "wx" "rx3" "at2" "c2" "sc2" -permutation "s1" "at1" "sc1" "s2" "rx1" "wx" "rx3" "c2" "at2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "s2" "at2" "sc2" "wx" "rx3" "c2" -permutation "s1" "at1" "sc1" "rx1" "s2" "at2" "wx" "sc2" "rx3" "c2" -permutation "s1" "at1" "sc1" "rx1" "s2" "at2" "wx" "rx3" "sc2" "c2" -permutation "s1" "at1" "sc1" "rx1" "s2" "at2" "wx" "rx3" "c2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "s2" "wx" "at2" "sc2" "rx3" "c2" -permutation "s1" "at1" "sc1" "rx1" "s2" "wx" "at2" "rx3" "sc2" "c2" -permutation "s1" "at1" "sc1" "rx1" "s2" "wx" "at2" "rx3" "c2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "s2" "wx" "rx3" "at2" "sc2" "c2" -permutation "s1" "at1" "sc1" "rx1" "s2" "wx" "rx3" "at2" "c2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "s2" "wx" "rx3" "c2" "at2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "wx" "s2" "at2" "sc2" "rx3" "c2" -permutation "s1" "at1" "sc1" "rx1" "wx" "s2" "at2" "rx3" "sc2" "c2" -permutation "s1" "at1" "sc1" "rx1" "wx" "s2" "at2" "rx3" "c2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "wx" "s2" "rx3" "at2" "sc2" "c2" -permutation "s1" "at1" "sc1" "rx1" "wx" "s2" "rx3" "at2" "c2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "wx" "s2" "rx3" "c2" "at2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "wx" "rx3" "s2" "at2" "sc2" "c2" -permutation "s1" "at1" "sc1" "rx1" "wx" "rx3" "s2" "at2" "c2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "wx" "rx3" "s2" "c2" "at2" "sc2" -permutation "s1" "at1" "sc1" "rx1" "wx" "rx3" "c2" "s2" "at2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "s2" "at2" "sc2" "wx" "rx3" "c2" -permutation "s1" "at1" "rx1" "sc1" "s2" "at2" "wx" "sc2" "rx3" "c2" -permutation "s1" "at1" "rx1" "sc1" "s2" "at2" "wx" "rx3" "sc2" "c2" -permutation "s1" "at1" "rx1" "sc1" "s2" "at2" "wx" "rx3" "c2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "s2" "wx" "at2" "sc2" "rx3" "c2" -permutation "s1" "at1" "rx1" "sc1" "s2" "wx" "at2" "rx3" "sc2" "c2" -permutation "s1" "at1" "rx1" "sc1" "s2" "wx" "at2" "rx3" "c2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "s2" "wx" "rx3" "at2" "sc2" "c2" -permutation "s1" "at1" "rx1" "sc1" "s2" "wx" "rx3" "at2" "c2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "s2" "wx" "rx3" "c2" "at2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "wx" "s2" "at2" "sc2" "rx3" "c2" -permutation "s1" "at1" "rx1" "sc1" "wx" "s2" "at2" "rx3" "sc2" "c2" -permutation "s1" "at1" "rx1" "sc1" "wx" "s2" "at2" "rx3" "c2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "wx" "s2" "rx3" "at2" "sc2" "c2" -permutation "s1" "at1" "rx1" "sc1" "wx" "s2" "rx3" "at2" "c2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "wx" "s2" "rx3" "c2" "at2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "wx" "rx3" "s2" "at2" "sc2" "c2" -permutation "s1" "at1" "rx1" "sc1" "wx" "rx3" "s2" "at2" "c2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "wx" "rx3" "s2" "c2" "at2" "sc2" -permutation "s1" "at1" "rx1" "sc1" "wx" "rx3" "c2" "s2" "at2" "sc2" -permutation "s1" "at1" "rx1" "wx" "sc1" "s2" "at2" "sc2" "rx3" "c2" -permutation "s1" "at1" "rx1" "wx" "sc1" "s2" "at2" "rx3" "sc2" "c2" -permutation "s1" "at1" "rx1" "wx" "sc1" "s2" "at2" "rx3" "c2" "sc2" -permutation "s1" "at1" "rx1" "wx" "sc1" "s2" "rx3" "at2" "sc2" "c2" -permutation "s1" "at1" "rx1" "wx" "sc1" "s2" "rx3" "at2" "c2" "sc2" -permutation "s1" "at1" "rx1" "wx" "sc1" "s2" "rx3" "c2" "at2" "sc2" -permutation "s1" "at1" "rx1" "wx" "sc1" "rx3" "s2" "at2" "sc2" "c2" -permutation "s1" "at1" "rx1" "wx" "sc1" "rx3" "s2" "at2" "c2" "sc2" -permutation "s1" "at1" "rx1" "wx" "sc1" "rx3" "s2" "c2" "at2" "sc2" -permutation "s1" "at1" "rx1" "wx" "sc1" "rx3" "c2" "s2" "at2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "s2" "at2" "sc2" "wx" "rx3" "c2" -permutation "s1" "rx1" "at1" "sc1" "s2" "at2" "wx" "sc2" "rx3" "c2" -permutation "s1" "rx1" "at1" "sc1" "s2" "at2" "wx" "rx3" "sc2" "c2" -permutation "s1" "rx1" "at1" "sc1" "s2" "at2" "wx" "rx3" "c2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "s2" "wx" "at2" "sc2" "rx3" "c2" -permutation "s1" "rx1" "at1" "sc1" "s2" "wx" "at2" "rx3" "sc2" "c2" -permutation "s1" "rx1" "at1" "sc1" "s2" "wx" "at2" "rx3" "c2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "s2" "wx" "rx3" "at2" "sc2" "c2" -permutation "s1" "rx1" "at1" "sc1" "s2" "wx" "rx3" "at2" "c2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "s2" "wx" "rx3" "c2" "at2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "wx" "s2" "at2" "sc2" "rx3" "c2" -permutation "s1" "rx1" "at1" "sc1" "wx" "s2" "at2" "rx3" "sc2" "c2" -permutation "s1" "rx1" "at1" "sc1" "wx" "s2" "at2" "rx3" "c2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "wx" "s2" "rx3" "at2" "sc2" "c2" -permutation "s1" "rx1" "at1" "sc1" "wx" "s2" "rx3" "at2" "c2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "wx" "s2" "rx3" "c2" "at2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "wx" "rx3" "s2" "at2" "sc2" "c2" -permutation "s1" "rx1" "at1" "sc1" "wx" "rx3" "s2" "at2" "c2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "wx" "rx3" "s2" "c2" "at2" "sc2" -permutation "s1" "rx1" "at1" "sc1" "wx" "rx3" "c2" "s2" "at2" "sc2" -permutation "s1" "rx1" "at1" "wx" "sc1" "s2" "at2" "sc2" "rx3" "c2" -permutation "s1" "rx1" "at1" "wx" "sc1" "s2" "at2" "rx3" "sc2" "c2" -permutation "s1" "rx1" "at1" "wx" "sc1" "s2" "at2" "rx3" "c2" "sc2" -permutation "s1" "rx1" "at1" "wx" "sc1" "s2" "rx3" "at2" "sc2" "c2" -permutation "s1" "rx1" "at1" "wx" "sc1" "s2" "rx3" "at2" "c2" "sc2" -permutation "s1" "rx1" "at1" "wx" "sc1" "s2" "rx3" "c2" "at2" "sc2" -permutation "s1" "rx1" "at1" "wx" "sc1" "rx3" "s2" "at2" "sc2" "c2" -permutation "s1" "rx1" "at1" "wx" "sc1" "rx3" "s2" "at2" "c2" "sc2" -permutation "s1" "rx1" "at1" "wx" "sc1" "rx3" "s2" "c2" "at2" "sc2" -permutation "s1" "rx1" "at1" "wx" "sc1" "rx3" "c2" "s2" "at2" "sc2" -permutation "s1" "rx1" "wx" "at1" "rx3" "c2" "sc1" "s2" "at2" "sc2" -permutation "s1" "rx1" "wx" "rx3" "at1" "c2" "sc1" "s2" "at2" "sc2" -permutation "s1" "rx1" "wx" "rx3" "c2" "at1" "sc1" "s2" "at2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "s2" "at2" "sc2" "wx" "rx3" "c2" -permutation "rx1" "s1" "at1" "sc1" "s2" "at2" "wx" "sc2" "rx3" "c2" -permutation "rx1" "s1" "at1" "sc1" "s2" "at2" "wx" "rx3" "sc2" "c2" -permutation "rx1" "s1" "at1" "sc1" "s2" "at2" "wx" "rx3" "c2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "s2" "wx" "at2" "sc2" "rx3" "c2" -permutation "rx1" "s1" "at1" "sc1" "s2" "wx" "at2" "rx3" "sc2" "c2" -permutation "rx1" "s1" "at1" "sc1" "s2" "wx" "at2" "rx3" "c2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "s2" "wx" "rx3" "at2" "sc2" "c2" -permutation "rx1" "s1" "at1" "sc1" "s2" "wx" "rx3" "at2" "c2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "s2" "wx" "rx3" "c2" "at2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "wx" "s2" "at2" "sc2" "rx3" "c2" -permutation "rx1" "s1" "at1" "sc1" "wx" "s2" "at2" "rx3" "sc2" "c2" -permutation "rx1" "s1" "at1" "sc1" "wx" "s2" "at2" "rx3" "c2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "wx" "s2" "rx3" "at2" "sc2" "c2" -permutation "rx1" "s1" "at1" "sc1" "wx" "s2" "rx3" "at2" "c2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "wx" "s2" "rx3" "c2" "at2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "wx" "rx3" "s2" "at2" "sc2" "c2" -permutation "rx1" "s1" "at1" "sc1" "wx" "rx3" "s2" "at2" "c2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "wx" "rx3" "s2" "c2" "at2" "sc2" -permutation "rx1" "s1" "at1" "sc1" "wx" "rx3" "c2" "s2" "at2" "sc2" -permutation "rx1" "s1" "at1" "wx" "sc1" "s2" "at2" "sc2" "rx3" "c2" -permutation "rx1" "s1" "at1" "wx" "sc1" "s2" "at2" "rx3" "sc2" "c2" -permutation "rx1" "s1" "at1" "wx" "sc1" "s2" "at2" "rx3" "c2" "sc2" -permutation "rx1" "s1" "at1" "wx" "sc1" "s2" "rx3" "at2" "sc2" "c2" -permutation "rx1" "s1" "at1" "wx" "sc1" "s2" "rx3" "at2" "c2" "sc2" -permutation "rx1" "s1" "at1" "wx" "sc1" "s2" "rx3" "c2" "at2" "sc2" -permutation "rx1" "s1" "at1" "wx" "sc1" "rx3" "s2" "at2" "sc2" "c2" -permutation "rx1" "s1" "at1" "wx" "sc1" "rx3" "s2" "at2" "c2" "sc2" -permutation "rx1" "s1" "at1" "wx" "sc1" "rx3" "s2" "c2" "at2" "sc2" -permutation "rx1" "s1" "at1" "wx" "sc1" "rx3" "c2" "s2" "at2" "sc2" -permutation "rx1" "s1" "wx" "at1" "rx3" "c2" "sc1" "s2" "at2" "sc2" -permutation "rx1" "s1" "wx" "rx3" "at1" "c2" "sc1" "s2" "at2" "sc2" -permutation "rx1" "s1" "wx" "rx3" "c2" "at1" "sc1" "s2" "at2" "sc2" -permutation "rx1" "wx" "s1" "at1" "rx3" "c2" "sc1" "s2" "at2" "sc2" -permutation "rx1" "wx" "s1" "rx3" "at1" "c2" "sc1" "s2" "at2" "sc2" -permutation "rx1" "wx" "s1" "rx3" "c2" "at1" "sc1" "s2" "at2" "sc2" -permutation "rx1" "wx" "rx3" "s1" "at1" "c2" "sc1" "s2" "at2" "sc2" -permutation "rx1" "wx" "rx3" "s1" "c2" "at1" "sc1" "s2" "at2" "sc2" -permutation "rx1" "wx" "rx3" "c2" "s1" "at1" "sc1" "s2" "at2" "sc2" +permutation s1 at1 sc1 s2 at2 sc2 rx1 wx rx3 c2 +permutation s1 at1 sc1 s2 at2 rx1 sc2 wx rx3 c2 +permutation s1 at1 sc1 s2 at2 rx1 wx sc2 rx3 c2 +permutation s1 at1 sc1 s2 at2 rx1 wx rx3 sc2 c2 +permutation s1 at1 sc1 s2 at2 rx1 wx rx3 c2 sc2 +permutation s1 at1 sc1 s2 rx1 at2 sc2 wx rx3 c2 +permutation s1 at1 sc1 s2 rx1 at2 wx sc2 rx3 c2 +permutation s1 at1 sc1 s2 rx1 at2 wx rx3 sc2 c2 +permutation s1 at1 sc1 s2 rx1 at2 wx rx3 c2 sc2 +permutation s1 at1 sc1 s2 rx1 wx at2 sc2 rx3 c2 +permutation s1 at1 sc1 s2 rx1 wx at2 rx3 sc2 c2 +permutation s1 at1 sc1 s2 rx1 wx at2 rx3 c2 sc2 +permutation s1 at1 sc1 s2 rx1 wx rx3 at2 sc2 c2 +permutation s1 at1 sc1 s2 rx1 wx rx3 at2 c2 sc2 +permutation s1 at1 sc1 s2 rx1 wx rx3 c2 at2 sc2 +permutation s1 at1 sc1 rx1 s2 at2 sc2 wx rx3 c2 +permutation s1 at1 sc1 rx1 s2 at2 wx sc2 rx3 c2 +permutation s1 at1 sc1 rx1 s2 at2 wx rx3 sc2 c2 +permutation s1 at1 sc1 rx1 s2 at2 wx rx3 c2 sc2 +permutation s1 at1 sc1 rx1 s2 wx at2 sc2 rx3 c2 +permutation s1 at1 sc1 rx1 s2 wx at2 rx3 sc2 c2 +permutation s1 at1 sc1 rx1 s2 wx at2 rx3 c2 sc2 +permutation s1 at1 sc1 rx1 s2 wx rx3 at2 sc2 c2 +permutation s1 at1 sc1 rx1 s2 wx rx3 at2 c2 sc2 +permutation s1 at1 sc1 rx1 s2 wx rx3 c2 at2 sc2 +permutation s1 at1 sc1 rx1 wx s2 at2 sc2 rx3 c2 +permutation s1 at1 sc1 rx1 wx s2 at2 rx3 sc2 c2 +permutation s1 at1 sc1 rx1 wx s2 at2 rx3 c2 sc2 +permutation s1 at1 sc1 rx1 wx s2 rx3 at2 sc2 c2 +permutation s1 at1 sc1 rx1 wx s2 rx3 at2 c2 sc2 +permutation s1 at1 sc1 rx1 wx s2 rx3 c2 at2 sc2 +permutation s1 at1 sc1 rx1 wx rx3 s2 at2 sc2 c2 +permutation s1 at1 sc1 rx1 wx rx3 s2 at2 c2 sc2 +permutation s1 at1 sc1 rx1 wx rx3 s2 c2 at2 sc2 +permutation s1 at1 sc1 rx1 wx rx3 c2 s2 at2 sc2 +permutation s1 at1 rx1 sc1 s2 at2 sc2 wx rx3 c2 +permutation s1 at1 rx1 sc1 s2 at2 wx sc2 rx3 c2 +permutation s1 at1 rx1 sc1 s2 at2 wx rx3 sc2 c2 +permutation s1 at1 rx1 sc1 s2 at2 wx rx3 c2 sc2 +permutation s1 at1 rx1 sc1 s2 wx at2 sc2 rx3 c2 +permutation s1 at1 rx1 sc1 s2 wx at2 rx3 sc2 c2 +permutation s1 at1 rx1 sc1 s2 wx at2 rx3 c2 sc2 +permutation s1 at1 rx1 sc1 s2 wx rx3 at2 sc2 c2 +permutation s1 at1 rx1 sc1 s2 wx rx3 at2 c2 sc2 +permutation s1 at1 rx1 sc1 s2 wx rx3 c2 at2 sc2 +permutation s1 at1 rx1 sc1 wx s2 at2 sc2 rx3 c2 +permutation s1 at1 rx1 sc1 wx s2 at2 rx3 sc2 c2 +permutation s1 at1 rx1 sc1 wx s2 at2 rx3 c2 sc2 +permutation s1 at1 rx1 sc1 wx s2 rx3 at2 sc2 c2 +permutation s1 at1 rx1 sc1 wx s2 rx3 at2 c2 sc2 +permutation s1 at1 rx1 sc1 wx s2 rx3 c2 at2 sc2 +permutation s1 at1 rx1 sc1 wx rx3 s2 at2 sc2 c2 +permutation s1 at1 rx1 sc1 wx rx3 s2 at2 c2 sc2 +permutation s1 at1 rx1 sc1 wx rx3 s2 c2 at2 sc2 +permutation s1 at1 rx1 sc1 wx rx3 c2 s2 at2 sc2 +permutation s1 at1 rx1 wx sc1 s2 at2 sc2 rx3 c2 +permutation s1 at1 rx1 wx sc1 s2 at2 rx3 sc2 c2 +permutation s1 at1 rx1 wx sc1 s2 at2 rx3 c2 sc2 +permutation s1 at1 rx1 wx sc1 s2 rx3 at2 sc2 c2 +permutation s1 at1 rx1 wx sc1 s2 rx3 at2 c2 sc2 +permutation s1 at1 rx1 wx sc1 s2 rx3 c2 at2 sc2 +permutation s1 at1 rx1 wx sc1 rx3 s2 at2 sc2 c2 +permutation s1 at1 rx1 wx sc1 rx3 s2 at2 c2 sc2 +permutation s1 at1 rx1 wx sc1 rx3 s2 c2 at2 sc2 +permutation s1 at1 rx1 wx sc1 rx3 c2 s2 at2 sc2 +permutation s1 rx1 at1 sc1 s2 at2 sc2 wx rx3 c2 +permutation s1 rx1 at1 sc1 s2 at2 wx sc2 rx3 c2 +permutation s1 rx1 at1 sc1 s2 at2 wx rx3 sc2 c2 +permutation s1 rx1 at1 sc1 s2 at2 wx rx3 c2 sc2 +permutation s1 rx1 at1 sc1 s2 wx at2 sc2 rx3 c2 +permutation s1 rx1 at1 sc1 s2 wx at2 rx3 sc2 c2 +permutation s1 rx1 at1 sc1 s2 wx at2 rx3 c2 sc2 +permutation s1 rx1 at1 sc1 s2 wx rx3 at2 sc2 c2 +permutation s1 rx1 at1 sc1 s2 wx rx3 at2 c2 sc2 +permutation s1 rx1 at1 sc1 s2 wx rx3 c2 at2 sc2 +permutation s1 rx1 at1 sc1 wx s2 at2 sc2 rx3 c2 +permutation s1 rx1 at1 sc1 wx s2 at2 rx3 sc2 c2 +permutation s1 rx1 at1 sc1 wx s2 at2 rx3 c2 sc2 +permutation s1 rx1 at1 sc1 wx s2 rx3 at2 sc2 c2 +permutation s1 rx1 at1 sc1 wx s2 rx3 at2 c2 sc2 +permutation s1 rx1 at1 sc1 wx s2 rx3 c2 at2 sc2 +permutation s1 rx1 at1 sc1 wx rx3 s2 at2 sc2 c2 +permutation s1 rx1 at1 sc1 wx rx3 s2 at2 c2 sc2 +permutation s1 rx1 at1 sc1 wx rx3 s2 c2 at2 sc2 +permutation s1 rx1 at1 sc1 wx rx3 c2 s2 at2 sc2 +permutation s1 rx1 at1 wx sc1 s2 at2 sc2 rx3 c2 +permutation s1 rx1 at1 wx sc1 s2 at2 rx3 sc2 c2 +permutation s1 rx1 at1 wx sc1 s2 at2 rx3 c2 sc2 +permutation s1 rx1 at1 wx sc1 s2 rx3 at2 sc2 c2 +permutation s1 rx1 at1 wx sc1 s2 rx3 at2 c2 sc2 +permutation s1 rx1 at1 wx sc1 s2 rx3 c2 at2 sc2 +permutation s1 rx1 at1 wx sc1 rx3 s2 at2 sc2 c2 +permutation s1 rx1 at1 wx sc1 rx3 s2 at2 c2 sc2 +permutation s1 rx1 at1 wx sc1 rx3 s2 c2 at2 sc2 +permutation s1 rx1 at1 wx sc1 rx3 c2 s2 at2 sc2 +permutation s1 rx1 wx at1 rx3 c2 sc1 s2 at2 sc2 +permutation s1 rx1 wx rx3 at1 c2 sc1 s2 at2 sc2 +permutation s1 rx1 wx rx3 c2 at1 sc1 s2 at2 sc2 +permutation rx1 s1 at1 sc1 s2 at2 sc2 wx rx3 c2 +permutation rx1 s1 at1 sc1 s2 at2 wx sc2 rx3 c2 +permutation rx1 s1 at1 sc1 s2 at2 wx rx3 sc2 c2 +permutation rx1 s1 at1 sc1 s2 at2 wx rx3 c2 sc2 +permutation rx1 s1 at1 sc1 s2 wx at2 sc2 rx3 c2 +permutation rx1 s1 at1 sc1 s2 wx at2 rx3 sc2 c2 +permutation rx1 s1 at1 sc1 s2 wx at2 rx3 c2 sc2 +permutation rx1 s1 at1 sc1 s2 wx rx3 at2 sc2 c2 +permutation rx1 s1 at1 sc1 s2 wx rx3 at2 c2 sc2 +permutation rx1 s1 at1 sc1 s2 wx rx3 c2 at2 sc2 +permutation rx1 s1 at1 sc1 wx s2 at2 sc2 rx3 c2 +permutation rx1 s1 at1 sc1 wx s2 at2 rx3 sc2 c2 +permutation rx1 s1 at1 sc1 wx s2 at2 rx3 c2 sc2 +permutation rx1 s1 at1 sc1 wx s2 rx3 at2 sc2 c2 +permutation rx1 s1 at1 sc1 wx s2 rx3 at2 c2 sc2 +permutation rx1 s1 at1 sc1 wx s2 rx3 c2 at2 sc2 +permutation rx1 s1 at1 sc1 wx rx3 s2 at2 sc2 c2 +permutation rx1 s1 at1 sc1 wx rx3 s2 at2 c2 sc2 +permutation rx1 s1 at1 sc1 wx rx3 s2 c2 at2 sc2 +permutation rx1 s1 at1 sc1 wx rx3 c2 s2 at2 sc2 +permutation rx1 s1 at1 wx sc1 s2 at2 sc2 rx3 c2 +permutation rx1 s1 at1 wx sc1 s2 at2 rx3 sc2 c2 +permutation rx1 s1 at1 wx sc1 s2 at2 rx3 c2 sc2 +permutation rx1 s1 at1 wx sc1 s2 rx3 at2 sc2 c2 +permutation rx1 s1 at1 wx sc1 s2 rx3 at2 c2 sc2 +permutation rx1 s1 at1 wx sc1 s2 rx3 c2 at2 sc2 +permutation rx1 s1 at1 wx sc1 rx3 s2 at2 sc2 c2 +permutation rx1 s1 at1 wx sc1 rx3 s2 at2 c2 sc2 +permutation rx1 s1 at1 wx sc1 rx3 s2 c2 at2 sc2 +permutation rx1 s1 at1 wx sc1 rx3 c2 s2 at2 sc2 +permutation rx1 s1 wx at1 rx3 c2 sc1 s2 at2 sc2 +permutation rx1 s1 wx rx3 at1 c2 sc1 s2 at2 sc2 +permutation rx1 s1 wx rx3 c2 at1 sc1 s2 at2 sc2 +permutation rx1 wx s1 at1 rx3 c2 sc1 s2 at2 sc2 +permutation rx1 wx s1 rx3 at1 c2 sc1 s2 at2 sc2 +permutation rx1 wx s1 rx3 c2 at1 sc1 s2 at2 sc2 +permutation rx1 wx rx3 s1 at1 c2 sc1 s2 at2 sc2 +permutation rx1 wx rx3 s1 c2 at1 sc1 s2 at2 sc2 +permutation rx1 wx rx3 c2 s1 at1 sc1 s2 at2 sc2 diff --git a/src/test/isolation/specs/alter-table-2.spec b/src/test/isolation/specs/alter-table-2.spec index 9b17992d7d2..a3e3131e9f9 100644 --- a/src/test/isolation/specs/alter-table-2.spec +++ b/src/test/isolation/specs/alter-table-2.spec @@ -16,64 +16,64 @@ teardown DROP TABLE a, b; } -session "s1" -step "s1a" { BEGIN; } -step "s1b" { ALTER TABLE b ADD CONSTRAINT bfk FOREIGN KEY (a_id) REFERENCES a (i) NOT VALID; } -step "s1c" { COMMIT; } +session s1 +step s1a { BEGIN; } +step s1b { ALTER TABLE b ADD CONSTRAINT bfk FOREIGN KEY (a_id) REFERENCES a (i) NOT VALID; } +step s1c { COMMIT; } -session "s2" -step "s2a" { BEGIN; } -step "s2b" { SELECT * FROM a WHERE i = 1 LIMIT 1 FOR UPDATE; } -step "s2c" { SELECT * FROM b WHERE a_id = 3 LIMIT 1 FOR UPDATE; } -step "s2d" { INSERT INTO b VALUES (0); } -step "s2e" { INSERT INTO a VALUES (4); } -step "s2f" { COMMIT; } +session s2 +step s2a { BEGIN; } +step s2b { SELECT * FROM a WHERE i = 1 LIMIT 1 FOR UPDATE; } +step s2c { SELECT * FROM b WHERE a_id = 3 LIMIT 1 FOR UPDATE; } +step s2d { INSERT INTO b VALUES (0); } +step s2e { INSERT INTO a VALUES (4); } +step s2f { COMMIT; } -permutation "s1a" "s1b" "s1c" "s2a" "s2b" "s2c" "s2d" "s2e" "s2f" -permutation "s1a" "s1b" "s2a" "s1c" "s2b" "s2c" "s2d" "s2e" "s2f" -permutation "s1a" "s1b" "s2a" "s2b" "s1c" "s2c" "s2d" "s2e" "s2f" -permutation "s1a" "s1b" "s2a" "s2b" "s2c" "s1c" "s2d" "s2e" "s2f" -permutation "s1a" "s1b" "s2a" "s2b" "s2c" "s2d" "s1c" "s2e" "s2f" -permutation "s1a" "s2a" "s1b" "s1c" "s2b" "s2c" "s2d" "s2e" "s2f" -permutation "s1a" "s2a" "s1b" "s2b" "s1c" "s2c" "s2d" "s2e" "s2f" -permutation "s1a" "s2a" "s1b" "s2b" "s2c" "s1c" "s2d" "s2e" "s2f" -permutation "s1a" "s2a" "s1b" "s2b" "s2c" "s2d" "s1c" "s2e" "s2f" -permutation "s1a" "s2a" "s2b" "s1b" "s1c" "s2c" "s2d" "s2e" "s2f" -permutation "s1a" "s2a" "s2b" "s1b" "s2c" "s1c" "s2d" "s2e" "s2f" -permutation "s1a" "s2a" "s2b" "s1b" "s2c" "s2d" "s1c" "s2e" "s2f" -permutation "s1a" "s2a" "s2b" "s2c" "s1b" "s1c" "s2d" "s2e" "s2f" -permutation "s1a" "s2a" "s2b" "s2c" "s1b" "s2d" "s1c" "s2e" "s2f" -permutation "s1a" "s2a" "s2b" "s2c" "s2d" "s1b" "s2e" "s2f" "s1c" -permutation "s1a" "s2a" "s2b" "s2c" "s2d" "s2e" "s1b" "s2f" "s1c" -permutation "s1a" "s2a" "s2b" "s2c" "s2d" "s2e" "s2f" "s1b" "s1c" -permutation "s2a" "s1a" "s1b" "s1c" "s2b" "s2c" "s2d" "s2e" "s2f" -permutation "s2a" "s1a" "s1b" "s2b" "s1c" "s2c" "s2d" "s2e" "s2f" -permutation "s2a" "s1a" "s1b" "s2b" "s2c" "s1c" "s2d" "s2e" "s2f" -permutation "s2a" "s1a" "s1b" "s2b" "s2c" "s2d" "s1c" "s2e" "s2f" -permutation "s2a" "s1a" "s2b" "s1b" "s1c" "s2c" "s2d" "s2e" "s2f" -permutation "s2a" "s1a" "s2b" "s1b" "s2c" "s1c" "s2d" "s2e" "s2f" -permutation "s2a" "s1a" "s2b" "s1b" "s2c" "s2d" "s1c" "s2e" "s2f" -permutation "s2a" "s1a" "s2b" "s2c" "s1b" "s1c" "s2d" "s2e" "s2f" -permutation "s2a" "s1a" "s2b" "s2c" "s1b" "s2d" "s1c" "s2e" "s2f" -permutation "s2a" "s1a" "s2b" "s2c" "s2d" "s1b" "s2e" "s2f" "s1c" -permutation "s2a" "s1a" "s2b" "s2c" "s2d" "s2e" "s1b" "s2f" "s1c" -permutation "s2a" "s1a" "s2b" "s2c" "s2d" "s2e" "s2f" "s1b" "s1c" -permutation "s2a" "s2b" "s1a" "s1b" "s1c" "s2c" "s2d" "s2e" "s2f" -permutation "s2a" "s2b" "s1a" "s1b" "s2c" "s1c" "s2d" "s2e" "s2f" -permutation "s2a" "s2b" "s1a" "s1b" "s2c" "s2d" "s1c" "s2e" "s2f" -permutation "s2a" "s2b" "s1a" "s2c" "s1b" "s1c" "s2d" "s2e" "s2f" -permutation "s2a" "s2b" "s1a" "s2c" "s1b" "s2d" "s1c" "s2e" "s2f" -permutation "s2a" "s2b" "s1a" "s2c" "s2d" "s1b" "s2e" "s2f" "s1c" -permutation "s2a" "s2b" "s1a" "s2c" "s2d" "s2e" "s1b" "s2f" "s1c" -permutation "s2a" "s2b" "s1a" "s2c" "s2d" "s2e" "s2f" "s1b" "s1c" -permutation "s2a" "s2b" "s2c" "s1a" "s1b" "s1c" "s2d" "s2e" "s2f" -permutation "s2a" "s2b" "s2c" "s1a" "s1b" "s2d" "s1c" "s2e" "s2f" -permutation "s2a" "s2b" "s2c" "s1a" "s2d" "s1b" "s2e" "s2f" "s1c" -permutation "s2a" "s2b" "s2c" "s1a" "s2d" "s2e" "s1b" "s2f" "s1c" -permutation "s2a" "s2b" "s2c" "s1a" "s2d" "s2e" "s2f" "s1b" "s1c" -permutation "s2a" "s2b" "s2c" "s2d" "s1a" "s1b" "s2e" "s2f" "s1c" -permutation "s2a" "s2b" "s2c" "s2d" "s1a" "s2e" "s1b" "s2f" "s1c" -permutation "s2a" "s2b" "s2c" "s2d" "s1a" "s2e" "s2f" "s1b" "s1c" -permutation "s2a" "s2b" "s2c" "s2d" "s2e" "s1a" "s1b" "s2f" "s1c" -permutation "s2a" "s2b" "s2c" "s2d" "s2e" "s1a" "s2f" "s1b" "s1c" -permutation "s2a" "s2b" "s2c" "s2d" "s2e" "s2f" "s1a" "s1b" "s1c" +permutation s1a s1b s1c s2a s2b s2c s2d s2e s2f +permutation s1a s1b s2a s1c s2b s2c s2d s2e s2f +permutation s1a s1b s2a s2b s1c s2c s2d s2e s2f +permutation s1a s1b s2a s2b s2c s1c s2d s2e s2f +permutation s1a s1b s2a s2b s2c s2d s1c s2e s2f +permutation s1a s2a s1b s1c s2b s2c s2d s2e s2f +permutation s1a s2a s1b s2b s1c s2c s2d s2e s2f +permutation s1a s2a s1b s2b s2c s1c s2d s2e s2f +permutation s1a s2a s1b s2b s2c s2d s1c s2e s2f +permutation s1a s2a s2b s1b s1c s2c s2d s2e s2f +permutation s1a s2a s2b s1b s2c s1c s2d s2e s2f +permutation s1a s2a s2b s1b s2c s2d s1c s2e s2f +permutation s1a s2a s2b s2c s1b s1c s2d s2e s2f +permutation s1a s2a s2b s2c s1b s2d s1c s2e s2f +permutation s1a s2a s2b s2c s2d s1b s2e s2f s1c +permutation s1a s2a s2b s2c s2d s2e s1b s2f s1c +permutation s1a s2a s2b s2c s2d s2e s2f s1b s1c +permutation s2a s1a s1b s1c s2b s2c s2d s2e s2f +permutation s2a s1a s1b s2b s1c s2c s2d s2e s2f +permutation s2a s1a s1b s2b s2c s1c s2d s2e s2f +permutation s2a s1a s1b s2b s2c s2d s1c s2e s2f +permutation s2a s1a s2b s1b s1c s2c s2d s2e s2f +permutation s2a s1a s2b s1b s2c s1c s2d s2e s2f +permutation s2a s1a s2b s1b s2c s2d s1c s2e s2f +permutation s2a s1a s2b s2c s1b s1c s2d s2e s2f +permutation s2a s1a s2b s2c s1b s2d s1c s2e s2f +permutation s2a s1a s2b s2c s2d s1b s2e s2f s1c +permutation s2a s1a s2b s2c s2d s2e s1b s2f s1c +permutation s2a s1a s2b s2c s2d s2e s2f s1b s1c +permutation s2a s2b s1a s1b s1c s2c s2d s2e s2f +permutation s2a s2b s1a s1b s2c s1c s2d s2e s2f +permutation s2a s2b s1a s1b s2c s2d s1c s2e s2f +permutation s2a s2b s1a s2c s1b s1c s2d s2e s2f +permutation s2a s2b s1a s2c s1b s2d s1c s2e s2f +permutation s2a s2b s1a s2c s2d s1b s2e s2f s1c +permutation s2a s2b s1a s2c s2d s2e s1b s2f s1c +permutation s2a s2b s1a s2c s2d s2e s2f s1b s1c +permutation s2a s2b s2c s1a s1b s1c s2d s2e s2f +permutation s2a s2b s2c s1a s1b s2d s1c s2e s2f +permutation s2a s2b s2c s1a s2d s1b s2e s2f s1c +permutation s2a s2b s2c s1a s2d s2e s1b s2f s1c +permutation s2a s2b s2c s1a s2d s2e s2f s1b s1c +permutation s2a s2b s2c s2d s1a s1b s2e s2f s1c +permutation s2a s2b s2c s2d s1a s2e s1b s2f s1c +permutation s2a s2b s2c s2d s1a s2e s2f s1b s1c +permutation s2a s2b s2c s2d s2e s1a s1b s2f s1c +permutation s2a s2b s2c s2d s2e s1a s2f s1b s1c +permutation s2a s2b s2c s2d s2e s2f s1a s1b s1c diff --git a/src/test/isolation/specs/alter-table-3.spec b/src/test/isolation/specs/alter-table-3.spec index d07e3dde418..f70d9c07924 100644 --- a/src/test/isolation/specs/alter-table-3.spec +++ b/src/test/isolation/specs/alter-table-3.spec @@ -17,63 +17,63 @@ teardown DROP FUNCTION f(); } -session "s1" -step "s1a" { BEGIN; } -step "s1b" { ALTER TABLE a DISABLE TRIGGER t; } -step "s1c" { ALTER TABLE a ENABLE TRIGGER t; } -step "s1d" { COMMIT; } +session s1 +step s1a { BEGIN; } +step s1b { ALTER TABLE a DISABLE TRIGGER t; } +step s1c { ALTER TABLE a ENABLE TRIGGER t; } +step s1d { COMMIT; } -session "s2" -step "s2a" { BEGIN; } -step "s2b" { SELECT * FROM a WHERE i = 1 LIMIT 1 FOR UPDATE; } -step "s2c" { INSERT INTO a VALUES (0); } -step "s2d" { COMMIT; } +session s2 +step s2a { BEGIN; } +step s2b { SELECT * FROM a WHERE i = 1 LIMIT 1 FOR UPDATE; } +step s2c { INSERT INTO a VALUES (0); } +step s2d { COMMIT; } -permutation "s1a" "s1b" "s1c" "s1d" "s2a" "s2b" "s2c" "s2d" -permutation "s1a" "s1b" "s1c" "s2a" "s1d" "s2b" "s2c" "s2d" -permutation "s1a" "s1b" "s1c" "s2a" "s2b" "s1d" "s2c" "s2d" -permutation "s1a" "s1b" "s1c" "s2a" "s2b" "s2c" "s1d" "s2d" -permutation "s1a" "s1b" "s2a" "s1c" "s1d" "s2b" "s2c" "s2d" -permutation "s1a" "s1b" "s2a" "s1c" "s2b" "s1d" "s2c" "s2d" -permutation "s1a" "s1b" "s2a" "s1c" "s2b" "s2c" "s1d" "s2d" -permutation "s1a" "s1b" "s2a" "s2b" "s1c" "s1d" "s2c" "s2d" -permutation "s1a" "s1b" "s2a" "s2b" "s1c" "s2c" "s1d" "s2d" -permutation "s1a" "s1b" "s2a" "s2b" "s2c" "s1c" "s1d" "s2d" -permutation "s1a" "s2a" "s1b" "s1c" "s1d" "s2b" "s2c" "s2d" -permutation "s1a" "s2a" "s1b" "s1c" "s2b" "s1d" "s2c" "s2d" -permutation "s1a" "s2a" "s1b" "s1c" "s2b" "s2c" "s1d" "s2d" -permutation "s1a" "s2a" "s1b" "s2b" "s1c" "s1d" "s2c" "s2d" -permutation "s1a" "s2a" "s1b" "s2b" "s1c" "s2c" "s1d" "s2d" -permutation "s1a" "s2a" "s1b" "s2b" "s2c" "s1c" "s1d" "s2d" -permutation "s1a" "s2a" "s2b" "s1b" "s1c" "s1d" "s2c" "s2d" -permutation "s1a" "s2a" "s2b" "s1b" "s1c" "s2c" "s1d" "s2d" -permutation "s1a" "s2a" "s2b" "s1b" "s2c" "s1c" "s1d" "s2d" -permutation "s1a" "s2a" "s2b" "s2c" "s1b" "s1c" "s1d" "s2d" -permutation "s1a" "s2a" "s2b" "s2c" "s1b" "s1c" "s2d" "s1d" -permutation "s1a" "s2a" "s2b" "s2c" "s1b" "s2d" "s1c" "s1d" -permutation "s1a" "s2a" "s2b" "s2c" "s2d" "s1b" "s1c" "s1d" -permutation "s2a" "s1a" "s1b" "s1c" "s1d" "s2b" "s2c" "s2d" -permutation "s2a" "s1a" "s1b" "s1c" "s2b" "s1d" "s2c" "s2d" -permutation "s2a" "s1a" "s1b" "s1c" "s2b" "s2c" "s1d" "s2d" -permutation "s2a" "s1a" "s1b" "s2b" "s1c" "s1d" "s2c" "s2d" -permutation "s2a" "s1a" "s1b" "s2b" "s1c" "s2c" "s1d" "s2d" -permutation "s2a" "s1a" "s1b" "s2b" "s2c" "s1c" "s1d" "s2d" -permutation "s2a" "s1a" "s2b" "s1b" "s1c" "s1d" "s2c" "s2d" -permutation "s2a" "s1a" "s2b" "s1b" "s1c" "s2c" "s1d" "s2d" -permutation "s2a" "s1a" "s2b" "s1b" "s2c" "s1c" "s1d" "s2d" -permutation "s2a" "s1a" "s2b" "s2c" "s1b" "s1c" "s1d" "s2d" -permutation "s2a" "s1a" "s2b" "s2c" "s1b" "s1c" "s2d" "s1d" -permutation "s2a" "s1a" "s2b" "s2c" "s1b" "s2d" "s1c" "s1d" -permutation "s2a" "s1a" "s2b" "s2c" "s2d" "s1b" "s1c" "s1d" -permutation "s2a" "s2b" "s1a" "s1b" "s1c" "s1d" "s2c" "s2d" -permutation "s2a" "s2b" "s1a" "s1b" "s1c" "s2c" "s1d" "s2d" -permutation "s2a" "s2b" "s1a" "s1b" "s2c" "s1c" "s1d" "s2d" -permutation "s2a" "s2b" "s1a" "s2c" "s1b" "s1c" "s1d" "s2d" -permutation "s2a" "s2b" "s1a" "s2c" "s1b" "s1c" "s2d" "s1d" -permutation "s2a" "s2b" "s1a" "s2c" "s1b" "s2d" "s1c" "s1d" -permutation "s2a" "s2b" "s1a" "s2c" "s2d" "s1b" "s1c" "s1d" -permutation "s2a" "s2b" "s2c" "s1a" "s1b" "s1c" "s1d" "s2d" -permutation "s2a" "s2b" "s2c" "s1a" "s1b" "s1c" "s2d" "s1d" -permutation "s2a" "s2b" "s2c" "s1a" "s1b" "s2d" "s1c" "s1d" -permutation "s2a" "s2b" "s2c" "s1a" "s2d" "s1b" "s1c" "s1d" -permutation "s2a" "s2b" "s2c" "s2d" "s1a" "s1b" "s1c" "s1d" +permutation s1a s1b s1c s1d s2a s2b s2c s2d +permutation s1a s1b s1c s2a s1d s2b s2c s2d +permutation s1a s1b s1c s2a s2b s1d s2c s2d +permutation s1a s1b s1c s2a s2b s2c s1d s2d +permutation s1a s1b s2a s1c s1d s2b s2c s2d +permutation s1a s1b s2a s1c s2b s1d s2c s2d +permutation s1a s1b s2a s1c s2b s2c s1d s2d +permutation s1a s1b s2a s2b s1c s1d s2c s2d +permutation s1a s1b s2a s2b s1c s2c s1d s2d +permutation s1a s1b s2a s2b s2c s1c s1d s2d +permutation s1a s2a s1b s1c s1d s2b s2c s2d +permutation s1a s2a s1b s1c s2b s1d s2c s2d +permutation s1a s2a s1b s1c s2b s2c s1d s2d +permutation s1a s2a s1b s2b s1c s1d s2c s2d +permutation s1a s2a s1b s2b s1c s2c s1d s2d +permutation s1a s2a s1b s2b s2c s1c s1d s2d +permutation s1a s2a s2b s1b s1c s1d s2c s2d +permutation s1a s2a s2b s1b s1c s2c s1d s2d +permutation s1a s2a s2b s1b s2c s1c s1d s2d +permutation s1a s2a s2b s2c s1b s1c s1d s2d +permutation s1a s2a s2b s2c s1b s1c s2d s1d +permutation s1a s2a s2b s2c s1b s2d s1c s1d +permutation s1a s2a s2b s2c s2d s1b s1c s1d +permutation s2a s1a s1b s1c s1d s2b s2c s2d +permutation s2a s1a s1b s1c s2b s1d s2c s2d +permutation s2a s1a s1b s1c s2b s2c s1d s2d +permutation s2a s1a s1b s2b s1c s1d s2c s2d +permutation s2a s1a s1b s2b s1c s2c s1d s2d +permutation s2a s1a s1b s2b s2c s1c s1d s2d +permutation s2a s1a s2b s1b s1c s1d s2c s2d +permutation s2a s1a s2b s1b s1c s2c s1d s2d +permutation s2a s1a s2b s1b s2c s1c s1d s2d +permutation s2a s1a s2b s2c s1b s1c s1d s2d +permutation s2a s1a s2b s2c s1b s1c s2d s1d +permutation s2a s1a s2b s2c s1b s2d s1c s1d +permutation s2a s1a s2b s2c s2d s1b s1c s1d +permutation s2a s2b s1a s1b s1c s1d s2c s2d +permutation s2a s2b s1a s1b s1c s2c s1d s2d +permutation s2a s2b s1a s1b s2c s1c s1d s2d +permutation s2a s2b s1a s2c s1b s1c s1d s2d +permutation s2a s2b s1a s2c s1b s1c s2d s1d +permutation s2a s2b s1a s2c s1b s2d s1c s1d +permutation s2a s2b s1a s2c s2d s1b s1c s1d +permutation s2a s2b s2c s1a s1b s1c s1d s2d +permutation s2a s2b s2c s1a s1b s1c s2d s1d +permutation s2a s2b s2c s1a s1b s2d s1c s1d +permutation s2a s2b s2c s1a s2d s1b s1c s1d +permutation s2a s2b s2c s2d s1a s1b s1c s1d diff --git a/src/test/isolation/specs/alter-table-4.spec b/src/test/isolation/specs/alter-table-4.spec index a9c1a937238..f143b790d96 100644 --- a/src/test/isolation/specs/alter-table-4.spec +++ b/src/test/isolation/specs/alter-table-4.spec @@ -15,23 +15,23 @@ teardown DROP TABLE IF EXISTS c1, c2, p; } -session "s1" -step "s1b" { BEGIN; } -step "s1delc1" { ALTER TABLE c1 NO INHERIT p; } -step "s1modc1a" { ALTER TABLE c1 ALTER COLUMN a TYPE float; } -step "s1addc2" { ALTER TABLE c2 INHERIT p; } -step "s1dropc1" { DROP TABLE c1; } -step "s1c" { COMMIT; } +session s1 +step s1b { BEGIN; } +step s1delc1 { ALTER TABLE c1 NO INHERIT p; } +step s1modc1a { ALTER TABLE c1 ALTER COLUMN a TYPE float; } +step s1addc2 { ALTER TABLE c2 INHERIT p; } +step s1dropc1 { DROP TABLE c1; } +step s1c { COMMIT; } -session "s2" -step "s2sel" { SELECT SUM(a) FROM p; } +session s2 +step s2sel { SELECT SUM(a) FROM p; } # NO INHERIT will not be visible to concurrent select, # since we identify children before locking them -permutation "s1b" "s1delc1" "s2sel" "s1c" "s2sel" +permutation s1b s1delc1 s2sel s1c s2sel # adding inheritance likewise is not seen if s1 commits after s2 locks p -permutation "s1b" "s1delc1" "s1addc2" "s2sel" "s1c" "s2sel" +permutation s1b s1delc1 s1addc2 s2sel s1c s2sel # but we do cope with DROP on a child table -permutation "s1b" "s1dropc1" "s2sel" "s1c" "s2sel" +permutation s1b s1dropc1 s2sel s1c s2sel # this case currently results in an error; doesn't seem worth preventing -permutation "s1b" "s1delc1" "s1modc1a" "s2sel" "s1c" "s2sel" +permutation s1b s1delc1 s1modc1a s2sel s1c s2sel diff --git a/src/test/isolation/specs/async-notify.spec b/src/test/isolation/specs/async-notify.spec index a7b2600d25c..0b8cfd91083 100644 --- a/src/test/isolation/specs/async-notify.spec +++ b/src/test/isolation/specs/async-notify.spec @@ -5,15 +5,15 @@ # Note we assume that each step is delivered to the backend as a single Query # message so it will run as one transaction. -session "notifier" -step "listenc" { LISTEN c1; LISTEN c2; } -step "notify1" { NOTIFY c1; } -step "notify2" { NOTIFY c2, 'payload'; } -step "notify3" { NOTIFY c3, 'payload3'; } # not listening to c3 -step "notifyf" { SELECT pg_notify('c2', NULL); } -step "notifyd1" { NOTIFY c2, 'payload'; NOTIFY c1; NOTIFY "c2", 'payload'; } -step "notifyd2" { NOTIFY c1; NOTIFY c1; NOTIFY c1, 'p1'; NOTIFY c1, 'p2'; } -step "notifys1" { +session notifier +step listenc { LISTEN c1; LISTEN c2; } +step notify1 { NOTIFY c1; } +step notify2 { NOTIFY c2, 'payload'; } +step notify3 { NOTIFY c3, 'payload3'; } # not listening to c3 +step notifyf { SELECT pg_notify('c2', NULL); } +step notifyd1 { NOTIFY c2, 'payload'; NOTIFY c1; NOTIFY "c2", 'payload'; } +step notifyd2 { NOTIFY c1; NOTIFY c1; NOTIFY c1, 'p1'; NOTIFY c1, 'p2'; } +step notifys1 { BEGIN; NOTIFY c1, 'payload'; NOTIFY "c2", 'payload'; NOTIFY c1, 'payload'; NOTIFY "c2", 'payload'; @@ -31,47 +31,47 @@ step "notifys1" { ROLLBACK TO SAVEPOINT s2; COMMIT; } -step "usage" { SELECT pg_notification_queue_usage() > 0 AS nonzero; } -step "bignotify" { SELECT count(pg_notify('c1', s::text)) FROM generate_series(1, 1000) s; } +step usage { SELECT pg_notification_queue_usage() > 0 AS nonzero; } +step bignotify { SELECT count(pg_notify('c1', s::text)) FROM generate_series(1, 1000) s; } teardown { UNLISTEN *; } # The listener session is used for cross-backend notify checks. -session "listener" -step "llisten" { LISTEN c1; LISTEN c2; } -step "lcheck" { SELECT 1 AS x; } -step "lbegin" { BEGIN; } -step "lbegins" { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "lcommit" { COMMIT; } +session listener +step llisten { LISTEN c1; LISTEN c2; } +step lcheck { SELECT 1 AS x; } +step lbegin { BEGIN; } +step lbegins { BEGIN ISOLATION LEVEL SERIALIZABLE; } +step lcommit { COMMIT; } teardown { UNLISTEN *; } # In some tests we need a second listener, just to block the queue. -session "listener2" -step "l2listen" { LISTEN c1; } -step "l2begin" { BEGIN; } -step "l2commit" { COMMIT; } -step "l2stop" { UNLISTEN *; } +session listener2 +step l2listen { LISTEN c1; } +step l2begin { BEGIN; } +step l2commit { COMMIT; } +step l2stop { UNLISTEN *; } # Trivial cases. -permutation "listenc" "notify1" "notify2" "notify3" "notifyf" +permutation listenc notify1 notify2 notify3 notifyf # Check simple and less-simple deduplication. -permutation "listenc" "notifyd1" "notifyd2" "notifys1" +permutation listenc notifyd1 notifyd2 notifys1 # Cross-backend notification delivery. We use a "select 1" to force the # listener session to check for notifies. In principle we could just wait # for delivery, but that would require extra support in isolationtester # and might have portability-of-timing issues. -permutation "llisten" "notify1" "notify2" "notify3" "notifyf" "lcheck" +permutation llisten notify1 notify2 notify3 notifyf lcheck # Again, with local delivery too. -permutation "listenc" "llisten" "notify1" "notify2" "notify3" "notifyf" "lcheck" +permutation listenc llisten notify1 notify2 notify3 notifyf lcheck # Check for bug when initial listen is only action in a serializable xact, # and notify queue is not empty -permutation "l2listen" "l2begin" "notify1" "lbegins" "llisten" "lcommit" "l2commit" "l2stop" +permutation l2listen l2begin notify1 lbegins llisten lcommit l2commit l2stop # Verify that pg_notification_queue_usage correctly reports a non-zero result, # after submitting notifications while another connection is listening for @@ -81,4 +81,4 @@ permutation "l2listen" "l2begin" "notify1" "lbegins" "llisten" "lcommit" "l2comm # commit the listener's transaction, so that it never reports these events. # Hence, this should be the last test in this script. -permutation "llisten" "lbegin" "usage" "bignotify" "usage" +permutation llisten lbegin usage bignotify usage diff --git a/src/test/isolation/specs/classroom-scheduling.spec b/src/test/isolation/specs/classroom-scheduling.spec index a31565b9cd7..770715b149d 100644 --- a/src/test/isolation/specs/classroom-scheduling.spec +++ b/src/test/isolation/specs/classroom-scheduling.spec @@ -16,14 +16,14 @@ teardown DROP TABLE room_reservation; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rx1" { SELECT count(*) FROM room_reservation WHERE room_id = '101' AND start_time < TIMESTAMP WITH TIME ZONE '2010-04-01 14:00' AND end_time > TIMESTAMP WITH TIME ZONE '2010-04-01 13:00'; } -step "wy1" { INSERT INTO room_reservation VALUES ('101', TIMESTAMP WITH TIME ZONE '2010-04-01 13:00', TIMESTAMP WITH TIME ZONE '2010-04-01 14:00', 'Carol'); } -step "c1" { COMMIT; } +step rx1 { SELECT count(*) FROM room_reservation WHERE room_id = '101' AND start_time < TIMESTAMP WITH TIME ZONE '2010-04-01 14:00' AND end_time > TIMESTAMP WITH TIME ZONE '2010-04-01 13:00'; } +step wy1 { INSERT INTO room_reservation VALUES ('101', TIMESTAMP WITH TIME ZONE '2010-04-01 13:00', TIMESTAMP WITH TIME ZONE '2010-04-01 14:00', 'Carol'); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "ry2" { SELECT count(*) FROM room_reservation WHERE room_id = '101' AND start_time < TIMESTAMP WITH TIME ZONE '2010-04-01 14:30' AND end_time > TIMESTAMP WITH TIME ZONE '2010-04-01 13:30'; } -step "wx2" { UPDATE room_reservation SET start_time = TIMESTAMP WITH TIME ZONE '2010-04-01 13:30', end_time = TIMESTAMP WITH TIME ZONE '2010-04-01 14:30' WHERE room_id = '101' AND start_time = TIMESTAMP WITH TIME ZONE '2010-04-01 10:00'; } -step "c2" { COMMIT; } +step ry2 { SELECT count(*) FROM room_reservation WHERE room_id = '101' AND start_time < TIMESTAMP WITH TIME ZONE '2010-04-01 14:30' AND end_time > TIMESTAMP WITH TIME ZONE '2010-04-01 13:30'; } +step wx2 { UPDATE room_reservation SET start_time = TIMESTAMP WITH TIME ZONE '2010-04-01 13:30', end_time = TIMESTAMP WITH TIME ZONE '2010-04-01 14:30' WHERE room_id = '101' AND start_time = TIMESTAMP WITH TIME ZONE '2010-04-01 10:00'; } +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/create-trigger.spec b/src/test/isolation/specs/create-trigger.spec index caac381757d..9d4710cbdde 100644 --- a/src/test/isolation/specs/create-trigger.spec +++ b/src/test/isolation/specs/create-trigger.spec @@ -16,39 +16,39 @@ teardown DROP FUNCTION f(); } -session "s1" -step "s1a" { BEGIN; } -step "s1b" { CREATE TRIGGER t AFTER UPDATE ON a EXECUTE PROCEDURE f(); } -step "s1c" { COMMIT; } +session s1 +step s1a { BEGIN; } +step s1b { CREATE TRIGGER t AFTER UPDATE ON a EXECUTE PROCEDURE f(); } +step s1c { COMMIT; } -session "s2" -step "s2a" { BEGIN; } -step "s2b" { SELECT * FROM a WHERE i = 1 FOR UPDATE; } -step "s2c" { UPDATE a SET i = 4 WHERE i = 3; } -step "s2d" { COMMIT; } +session s2 +step s2a { BEGIN; } +step s2b { SELECT * FROM a WHERE i = 1 FOR UPDATE; } +step s2c { UPDATE a SET i = 4 WHERE i = 3; } +step s2d { COMMIT; } -permutation "s1a" "s1b" "s1c" "s2a" "s2b" "s2c" "s2d" -permutation "s1a" "s1b" "s2a" "s1c" "s2b" "s2c" "s2d" -permutation "s1a" "s1b" "s2a" "s2b" "s1c" "s2c" "s2d" -permutation "s1a" "s1b" "s2a" "s2b" "s2c" "s1c" "s2d" -permutation "s1a" "s2a" "s1b" "s1c" "s2b" "s2c" "s2d" -permutation "s1a" "s2a" "s1b" "s2b" "s1c" "s2c" "s2d" -permutation "s1a" "s2a" "s1b" "s2b" "s2c" "s1c" "s2d" -permutation "s1a" "s2a" "s2b" "s1b" "s1c" "s2c" "s2d" -permutation "s1a" "s2a" "s2b" "s1b" "s2c" "s1c" "s2d" -permutation "s1a" "s2a" "s2b" "s2c" "s1b" "s2d" "s1c" -permutation "s1a" "s2a" "s2b" "s2c" "s2d" "s1b" "s1c" -permutation "s2a" "s1a" "s1b" "s1c" "s2b" "s2c" "s2d" -permutation "s2a" "s1a" "s1b" "s2b" "s1c" "s2c" "s2d" -permutation "s2a" "s1a" "s1b" "s2b" "s2c" "s1c" "s2d" -permutation "s2a" "s1a" "s2b" "s1b" "s1c" "s2c" "s2d" -permutation "s2a" "s1a" "s2b" "s1b" "s2c" "s1c" "s2d" -permutation "s2a" "s1a" "s2b" "s2c" "s1b" "s2d" "s1c" -permutation "s2a" "s1a" "s2b" "s2c" "s2d" "s1b" "s1c" -permutation "s2a" "s2b" "s1a" "s1b" "s1c" "s2c" "s2d" -permutation "s2a" "s2b" "s1a" "s1b" "s2c" "s1c" "s2d" -permutation "s2a" "s2b" "s1a" "s2c" "s1b" "s2d" "s1c" -permutation "s2a" "s2b" "s1a" "s2c" "s2d" "s1b" "s1c" -permutation "s2a" "s2b" "s2c" "s1a" "s1b" "s2d" "s1c" -permutation "s2a" "s2b" "s2c" "s1a" "s2d" "s1b" "s1c" -permutation "s2a" "s2b" "s2c" "s2d" "s1a" "s1b" "s1c" +permutation s1a s1b s1c s2a s2b s2c s2d +permutation s1a s1b s2a s1c s2b s2c s2d +permutation s1a s1b s2a s2b s1c s2c s2d +permutation s1a s1b s2a s2b s2c s1c s2d +permutation s1a s2a s1b s1c s2b s2c s2d +permutation s1a s2a s1b s2b s1c s2c s2d +permutation s1a s2a s1b s2b s2c s1c s2d +permutation s1a s2a s2b s1b s1c s2c s2d +permutation s1a s2a s2b s1b s2c s1c s2d +permutation s1a s2a s2b s2c s1b s2d s1c +permutation s1a s2a s2b s2c s2d s1b s1c +permutation s2a s1a s1b s1c s2b s2c s2d +permutation s2a s1a s1b s2b s1c s2c s2d +permutation s2a s1a s1b s2b s2c s1c s2d +permutation s2a s1a s2b s1b s1c s2c s2d +permutation s2a s1a s2b s1b s2c s1c s2d +permutation s2a s1a s2b s2c s1b s2d s1c +permutation s2a s1a s2b s2c s2d s1b s1c +permutation s2a s2b s1a s1b s1c s2c s2d +permutation s2a s2b s1a s1b s2c s1c s2d +permutation s2a s2b s1a s2c s1b s2d s1c +permutation s2a s2b s1a s2c s2d s1b s1c +permutation s2a s2b s2c s1a s1b s2d s1c +permutation s2a s2b s2c s1a s2d s1b s1c +permutation s2a s2b s2c s2d s1a s1b s1c diff --git a/src/test/isolation/specs/deadlock-hard.spec b/src/test/isolation/specs/deadlock-hard.spec index 3316d75e953..60bedca237a 100644 --- a/src/test/isolation/specs/deadlock-hard.spec +++ b/src/test/isolation/specs/deadlock-hard.spec @@ -20,53 +20,53 @@ teardown DROP TABLE a1, a2, a3, a4, a5, a6, a7, a8; } -session "s1" +session s1 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s1a1" { LOCK TABLE a1; } -step "s1a2" { LOCK TABLE a2; } -step "s1c" { COMMIT; } +step s1a1 { LOCK TABLE a1; } +step s1a2 { LOCK TABLE a2; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s2a2" { LOCK TABLE a2; } -step "s2a3" { LOCK TABLE a3; } -step "s2c" { COMMIT; } +step s2a2 { LOCK TABLE a2; } +step s2a3 { LOCK TABLE a3; } +step s2c { COMMIT; } -session "s3" +session s3 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s3a3" { LOCK TABLE a3; } -step "s3a4" { LOCK TABLE a4; } -step "s3c" { COMMIT; } +step s3a3 { LOCK TABLE a3; } +step s3a4 { LOCK TABLE a4; } +step s3c { COMMIT; } -session "s4" +session s4 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s4a4" { LOCK TABLE a4; } -step "s4a5" { LOCK TABLE a5; } -step "s4c" { COMMIT; } +step s4a4 { LOCK TABLE a4; } +step s4a5 { LOCK TABLE a5; } +step s4c { COMMIT; } -session "s5" +session s5 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s5a5" { LOCK TABLE a5; } -step "s5a6" { LOCK TABLE a6; } -step "s5c" { COMMIT; } +step s5a5 { LOCK TABLE a5; } +step s5a6 { LOCK TABLE a6; } +step s5c { COMMIT; } -session "s6" +session s6 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s6a6" { LOCK TABLE a6; } -step "s6a7" { LOCK TABLE a7; } -step "s6c" { COMMIT; } +step s6a6 { LOCK TABLE a6; } +step s6a7 { LOCK TABLE a7; } +step s6c { COMMIT; } -session "s7" +session s7 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s7a7" { LOCK TABLE a7; } -step "s7a8" { LOCK TABLE a8; } -step "s7c" { COMMIT; } +step s7a7 { LOCK TABLE a7; } +step s7a8 { LOCK TABLE a8; } +step s7c { COMMIT; } -session "s8" +session s8 setup { BEGIN; SET deadlock_timeout = '10ms'; } -step "s8a8" { LOCK TABLE a8; } -step "s8a1" { LOCK TABLE a1; } -step "s8c" { COMMIT; } +step s8a8 { LOCK TABLE a8; } +step s8a1 { LOCK TABLE a1; } +step s8c { COMMIT; } # Note: when s8a1 detects the deadlock and fails, s7a8 is released, making # it timing-dependent which query completion is received first by the tester. @@ -76,4 +76,4 @@ step "s8c" { COMMIT; } # dummy blocking mark to s8a1 to ensure it will be reported as "waiting" # regardless of that. -permutation "s1a1" "s2a2" "s3a3" "s4a4" "s5a5" "s6a6" "s7a7" "s8a8" "s1a2" "s2a3" "s3a4" "s4a5" "s5a6" "s6a7" "s7a8"("s8a1") "s8a1"(*) "s8c" "s7c" "s6c" "s5c" "s4c" "s3c" "s2c" "s1c" +permutation s1a1 s2a2 s3a3 s4a4 s5a5 s6a6 s7a7 s8a8 s1a2 s2a3 s3a4 s4a5 s5a6 s6a7 s7a8(s8a1) s8a1(*) s8c s7c s6c s5c s4c s3c s2c s1c diff --git a/src/test/isolation/specs/deadlock-simple.spec b/src/test/isolation/specs/deadlock-simple.spec index b1300ca77ce..3086dc7c867 100644 --- a/src/test/isolation/specs/deadlock-simple.spec +++ b/src/test/isolation/specs/deadlock-simple.spec @@ -14,16 +14,16 @@ teardown DROP TABLE a1; } -session "s1" +session s1 setup { BEGIN; } -step "s1as" { LOCK TABLE a1 IN ACCESS SHARE MODE; } -step "s1ae" { LOCK TABLE a1 IN ACCESS EXCLUSIVE MODE; } -step "s1c" { COMMIT; } +step s1as { LOCK TABLE a1 IN ACCESS SHARE MODE; } +step s1ae { LOCK TABLE a1 IN ACCESS EXCLUSIVE MODE; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2as" { LOCK TABLE a1 IN ACCESS SHARE MODE; } -step "s2ae" { LOCK TABLE a1 IN ACCESS EXCLUSIVE MODE; } -step "s2c" { COMMIT; } +step s2as { LOCK TABLE a1 IN ACCESS SHARE MODE; } +step s2ae { LOCK TABLE a1 IN ACCESS EXCLUSIVE MODE; } +step s2c { COMMIT; } -permutation "s1as" "s2as" "s1ae" "s2ae" "s1c" "s2c" +permutation s1as s2as s1ae s2ae s1c s2c diff --git a/src/test/isolation/specs/deadlock-soft-2.spec b/src/test/isolation/specs/deadlock-soft-2.spec index 6ff915f6061..5b7d3db5036 100644 --- a/src/test/isolation/specs/deadlock-soft-2.spec +++ b/src/test/isolation/specs/deadlock-soft-2.spec @@ -13,31 +13,31 @@ teardown DROP TABLE a1, a2; } -session "s1" +session s1 setup { BEGIN; SET deadlock_timeout = '10ms'; } -step "s1a" { LOCK TABLE a1 IN SHARE UPDATE EXCLUSIVE MODE; } -step "s1b" { LOCK TABLE a2 IN SHARE UPDATE EXCLUSIVE MODE; } -step "s1c" { COMMIT; } +step s1a { LOCK TABLE a1 IN SHARE UPDATE EXCLUSIVE MODE; } +step s1b { LOCK TABLE a2 IN SHARE UPDATE EXCLUSIVE MODE; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s2a" { LOCK TABLE a2 IN ACCESS SHARE MODE; } -step "s2b" { LOCK TABLE a1 IN SHARE UPDATE EXCLUSIVE MODE; } -step "s2c" { COMMIT; } +step s2a { LOCK TABLE a2 IN ACCESS SHARE MODE; } +step s2b { LOCK TABLE a1 IN SHARE UPDATE EXCLUSIVE MODE; } +step s2c { COMMIT; } -session "s3" +session s3 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s3a" { LOCK TABLE a2 IN ACCESS EXCLUSIVE MODE; } -step "s3c" { COMMIT; } +step s3a { LOCK TABLE a2 IN ACCESS EXCLUSIVE MODE; } +step s3c { COMMIT; } -session "s4" +session s4 setup { BEGIN; SET deadlock_timeout = '100s'; } -step "s4a" { LOCK TABLE a2 IN ACCESS EXCLUSIVE MODE; } -step "s4c" { COMMIT; } +step s4a { LOCK TABLE a2 IN ACCESS EXCLUSIVE MODE; } +step s4c { COMMIT; } # The expected output for this test assumes that isolationtester will # detect step s1b as waiting before the deadlock detector runs and # releases s1 from its blocked state. To ensure that happens even in # very slow (CLOBBER_CACHE_ALWAYS) cases, apply a (*) annotation. -permutation "s1a" "s2a" "s2b" "s3a" "s4a" "s1b"(*) "s1c" "s2c" "s3c" "s4c" +permutation s1a s2a s2b s3a s4a s1b(*) s1c s2c s3c s4c diff --git a/src/test/isolation/specs/deadlock-soft.spec b/src/test/isolation/specs/deadlock-soft.spec index 49d16e027c4..bc9c6a7d438 100644 --- a/src/test/isolation/specs/deadlock-soft.spec +++ b/src/test/isolation/specs/deadlock-soft.spec @@ -15,26 +15,26 @@ teardown DROP TABLE a1, a2; } -session "d1" +session d1 setup { BEGIN; SET deadlock_timeout = '10s'; } -step "d1a1" { LOCK TABLE a1 IN ACCESS SHARE MODE; } -step "d1a2" { LOCK TABLE a2 IN ACCESS SHARE MODE; } -step "d1c" { COMMIT; } +step d1a1 { LOCK TABLE a1 IN ACCESS SHARE MODE; } +step d1a2 { LOCK TABLE a2 IN ACCESS SHARE MODE; } +step d1c { COMMIT; } -session "d2" +session d2 setup { BEGIN; SET deadlock_timeout = '10ms'; } -step "d2a2" { LOCK TABLE a2 IN ACCESS SHARE MODE; } -step "d2a1" { LOCK TABLE a1 IN ACCESS SHARE MODE; } -step "d2c" { COMMIT; } +step d2a2 { LOCK TABLE a2 IN ACCESS SHARE MODE; } +step d2a1 { LOCK TABLE a1 IN ACCESS SHARE MODE; } +step d2c { COMMIT; } -session "e1" +session e1 setup { BEGIN; SET deadlock_timeout = '10s'; } -step "e1l" { LOCK TABLE a1 IN ACCESS EXCLUSIVE MODE; } -step "e1c" { COMMIT; } +step e1l { LOCK TABLE a1 IN ACCESS EXCLUSIVE MODE; } +step e1c { COMMIT; } -session "e2" +session e2 setup { BEGIN; SET deadlock_timeout = '10s'; } -step "e2l" { LOCK TABLE a2 IN ACCESS EXCLUSIVE MODE; } -step "e2c" { COMMIT; } +step e2l { LOCK TABLE a2 IN ACCESS EXCLUSIVE MODE; } +step e2c { COMMIT; } -permutation "d1a1" "d2a2" "e1l" "e2l" "d1a2" "d2a1" "d1c" "e1c" "d2c" "e2c" +permutation d1a1 d2a2 e1l e2l d1a2 d2a1 d1c e1c d2c e2c diff --git a/src/test/isolation/specs/delete-abort-savept-2.spec b/src/test/isolation/specs/delete-abort-savept-2.spec index d35c67f670d..65bd936dcca 100644 --- a/src/test/isolation/specs/delete-abort-savept-2.spec +++ b/src/test/isolation/specs/delete-abort-savept-2.spec @@ -14,21 +14,21 @@ teardown DROP TABLE foo; } -session "s1" +session s1 setup { BEGIN; } -step "s1l" { SELECT * FROM foo FOR KEY SHARE; } -step "s1svp" { SAVEPOINT f; } -step "s1d" { SELECT * FROM foo FOR NO KEY UPDATE; } -step "s1r" { ROLLBACK TO f; } -step "s1c" { COMMIT; } +step s1l { SELECT * FROM foo FOR KEY SHARE; } +step s1svp { SAVEPOINT f; } +step s1d { SELECT * FROM foo FOR NO KEY UPDATE; } +step s1r { ROLLBACK TO f; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2l" { SELECT * FROM foo FOR UPDATE; } -step "s2l2" { SELECT * FROM foo FOR NO KEY UPDATE; } -step "s2c" { COMMIT; } +step s2l { SELECT * FROM foo FOR UPDATE; } +step s2l2 { SELECT * FROM foo FOR NO KEY UPDATE; } +step s2c { COMMIT; } -permutation "s1l" "s1svp" "s1d" "s1r" "s2l" "s1c" "s2c" -permutation "s1l" "s1svp" "s1d" "s2l" "s1r" "s1c" "s2c" -permutation "s1l" "s1svp" "s1d" "s1r" "s2l2" "s1c" "s2c" -permutation "s1l" "s1svp" "s1d" "s2l2" "s1r" "s1c" "s2c" +permutation s1l s1svp s1d s1r s2l s1c s2c +permutation s1l s1svp s1d s2l s1r s1c s2c +permutation s1l s1svp s1d s1r s2l2 s1c s2c +permutation s1l s1svp s1d s2l2 s1r s1c s2c diff --git a/src/test/isolation/specs/delete-abort-savept.spec b/src/test/isolation/specs/delete-abort-savept.spec index bc32e216829..498ffed32ab 100644 --- a/src/test/isolation/specs/delete-abort-savept.spec +++ b/src/test/isolation/specs/delete-abort-savept.spec @@ -15,23 +15,23 @@ teardown DROP TABLE foo; } -session "s1" +session s1 setup { BEGIN; } -step "s1l" { SELECT * FROM foo FOR KEY SHARE; } -step "s1svp" { SAVEPOINT f; } -step "s1d" { DELETE FROM foo; } -step "s1r" { ROLLBACK TO f; } -step "s1c" { COMMIT; } +step s1l { SELECT * FROM foo FOR KEY SHARE; } +step s1svp { SAVEPOINT f; } +step s1d { DELETE FROM foo; } +step s1r { ROLLBACK TO f; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2l" { SELECT * FROM foo FOR UPDATE; } -step "s2c" { COMMIT; } +step s2l { SELECT * FROM foo FOR UPDATE; } +step s2c { COMMIT; } -permutation "s1l" "s1svp" "s1d" "s1r" "s1c" "s2l" "s2c" -permutation "s1l" "s1svp" "s1d" "s1r" "s2l" "s1c" "s2c" -permutation "s1l" "s1svp" "s1d" "s2l" "s1r" "s1c" "s2c" -permutation "s1l" "s1svp" "s2l" "s1d" "s1r" "s1c" "s2c" -permutation "s1l" "s2l" "s1svp" "s1d" "s1r" "s1c" "s2c" -permutation "s2l" "s1l" "s2c" "s1svp" "s1d" "s1r" "s1c" -permutation "s2l" "s2c" "s1l" "s1svp" "s1d" "s1r" "s1c" +permutation s1l s1svp s1d s1r s1c s2l s2c +permutation s1l s1svp s1d s1r s2l s1c s2c +permutation s1l s1svp s1d s2l s1r s1c s2c +permutation s1l s1svp s2l s1d s1r s1c s2c +permutation s1l s2l s1svp s1d s1r s1c s2c +permutation s2l s1l s2c s1svp s1d s1r s1c +permutation s2l s2c s1l s1svp s1d s1r s1c diff --git a/src/test/isolation/specs/drop-index-concurrently-1.spec b/src/test/isolation/specs/drop-index-concurrently-1.spec index dd42b70ddf3..812b5de2261 100644 --- a/src/test/isolation/specs/drop-index-concurrently-1.spec +++ b/src/test/isolation/specs/drop-index-concurrently-1.spec @@ -17,25 +17,25 @@ teardown DROP TABLE test_dc; } -session "s1" -step "noseq" { SET enable_seqscan = false; } -step "chkiso" { SELECT (setting in ('read committed','read uncommitted')) AS is_read_committed FROM pg_settings WHERE name = 'default_transaction_isolation'; } -step "prepi" { PREPARE getrow_idx AS SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; } -step "preps" { PREPARE getrow_seq AS SELECT * FROM test_dc WHERE data::text=34::text ORDER BY id,data; } -step "begin" { BEGIN; } -step "explaini" { EXPLAIN (COSTS OFF) EXECUTE getrow_idx; } -step "explains" { EXPLAIN (COSTS OFF) EXECUTE getrow_seq; } -step "selecti" { EXECUTE getrow_idx; } -step "selects" { EXECUTE getrow_seq; } -step "end" { COMMIT; } +session s1 +step noseq { SET enable_seqscan = false; } +step chkiso { SELECT (setting in ('read committed','read uncommitted')) AS is_read_committed FROM pg_settings WHERE name = 'default_transaction_isolation'; } +step prepi { PREPARE getrow_idx AS SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; } +step preps { PREPARE getrow_seq AS SELECT * FROM test_dc WHERE data::text=34::text ORDER BY id,data; } +step begin { BEGIN; } +step explaini { EXPLAIN (COSTS OFF) EXECUTE getrow_idx; } +step explains { EXPLAIN (COSTS OFF) EXECUTE getrow_seq; } +step selecti { EXECUTE getrow_idx; } +step selects { EXECUTE getrow_seq; } +step end { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "select2" { SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; } -step "insert2" { INSERT INTO test_dc(data) SELECT * FROM generate_series(1, 100); } -step "end2" { COMMIT; } +step select2 { SELECT * FROM test_dc WHERE data=34 ORDER BY id,data; } +step insert2 { INSERT INTO test_dc(data) SELECT * FROM generate_series(1, 100); } +step end2 { COMMIT; } -session "s3" -step "drop" { DROP INDEX CONCURRENTLY test_dc_data; } +session s3 +step drop { DROP INDEX CONCURRENTLY test_dc_data; } -permutation "noseq" "chkiso" "prepi" "preps" "begin" "explaini" "explains" "select2" "drop" "insert2" "end2" "selecti" "selects" "end" +permutation noseq chkiso prepi preps begin explaini explains select2 drop insert2 end2 selecti selects end diff --git a/src/test/isolation/specs/eval-plan-qual-trigger.spec b/src/test/isolation/specs/eval-plan-qual-trigger.spec index 9876948f9f2..be34f9af920 100644 --- a/src/test/isolation/specs/eval-plan-qual-trigger.spec +++ b/src/test/isolation/specs/eval-plan-qual-trigger.spec @@ -54,53 +54,53 @@ teardown } -session "s0" -step "s0_rep" { SELECT * FROM trigtest ORDER BY key, data } +session s0 +step s0_rep { SELECT * FROM trigtest ORDER BY key, data } -session "s1" +session s1 #setup { } -step "s1_b_rc" { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; } -step "s1_b_rr" { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT 1; } -step "s1_c" { COMMIT; } -step "s1_r" { ROLLBACK; } -step "s1_trig_rep_b_i" { CREATE TRIGGER rep_b_i BEFORE INSERT ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } -step "s1_trig_rep_a_i" { CREATE TRIGGER rep_a_i AFTER INSERT ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } -step "s1_trig_rep_b_u" { CREATE TRIGGER rep_b_u BEFORE UPDATE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } -step "s1_trig_rep_a_u" { CREATE TRIGGER rep_a_u AFTER UPDATE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } -step "s1_trig_rep_b_d" { CREATE TRIGGER rep_b_d BEFORE DELETE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } -step "s1_trig_rep_a_d" { CREATE TRIGGER rep_a_d AFTER DELETE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } -step "s1_ins_a" { INSERT INTO trigtest VALUES ('key-a', 'val-a-s1') RETURNING *; } -step "s1_ins_b" { INSERT INTO trigtest VALUES ('key-b', 'val-b-s1') RETURNING *; } -step "s1_ins_c" { INSERT INTO trigtest VALUES ('key-c', 'val-c-s1') RETURNING *; } -step "s1_del_a" { +step s1_b_rc { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; } +step s1_b_rr { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT 1; } +step s1_c { COMMIT; } +step s1_r { ROLLBACK; } +step s1_trig_rep_b_i { CREATE TRIGGER rep_b_i BEFORE INSERT ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } +step s1_trig_rep_a_i { CREATE TRIGGER rep_a_i AFTER INSERT ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } +step s1_trig_rep_b_u { CREATE TRIGGER rep_b_u BEFORE UPDATE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } +step s1_trig_rep_a_u { CREATE TRIGGER rep_a_u AFTER UPDATE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } +step s1_trig_rep_b_d { CREATE TRIGGER rep_b_d BEFORE DELETE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } +step s1_trig_rep_a_d { CREATE TRIGGER rep_a_d AFTER DELETE ON trigtest FOR EACH ROW EXECUTE PROCEDURE trig_report(); } +step s1_ins_a { INSERT INTO trigtest VALUES ('key-a', 'val-a-s1') RETURNING *; } +step s1_ins_b { INSERT INTO trigtest VALUES ('key-b', 'val-b-s1') RETURNING *; } +step s1_ins_c { INSERT INTO trigtest VALUES ('key-c', 'val-c-s1') RETURNING *; } +step s1_del_a { DELETE FROM trigtest WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') RETURNING * } -step "s1_del_b" { +step s1_del_b { DELETE FROM trigtest WHERE noisy_oper('upd', key, '=', 'key-b') AND noisy_oper('upk', data, '<>', 'mismatch') RETURNING * } -step "s1_upd_a_data" { +step s1_upd_a_data { UPDATE trigtest SET data = data || '-ups1' WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') RETURNING *; } -step "s1_upd_b_data" { +step s1_upd_b_data { UPDATE trigtest SET data = data || '-ups1' WHERE noisy_oper('upd', key, '=', 'key-b') AND noisy_oper('upk', data, '<>', 'mismatch') RETURNING *; } -step "s1_upd_a_tob" { +step s1_upd_a_tob { UPDATE trigtest SET key = 'key-b', data = data || '-tobs1' WHERE noisy_oper('upk', key, '=', 'key-a') AND @@ -108,42 +108,42 @@ step "s1_upd_a_tob" { RETURNING *; } -session "s2" +session s2 #setup { } -step "s2_b_rc" { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; } -step "s2_b_rr" { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT 1; } -step "s2_c" { COMMIT; } -#step "s2_r" { ROLLBACK; } -step "s2_ins_a" { INSERT INTO trigtest VALUES ('key-a', 'val-a-s2') RETURNING *; } -step "s2_del_a" { +step s2_b_rc { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; } +step s2_b_rr { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT 1; } +step s2_c { COMMIT; } +#step s2_r { ROLLBACK; } +step s2_ins_a { INSERT INTO trigtest VALUES ('key-a', 'val-a-s2') RETURNING *; } +step s2_del_a { DELETE FROM trigtest WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') RETURNING * } -step "s2_upd_a_data" { +step s2_upd_a_data { UPDATE trigtest SET data = data || '-ups2' WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') RETURNING *; } -step "s2_upd_b_data" { +step s2_upd_b_data { UPDATE trigtest SET data = data || '-ups2' WHERE noisy_oper('upd', key, '=', 'key-b') AND noisy_oper('upk', data, '<>', 'mismatch') RETURNING *; } -step "s2_upd_all_data" { +step s2_upd_all_data { UPDATE trigtest SET data = data || '-ups2' WHERE noisy_oper('upd', key, '<>', 'mismatch') AND noisy_oper('upk', data, '<>', 'mismatch') RETURNING *; } -step "s2_upsert_a_data" { +step s2_upsert_a_data { INSERT INTO trigtest VALUES ('key-a', 'val-a-upss2') ON CONFLICT (key) DO UPDATE SET data = trigtest.data || '-upserts2' @@ -153,19 +153,19 @@ step "s2_upsert_a_data" { RETURNING *; } -#session "s3" +#session s3 #setup { } -#step "s3_b_rc" { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; } -#step "s3_c" { COMMIT; } -#step "s3_r" { ROLLBACK; } -#step "s3_del_a" { +#step s3_b_rc { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT 1; } +#step s3_c { COMMIT; } +#step s3_r { ROLLBACK; } +#step s3_del_a { # DELETE FROM trigtest # WHERE # noisy_oper('upd', key, '=', 'key-a') AND # noisy_oper('upk', data, '<>', 'mismatch') # RETURNING * #} -#step "s3_upd_a_data" { +#step s3_upd_a_data { # UPDATE trigtest SET data = data || '-ups3' # WHERE # noisy_oper('upd', key, '=', 'key-a') AND @@ -175,236 +175,236 @@ step "s2_upsert_a_data" { ### base case verifying that triggers see performed modifications # s1 updates, s1 commits, s2 updates -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s1_c" "s2_upd_a_data" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s1_c s2_upd_a_data s2_c + s0_rep # s1 updates, s1 rolls back, s2 updates -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s1_r" "s2_upd_a_data" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s1_r s2_upd_a_data s2_c + s0_rep # s1 updates, s1 commits back, s2 deletes -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s1_c" "s2_del_a" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s1_c s2_del_a s2_c + s0_rep # s1 updates, s1 rolls back back, s2 deletes -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s1_r" "s2_del_a" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s1_r s2_del_a s2_c + s0_rep ### Verify EPQ is performed if necessary, and skipped if transaction rolled back # s1 updates, s2 updates, s1 commits, EPQ -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_upd_a_data s1_c s2_c + s0_rep # s1 updates, s2 updates, s1 rolls back, no EPQ -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_upd_a_data s1_r s2_c + s0_rep # s1 updates, s2 deletes, s1 commits, EPQ -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_upd_a_data s1_c s2_c + s0_rep # s1 updates, s2 deletes, s1 rolls back, no EPQ -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_upd_a_data s1_r s2_c + s0_rep # s1 deletes, s2 updates, s1 commits, EPQ -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_del_a s2_upd_a_data s1_c s2_c + s0_rep # s1 deletes, s2 updates, s1 rolls back, no EPQ -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_del_a s2_upd_a_data s1_r s2_c + s0_rep # s1 inserts, s2 inserts, s1 commits, s2 inserts, unique conflict -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_a_i" "s1_trig_rep_a_d" - "s1_b_rc" "s2_b_rc" - "s1_ins_a" "s2_ins_a" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_a_i s1_trig_rep_a_d + s1_b_rc s2_b_rc + s1_ins_a s2_ins_a s1_c s2_c + s0_rep # s1 inserts, s2 inserts, s1 rolls back, s2 inserts, no unique conflict -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_a_i" "s1_trig_rep_a_d" - "s1_b_rc" "s2_b_rc" - "s1_ins_a" "s2_ins_a" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_a_i s1_trig_rep_a_d + s1_b_rc s2_b_rc + s1_ins_a s2_ins_a s1_r s2_c + s0_rep # s1 updates, s2 upserts, s1 commits, EPQ -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_upsert_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_upsert_a_data s1_c s2_c + s0_rep # s1 updates, s2 upserts, s1 rolls back, no EPQ -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_upsert_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_upsert_a_data s1_c s2_c + s0_rep # s1 inserts, s2 upserts, s1 commits -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_b_rc" "s2_b_rc" - "s1_ins_a" "s2_upsert_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u + s1_b_rc s2_b_rc + s1_ins_a s2_upsert_a_data s1_c s2_c + s0_rep # s1 inserts, s2 upserts, s1 rolls back -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_b_rc" "s2_b_rc" - "s1_ins_a" "s2_upsert_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u + s1_b_rc s2_b_rc + s1_ins_a s2_upsert_a_data s1_r s2_c + s0_rep # s1 inserts, s2 upserts, s1 updates, s1 commits, EPQ -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_b_rc" "s2_b_rc" - "s1_ins_a" "s1_upd_a_data" "s2_upsert_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u + s1_b_rc s2_b_rc + s1_ins_a s1_upd_a_data s2_upsert_a_data s1_c s2_c + s0_rep # s1 inserts, s2 upserts, s1 updates, s1 rolls back, no EPQ -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_b_rc" "s2_b_rc" - "s1_ins_a" "s1_upd_a_data" "s2_upsert_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u + s1_b_rc s2_b_rc + s1_ins_a s1_upd_a_data s2_upsert_a_data s1_r s2_c + s0_rep ### Verify EPQ is performed if necessary, and skipped if transaction rolled back, ### just without before triggers (for comparison, no additional row locks) # s1 updates, s2 updates, s1 commits, EPQ -permutation "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_upd_a_data s1_c s2_c + s0_rep # s1 updates, s2 updates, s1 rolls back, no EPQ -permutation "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_upd_a_data s1_r s2_c + s0_rep # s1 updates, s2 deletes, s1 commits, EPQ -permutation "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_del_a" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_del_a s1_c s2_c + s0_rep # s1 updates, s2 deletes, s1 rolls back, no EPQ -permutation "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_upd_a_data" "s2_del_a" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_upd_a_data s2_del_a s1_r s2_c + s0_rep # s1 deletes, s2 updates, s1 commits, EPQ -permutation "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_del_a s2_upd_a_data s1_c s2_c + s0_rep # s1 deletes, s2 updates, s1 rolls back, no EPQ -permutation "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_del_a s2_upd_a_data s1_r s2_c + s0_rep # s1 deletes, s2 deletes, s1 commits, EPQ -permutation "s1_trig_rep_a_d" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_del_a" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_a_d + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_del_a s2_del_a s1_c s2_c + s0_rep # s1 deletes, s2 deletes, s1 rolls back, no EPQ -permutation "s1_trig_rep_a_d" - "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_del_a" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_a_d + s1_ins_a s1_ins_b s1_b_rc s2_b_rc + s1_del_a s2_del_a s1_r s2_c + s0_rep ### Verify that an update affecting a row that has been ### updated/deleted to not match the where clause anymore works ### correctly # s1 updates to different key, s2 updates old key, s1 commits, EPQ failure should lead to no update -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_c" "s1_b_rc" "s2_b_rc" - "s1_upd_a_tob" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_c s1_b_rc s2_b_rc + s1_upd_a_tob s2_upd_a_data s1_c s2_c + s0_rep # s1 updates to different key, s2 updates old key, s1 rolls back, no EPQ failure -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_c" "s1_b_rc" "s2_b_rc" - "s1_upd_a_tob" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_c s1_b_rc s2_b_rc + s1_upd_a_tob s2_upd_a_data s1_r s2_c + s0_rep # s1 updates to different key, s2 updates new key, s1 commits, s2 will # not see tuple with new key and not block -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_c" "s1_b_rc" "s2_b_rc" - "s1_upd_a_tob" "s2_upd_b_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_c s1_b_rc s2_b_rc + s1_upd_a_tob s2_upd_b_data s1_c s2_c + s0_rep # s1 updates to different key, s2 updates all keys, s1 commits, s2, # will not see tuple with old key, but block on old, and then follow # the chain -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_c" "s1_b_rc" "s2_b_rc" - "s1_upd_a_tob" "s2_upd_all_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_c s1_b_rc s2_b_rc + s1_upd_a_tob s2_upd_all_data s1_c s2_c + s0_rep # s1 deletes, s2 updates, s1 committs, EPQ failure should lead to no update -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_c" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_c s1_b_rc s2_b_rc + s1_del_a s2_upd_a_data s1_c s2_c + s0_rep # s1 deletes, s2 updates, s1 rolls back, no EPQ failure -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_c" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_c s1_b_rc s2_b_rc + s1_del_a s2_upd_a_data s1_r s2_c + s0_rep # s1 deletes, s2 deletes, s1 committs, EPQ failure should lead to no delete -permutation "s1_trig_rep_b_d" "s1_trig_rep_a_d" - "s1_ins_a" "s1_ins_c" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_del_a" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_a_d + s1_ins_a s1_ins_c s1_b_rc s2_b_rc + s1_del_a s2_del_a s1_c s2_c + s0_rep # s1 deletes, s2 deletes, s1 rolls back, no EPQ failure -permutation "s1_trig_rep_b_d" "s1_trig_rep_a_d" - "s1_ins_a" "s1_ins_c" "s1_b_rc" "s2_b_rc" - "s1_del_a" "s2_del_a" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_a_d + s1_ins_a s1_ins_c s1_b_rc s2_b_rc + s1_del_a s2_del_a s1_r s2_c + s0_rep ### Verify EPQ with more than two participants works ## XXX: Disable tests, there is some potential for instability here that's not yet fully understood ## s1 updates, s2 updates, s3 updates, s1 commits, s2 EPQ, s2 commits, s3 EPQ -#permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" -# "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" "s3_b_rc" -# "s1_upd_a_data" "s2_upd_a_data" "s3_upd_a_data" "s1_c" "s2_c" "s3_c" -# "s0_rep" +#permutation s1_trig_rep_b_u s1_trig_rep_a_u +# s1_ins_a s1_ins_b s1_b_rc s2_b_rc s3_b_rc +# s1_upd_a_data s2_upd_a_data s3_upd_a_data s1_c s2_c s3_c +# s0_rep ## s1 updates, s2 updates, s3 updates, s1 commits, s2 EPQ, s2 rolls back, s3 EPQ -#permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" -# "s1_ins_a" "s1_ins_b" "s1_b_rc" "s2_b_rc" "s3_b_rc" -# "s1_upd_a_data" "s2_upd_a_data" "s3_upd_a_data" "s1_c" "s2_r" "s3_c" -# "s0_rep" +#permutation s1_trig_rep_b_u s1_trig_rep_a_u +# s1_ins_a s1_ins_b s1_b_rc s2_b_rc s3_b_rc +# s1_upd_a_data s2_upd_a_data s3_upd_a_data s1_c s2_r s3_c +# s0_rep ## s1 updates, s3 updates, s2 upserts, s1 updates, s1 commits, s3 EPQ, s3 deletes, s3 commits, s2 inserts without EPQ recheck -#permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" -# "s1_ins_a" "s1_b_rc" "s2_b_rc" "s3_b_rc" -# "s1_upd_a_data" "s3_upd_a_data" "s2_upsert_a_data" "s1_upd_a_data" "s1_c" "s3_del_a" "s3_c" "s2_c" -# "s0_rep" +#permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u +# s1_ins_a s1_b_rc s2_b_rc s3_b_rc +# s1_upd_a_data s3_upd_a_data s2_upsert_a_data s1_upd_a_data s1_c s3_del_a s3_c s2_c +# s0_rep ## s1 updates, s3 updates, s2 upserts, s1 updates, s1 commits, s3 EPQ, s3 deletes, s3 rolls back, s2 EPQ -#permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" -# "s1_ins_a" "s1_b_rc" "s2_b_rc" "s3_b_rc" -# "s1_upd_a_data" "s3_upd_a_data" "s2_upsert_a_data" "s1_upd_a_data" "s1_c" "s3_del_a" "s3_r" "s2_c" -# "s0_rep" +#permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u +# s1_ins_a s1_b_rc s2_b_rc s3_b_rc +# s1_upd_a_data s3_upd_a_data s2_upsert_a_data s1_upd_a_data s1_c s3_del_a s3_r s2_c +# s0_rep ### Document that EPQ doesn't "leap" onto a tuple that would match after blocking # s1 inserts a, s1 updates b, s2 updates b, s1 deletes b, s1 updates a to b, s1 commits, s2 EPQ finds tuple deleted -permutation "s1_trig_rep_b_i" "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_i" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_b" "s1_b_rc" "s2_b_rc" - "s1_ins_a" "s1_upd_b_data" "s2_upd_b_data" "s1_del_b" "s1_upd_a_tob" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_i s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_i s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_b s1_b_rc s2_b_rc + s1_ins_a s1_upd_b_data s2_upd_b_data s1_del_b s1_upd_a_tob s1_c s2_c + s0_rep ### Triggers for EPQ detect serialization failures # s1 updates, s2 updates, s1 commits, serialization failure -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rr" "s2_b_rr" - "s1_upd_a_data" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rr s2_b_rr + s1_upd_a_data s2_upd_a_data s1_c s2_c + s0_rep # s1 updates, s2 updates, s1 rolls back, s2 succeeds -permutation "s1_trig_rep_b_u" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rr" "s2_b_rr" - "s1_upd_a_data" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_u s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rr s2_b_rr + s1_upd_a_data s2_upd_a_data s1_r s2_c + s0_rep # s1 deletes, s2 updates, s1 commits, serialization failure -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rr" "s2_b_rr" - "s1_del_a" "s2_upd_a_data" "s1_c" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rr s2_b_rr + s1_del_a s2_upd_a_data s1_c s2_c + s0_rep # s1 deletes, s2 updates, s1 rolls back, s2 succeeds -permutation "s1_trig_rep_b_d" "s1_trig_rep_b_u" "s1_trig_rep_a_d" "s1_trig_rep_a_u" - "s1_ins_a" "s1_ins_b" "s1_b_rr" "s2_b_rr" - "s1_del_a" "s2_upd_a_data" "s1_r" "s2_c" - "s0_rep" +permutation s1_trig_rep_b_d s1_trig_rep_b_u s1_trig_rep_a_d s1_trig_rep_a_u + s1_ins_a s1_ins_b s1_b_rr s2_b_rr + s1_del_a s2_upd_a_data s1_r s2_c + s0_rep diff --git a/src/test/isolation/specs/eval-plan-qual.spec b/src/test/isolation/specs/eval-plan-qual.spec index 3825dd22f6e..09dcaa1339f 100644 --- a/src/test/isolation/specs/eval-plan-qual.spec +++ b/src/test/isolation/specs/eval-plan-qual.spec @@ -30,14 +30,14 @@ teardown DROP TABLE table_a, table_b; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } # wx1 then wx2 checks the basic case of re-fetching up-to-date values -step "wx1" { UPDATE accounts SET balance = balance - 200 WHERE accountid = 'checking'; } +step wx1 { UPDATE accounts SET balance = balance - 200 WHERE accountid = 'checking'; } # wy1 then wy2 checks the case where quals pass then fail -step "wy1" { UPDATE accounts SET balance = balance + 500 WHERE accountid = 'checking'; } +step wy1 { UPDATE accounts SET balance = balance + 500 WHERE accountid = 'checking'; } # upsert tests are to check writable-CTE cases -step "upsert1" { +step upsert1 { WITH upsert AS (UPDATE accounts SET balance = balance + 500 WHERE accountid = 'savings' @@ -51,20 +51,20 @@ step "upsert1" { # when the first updated tuple was in a non-first child table. # writep2/returningp1 tests a memory allocation issue -step "readp1" { SELECT tableoid::regclass, ctid, * FROM p WHERE b IN (0, 1) AND c = 0 FOR UPDATE; } -step "writep1" { UPDATE p SET b = -1 WHERE a = 1 AND b = 1 AND c = 0; } -step "writep2" { UPDATE p SET b = -b WHERE a = 1 AND c = 0; } -step "c1" { COMMIT; } +step readp1 { SELECT tableoid::regclass, ctid, * FROM p WHERE b IN (0, 1) AND c = 0 FOR UPDATE; } +step writep1 { UPDATE p SET b = -1 WHERE a = 1 AND b = 1 AND c = 0; } +step writep2 { UPDATE p SET b = -b WHERE a = 1 AND c = 0; } +step c1 { COMMIT; } # these tests are meant to exercise EvalPlanQualFetchRowMarks, # ie, handling non-locked tables in an EvalPlanQual recheck -step "partiallock" { +step partiallock { SELECT * FROM accounts a1, accounts a2 WHERE a1.accountid = a2.accountid FOR UPDATE OF a1; } -step "lockwithvalues" { +step lockwithvalues { SELECT * FROM accounts a1, (values('checking'),('savings')) v(id) WHERE a1.accountid = v.id FOR UPDATE OF a1; @@ -73,7 +73,7 @@ step "lockwithvalues" { # these tests exercise EvalPlanQual with a SubLink sub-select (which should be # unaffected by any EPQ recheck behavior in the outer query); cf bug #14034 -step "updateforss" { +step updateforss { UPDATE table_a SET value = 'newTableAValue' WHERE id = 1; UPDATE table_b SET value = 'newTableBValue' WHERE id = 1; } @@ -81,16 +81,16 @@ step "updateforss" { # these tests exercise EvalPlanQual with conditional InitPlans which # have not been executed prior to the EPQ -step "updateforcip" { +step updateforcip { UPDATE table_a SET value = NULL WHERE id = 1; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "wx2" { UPDATE accounts SET balance = balance + 450 WHERE accountid = 'checking'; } -step "wy2" { UPDATE accounts SET balance = balance + 1000 WHERE accountid = 'checking' AND balance < 1000; } -step "upsert2" { +step wx2 { UPDATE accounts SET balance = balance + 450 WHERE accountid = 'checking'; } +step wy2 { UPDATE accounts SET balance = balance + 1000 WHERE accountid = 'checking' AND balance < 1000; } +step upsert2 { WITH upsert AS (UPDATE accounts SET balance = balance + 1234 WHERE accountid = 'savings' @@ -98,35 +98,35 @@ step "upsert2" { INSERT INTO accounts SELECT 'savings', 1234 WHERE NOT EXISTS (SELECT 1 FROM upsert); } -step "readp2" { SELECT tableoid::regclass, ctid, * FROM p WHERE b IN (0, 1) AND c = 0 FOR UPDATE; } -step "returningp1" { +step readp2 { SELECT tableoid::regclass, ctid, * FROM p WHERE b IN (0, 1) AND c = 0 FOR UPDATE; } +step returningp1 { WITH u AS ( UPDATE p SET b = b WHERE a > 0 RETURNING * ) SELECT * FROM u; } -step "readforss" { +step readforss { SELECT ta.id AS ta_id, ta.value AS ta_value, (SELECT ROW(tb.id, tb.value) FROM table_b tb WHERE ta.id = tb.id) AS tb_row FROM table_a ta WHERE ta.id = 1 FOR UPDATE OF ta; } -step "updateforcip2" { +step updateforcip2 { UPDATE table_a SET value = COALESCE(value, (SELECT text 'newValue')) WHERE id = 1; } -step "updateforcip3" { +step updateforcip3 { WITH d(val) AS (SELECT text 'newValue' FROM generate_series(1,1)) UPDATE table_a SET value = COALESCE(value, (SELECT val FROM d)) WHERE id = 1; } -step "wrtwcte" { UPDATE table_a SET value = 'tableAValue2' WHERE id = 1; } -step "c2" { COMMIT; } +step wrtwcte { UPDATE table_a SET value = 'tableAValue2' WHERE id = 1; } +step c2 { COMMIT; } -session "s3" +session s3 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "read" { SELECT * FROM accounts ORDER BY accountid; } -step "read_a" { SELECT * FROM table_a ORDER BY id; } +step read { SELECT * FROM accounts ORDER BY accountid; } +step read_a { SELECT * FROM table_a ORDER BY id; } # this test exercises EvalPlanQual with a CTE, cf bug #14328 -step "readwcte" { +step readwcte { WITH cte1 AS ( SELECT id FROM table_b WHERE value = 'tableBValue' @@ -140,7 +140,7 @@ step "readwcte" { } # this test exercises a different CTE misbehavior, cf bug #14870 -step "multireadwcte" { +step multireadwcte { WITH updated AS ( UPDATE table_a SET value = 'tableAValue3' WHERE id = 1 RETURNING id ) @@ -149,15 +149,15 @@ step "multireadwcte" { teardown { COMMIT; } -permutation "wx1" "wx2" "c1" "c2" "read" -permutation "wy1" "wy2" "c1" "c2" "read" -permutation "upsert1" "upsert2" "c1" "c2" "read" -permutation "readp1" "writep1" "readp2" "c1" "c2" -permutation "writep2" "returningp1" "c1" "c2" -permutation "wx2" "partiallock" "c2" "c1" "read" -permutation "wx2" "lockwithvalues" "c2" "c1" "read" -permutation "updateforss" "readforss" "c1" "c2" -permutation "updateforcip" "updateforcip2" "c1" "c2" "read_a" -permutation "updateforcip" "updateforcip3" "c1" "c2" "read_a" -permutation "wrtwcte" "readwcte" "c1" "c2" -permutation "wrtwcte" "multireadwcte" "c1" "c2" +permutation wx1 wx2 c1 c2 read +permutation wy1 wy2 c1 c2 read +permutation upsert1 upsert2 c1 c2 read +permutation readp1 writep1 readp2 c1 c2 +permutation writep2 returningp1 c1 c2 +permutation wx2 partiallock c2 c1 read +permutation wx2 lockwithvalues c2 c1 read +permutation updateforss readforss c1 c2 +permutation updateforcip updateforcip2 c1 c2 read_a +permutation updateforcip updateforcip3 c1 c2 read_a +permutation wrtwcte readwcte c1 c2 +permutation wrtwcte multireadwcte c1 c2 diff --git a/src/test/isolation/specs/fk-contention.spec b/src/test/isolation/specs/fk-contention.spec index 8481ae4e332..f11a1d8cefc 100644 --- a/src/test/isolation/specs/fk-contention.spec +++ b/src/test/isolation/specs/fk-contention.spec @@ -10,10 +10,10 @@ teardown DROP TABLE foo, bar; } -session "s1" +session s1 setup { BEGIN; } -step "ins" { INSERT INTO bar VALUES (42); } -step "com" { COMMIT; } +step ins { INSERT INTO bar VALUES (42); } +step com { COMMIT; } -session "s2" -step "upd" { UPDATE foo SET b = 'Hello World'; } +session s2 +step upd { UPDATE foo SET b = 'Hello World'; } diff --git a/src/test/isolation/specs/fk-deadlock.spec b/src/test/isolation/specs/fk-deadlock.spec index 4f357c62ea5..b4970dd06fd 100644 --- a/src/test/isolation/specs/fk-deadlock.spec +++ b/src/test/isolation/specs/fk-deadlock.spec @@ -18,29 +18,29 @@ teardown DROP TABLE parent, child; } -session "s1" +session s1 setup { BEGIN; SET deadlock_timeout = '100ms'; } -step "s1i" { INSERT INTO child VALUES (1, 1); } -step "s1u" { UPDATE parent SET aux = 'bar'; } -step "s1c" { COMMIT; } +step s1i { INSERT INTO child VALUES (1, 1); } +step s1u { UPDATE parent SET aux = 'bar'; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; SET deadlock_timeout = '10s'; } -step "s2i" { INSERT INTO child VALUES (2, 1); } -step "s2u" { UPDATE parent SET aux = 'baz'; } -step "s2c" { COMMIT; } +step s2i { INSERT INTO child VALUES (2, 1); } +step s2u { UPDATE parent SET aux = 'baz'; } +step s2c { COMMIT; } -permutation "s1i" "s1u" "s1c" "s2i" "s2u" "s2c" -permutation "s1i" "s1u" "s2i" "s1c" "s2u" "s2c" -permutation "s1i" "s1u" "s2i" "s2u" "s1c" "s2c" -permutation "s1i" "s2i" "s1u" "s1c" "s2u" "s2c" -permutation "s1i" "s2i" "s1u" "s2u" "s1c" "s2c" -permutation "s1i" "s2i" "s2u" "s1u" "s2c" "s1c" -permutation "s1i" "s2i" "s2u" "s2c" "s1u" "s1c" -permutation "s2i" "s1i" "s1u" "s1c" "s2u" "s2c" -permutation "s2i" "s1i" "s1u" "s2u" "s1c" "s2c" -permutation "s2i" "s1i" "s2u" "s1u" "s2c" "s1c" -permutation "s2i" "s1i" "s2u" "s2c" "s1u" "s1c" -permutation "s2i" "s2u" "s1i" "s1u" "s2c" "s1c" -permutation "s2i" "s2u" "s1i" "s2c" "s1u" "s1c" -permutation "s2i" "s2u" "s2c" "s1i" "s1u" "s1c" +permutation s1i s1u s1c s2i s2u s2c +permutation s1i s1u s2i s1c s2u s2c +permutation s1i s1u s2i s2u s1c s2c +permutation s1i s2i s1u s1c s2u s2c +permutation s1i s2i s1u s2u s1c s2c +permutation s1i s2i s2u s1u s2c s1c +permutation s1i s2i s2u s2c s1u s1c +permutation s2i s1i s1u s1c s2u s2c +permutation s2i s1i s1u s2u s1c s2c +permutation s2i s1i s2u s1u s2c s1c +permutation s2i s1i s2u s2c s1u s1c +permutation s2i s2u s1i s1u s2c s1c +permutation s2i s2u s1i s2c s1u s1c +permutation s2i s2u s2c s1i s1u s1c diff --git a/src/test/isolation/specs/fk-deadlock2.spec b/src/test/isolation/specs/fk-deadlock2.spec index a8305246e13..c8e0e4eb19a 100644 --- a/src/test/isolation/specs/fk-deadlock2.spec +++ b/src/test/isolation/specs/fk-deadlock2.spec @@ -23,26 +23,26 @@ teardown DROP TABLE a, b; } -session "s1" +session s1 setup { BEGIN; SET deadlock_timeout = '100ms'; } -step "s1u1" { UPDATE A SET Col1 = 1 WHERE AID = 1; } -step "s1u2" { UPDATE B SET Col2 = 1 WHERE BID = 2; } -step "s1c" { COMMIT; } +step s1u1 { UPDATE A SET Col1 = 1 WHERE AID = 1; } +step s1u2 { UPDATE B SET Col2 = 1 WHERE BID = 2; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; SET deadlock_timeout = '10s'; } -step "s2u1" { UPDATE B SET Col2 = 1 WHERE BID = 2; } -step "s2u2" { UPDATE B SET Col2 = 1 WHERE BID = 2; } -step "s2c" { COMMIT; } +step s2u1 { UPDATE B SET Col2 = 1 WHERE BID = 2; } +step s2u2 { UPDATE B SET Col2 = 1 WHERE BID = 2; } +step s2c { COMMIT; } -permutation "s1u1" "s1u2" "s1c" "s2u1" "s2u2" "s2c" -permutation "s1u1" "s1u2" "s2u1" "s1c" "s2u2" "s2c" -permutation "s1u1" "s2u1" "s1u2" "s2u2" "s2c" "s1c" -permutation "s1u1" "s2u1" "s2u2" "s1u2" "s2c" "s1c" -permutation "s1u1" "s2u1" "s2u2" "s2c" "s1u2" "s1c" -permutation "s2u1" "s1u1" "s1u2" "s2u2" "s2c" "s1c" -permutation "s2u1" "s1u1" "s2u2" "s1u2" "s2c" "s1c" -permutation "s2u1" "s1u1" "s2u2" "s2c" "s1u2" "s1c" -permutation "s2u1" "s2u2" "s1u1" "s1u2" "s2c" "s1c" -permutation "s2u1" "s2u2" "s1u1" "s2c" "s1u2" "s1c" -permutation "s2u1" "s2u2" "s2c" "s1u1" "s1u2" "s1c" +permutation s1u1 s1u2 s1c s2u1 s2u2 s2c +permutation s1u1 s1u2 s2u1 s1c s2u2 s2c +permutation s1u1 s2u1 s1u2 s2u2 s2c s1c +permutation s1u1 s2u1 s2u2 s1u2 s2c s1c +permutation s1u1 s2u1 s2u2 s2c s1u2 s1c +permutation s2u1 s1u1 s1u2 s2u2 s2c s1c +permutation s2u1 s1u1 s2u2 s1u2 s2c s1c +permutation s2u1 s1u1 s2u2 s2c s1u2 s1c +permutation s2u1 s2u2 s1u1 s1u2 s2c s1c +permutation s2u1 s2u2 s1u1 s2c s1u2 s1c +permutation s2u1 s2u2 s2c s1u1 s1u2 s1c diff --git a/src/test/isolation/specs/freeze-the-dead.spec b/src/test/isolation/specs/freeze-the-dead.spec index 219242841d4..926e0c5e213 100644 --- a/src/test/isolation/specs/freeze-the-dead.spec +++ b/src/test/isolation/specs/freeze-the-dead.spec @@ -15,29 +15,29 @@ teardown DROP TABLE tab_freeze; } -session "s1" -step "s1_begin" { BEGIN; } -step "s1_update" { UPDATE tab_freeze SET x = x + 1 WHERE id = 3; } -step "s1_commit" { COMMIT; } -step "s1_selectone" { +session s1 +step s1_begin { BEGIN; } +step s1_update { UPDATE tab_freeze SET x = x + 1 WHERE id = 3; } +step s1_commit { COMMIT; } +step s1_selectone { BEGIN; SET LOCAL enable_seqscan = false; SET LOCAL enable_bitmapscan = false; SELECT * FROM tab_freeze WHERE id = 3; COMMIT; } -step "s1_selectall" { SELECT * FROM tab_freeze ORDER BY name, id; } +step s1_selectall { SELECT * FROM tab_freeze ORDER BY name, id; } -session "s2" -step "s2_begin" { BEGIN; } -step "s2_key_share" { SELECT id FROM tab_freeze WHERE id = 3 FOR KEY SHARE; } -step "s2_commit" { COMMIT; } -step "s2_vacuum" { VACUUM FREEZE tab_freeze; } +session s2 +step s2_begin { BEGIN; } +step s2_key_share { SELECT id FROM tab_freeze WHERE id = 3 FOR KEY SHARE; } +step s2_commit { COMMIT; } +step s2_vacuum { VACUUM FREEZE tab_freeze; } -session "s3" -step "s3_begin" { BEGIN; } -step "s3_key_share" { SELECT id FROM tab_freeze WHERE id = 3 FOR KEY SHARE; } -step "s3_commit" { COMMIT; } +session s3 +step s3_begin { BEGIN; } +step s3_key_share { SELECT id FROM tab_freeze WHERE id = 3 FOR KEY SHARE; } +step s3_commit { COMMIT; } # This permutation verfies that a previous bug # https://postgr.es/m/E5711E62-8FDF-4DCA-A888-C200BF6B5742@amazon.com @@ -45,12 +45,12 @@ step "s3_commit" { COMMIT; } # is not reintroduced. We used to make wrong pruning / freezing # decision for multixacts, which could lead to a) broken hot chains b) # dead rows being revived. -permutation "s1_begin" "s2_begin" "s3_begin" # start transactions - "s1_update" "s2_key_share" "s3_key_share" # have xmax be a multi with an updater, updater being oldest xid - "s1_update" # create additional row version that has multis - "s1_commit" "s2_commit" # commit both updater and share locker - "s2_vacuum" # due to bug in freezing logic, we used to *not* prune updated row, and then froze it - "s1_selectone" # if hot chain is broken, the row can't be found via index scan - "s3_commit" # commit remaining open xact - "s2_vacuum" # pruning / freezing in broken hot chains would unset xmax, reviving rows - "s1_selectall" # show borkedness +permutation s1_begin s2_begin s3_begin # start transactions + s1_update s2_key_share s3_key_share # have xmax be a multi with an updater, updater being oldest xid + s1_update # create additional row version that has multis + s1_commit s2_commit # commit both updater and share locker + s2_vacuum # due to bug in freezing logic, we used to *not* prune updated row, and then froze it + s1_selectone # if hot chain is broken, the row can't be found via index scan + s3_commit # commit remaining open xact + s2_vacuum # pruning / freezing in broken hot chains would unset xmax, reviving rows + s1_selectall # show borkedness diff --git a/src/test/isolation/specs/index-only-scan.spec b/src/test/isolation/specs/index-only-scan.spec index 417bb02102e..4e4171ca80e 100644 --- a/src/test/isolation/specs/index-only-scan.spec +++ b/src/test/isolation/specs/index-only-scan.spec @@ -23,7 +23,7 @@ teardown DROP TABLE taby; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; @@ -31,10 +31,10 @@ setup SET LOCAL random_page_cost = 0.1; SET LOCAL cpu_tuple_cost = 0.03; } -step "rxwy1" { DELETE FROM taby WHERE id = (SELECT min(id) FROM tabx); } -step "c1" { COMMIT; } +step rxwy1 { DELETE FROM taby WHERE id = (SELECT min(id) FROM tabx); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; @@ -42,5 +42,5 @@ setup SET LOCAL random_page_cost = 0.1; SET LOCAL cpu_tuple_cost = 0.03; } -step "rywx2" { DELETE FROM tabx WHERE id = (SELECT min(id) FROM taby); } -step "c2" { COMMIT; } +step rywx2 { DELETE FROM tabx WHERE id = (SELECT min(id) FROM taby); } +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/inherit-temp.spec b/src/test/isolation/specs/inherit-temp.spec index 5cd251d0aaa..644f919e846 100644 --- a/src/test/isolation/specs/inherit-temp.spec +++ b/src/test/isolation/specs/inherit-temp.spec @@ -19,60 +19,60 @@ teardown # Session 1 executes actions which act directly on both the parent and # its child. Abbreviation "c" is used for queries working on the child # and "p" on the parent. -session "s1" +session s1 setup { CREATE TEMPORARY TABLE inh_temp_child_s1 () INHERITS (inh_parent); } -step "s1_begin" { BEGIN; } -step "s1_truncate_p" { TRUNCATE inh_parent; } -step "s1_select_p" { SELECT a FROM inh_parent; } -step "s1_select_c" { SELECT a FROM inh_temp_child_s1; } -step "s1_insert_p" { INSERT INTO inh_parent VALUES (1), (2); } -step "s1_insert_c" { INSERT INTO inh_temp_child_s1 VALUES (3), (4); } -step "s1_update_p" { UPDATE inh_parent SET a = 11 WHERE a = 1; } -step "s1_update_c" { UPDATE inh_parent SET a = 13 WHERE a IN (3, 5); } -step "s1_delete_p" { DELETE FROM inh_parent WHERE a = 2; } -step "s1_delete_c" { DELETE FROM inh_parent WHERE a IN (4, 6); } -step "s1_commit" { COMMIT; } +step s1_begin { BEGIN; } +step s1_truncate_p { TRUNCATE inh_parent; } +step s1_select_p { SELECT a FROM inh_parent; } +step s1_select_c { SELECT a FROM inh_temp_child_s1; } +step s1_insert_p { INSERT INTO inh_parent VALUES (1), (2); } +step s1_insert_c { INSERT INTO inh_temp_child_s1 VALUES (3), (4); } +step s1_update_p { UPDATE inh_parent SET a = 11 WHERE a = 1; } +step s1_update_c { UPDATE inh_parent SET a = 13 WHERE a IN (3, 5); } +step s1_delete_p { DELETE FROM inh_parent WHERE a = 2; } +step s1_delete_c { DELETE FROM inh_parent WHERE a IN (4, 6); } +step s1_commit { COMMIT; } teardown { DROP TABLE inh_temp_child_s1; } # Session 2 executes actions on the parent which act only on the child. -session "s2" +session s2 setup { CREATE TEMPORARY TABLE inh_temp_child_s2 () INHERITS (inh_parent); } -step "s2_truncate_p" { TRUNCATE inh_parent; } -step "s2_select_p" { SELECT a FROM inh_parent; } -step "s2_select_c" { SELECT a FROM inh_temp_child_s2; } -step "s2_insert_c" { INSERT INTO inh_temp_child_s2 VALUES (5), (6); } -step "s2_update_c" { UPDATE inh_parent SET a = 15 WHERE a IN (3, 5); } -step "s2_delete_c" { DELETE FROM inh_parent WHERE a IN (4, 6); } +step s2_truncate_p { TRUNCATE inh_parent; } +step s2_select_p { SELECT a FROM inh_parent; } +step s2_select_c { SELECT a FROM inh_temp_child_s2; } +step s2_insert_c { INSERT INTO inh_temp_child_s2 VALUES (5), (6); } +step s2_update_c { UPDATE inh_parent SET a = 15 WHERE a IN (3, 5); } +step s2_delete_c { DELETE FROM inh_parent WHERE a IN (4, 6); } teardown { DROP TABLE inh_temp_child_s2; } # Check INSERT behavior across sessions -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s1_select_p" "s1_select_c" "s2_select_p" "s2_select_c" +permutation s1_insert_p s1_insert_c s2_insert_c s1_select_p s1_select_c s2_select_p s2_select_c # Check UPDATE behavior across sessions -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s1_update_p" "s1_update_c" "s1_select_p" "s1_select_c" "s2_select_p" "s2_select_c" -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s2_update_c" "s1_select_p" "s1_select_c" "s2_select_p" "s2_select_c" +permutation s1_insert_p s1_insert_c s2_insert_c s1_update_p s1_update_c s1_select_p s1_select_c s2_select_p s2_select_c +permutation s1_insert_p s1_insert_c s2_insert_c s2_update_c s1_select_p s1_select_c s2_select_p s2_select_c # Check DELETE behavior across sessions -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s1_delete_p" "s1_delete_c" "s1_select_p" "s1_select_c" "s2_select_p" "s2_select_c" -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s2_delete_c" "s1_select_p" "s1_select_c" "s2_select_p" "s2_select_c" +permutation s1_insert_p s1_insert_c s2_insert_c s1_delete_p s1_delete_c s1_select_p s1_select_c s2_select_p s2_select_c +permutation s1_insert_p s1_insert_c s2_insert_c s2_delete_c s1_select_p s1_select_c s2_select_p s2_select_c # Check TRUNCATE behavior across sessions -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s1_truncate_p" "s1_select_p" "s1_select_c" "s2_select_p" "s2_select_c" -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s2_truncate_p" "s1_select_p" "s1_select_c" "s2_select_p" "s2_select_c" +permutation s1_insert_p s1_insert_c s2_insert_c s1_truncate_p s1_select_p s1_select_c s2_select_p s2_select_c +permutation s1_insert_p s1_insert_c s2_insert_c s2_truncate_p s1_select_p s1_select_c s2_select_p s2_select_c # TRUNCATE on a parent tree does not block access to temporary child relation # of another session, and blocks when scanning the parent. -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s1_begin" "s1_truncate_p" "s2_select_p" "s1_commit" -permutation "s1_insert_p" "s1_insert_c" "s2_insert_c" "s1_begin" "s1_truncate_p" "s2_select_c" "s1_commit" +permutation s1_insert_p s1_insert_c s2_insert_c s1_begin s1_truncate_p s2_select_p s1_commit +permutation s1_insert_p s1_insert_c s2_insert_c s1_begin s1_truncate_p s2_select_c s1_commit diff --git a/src/test/isolation/specs/insert-conflict-do-nothing-2.spec b/src/test/isolation/specs/insert-conflict-do-nothing-2.spec index f1e5bde357c..7909093d889 100644 --- a/src/test/isolation/specs/insert-conflict-do-nothing-2.spec +++ b/src/test/isolation/specs/insert-conflict-do-nothing-2.spec @@ -11,24 +11,24 @@ teardown DROP TABLE ints; } -session "s1" -step "beginrr1" { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "begins1" { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "donothing1" { INSERT INTO ints(key, val) VALUES(1, 'donothing1') ON CONFLICT DO NOTHING; } -step "c1" { COMMIT; } -step "show" { SELECT * FROM ints; } +session s1 +step beginrr1 { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step begins1 { BEGIN ISOLATION LEVEL SERIALIZABLE; } +step donothing1 { INSERT INTO ints(key, val) VALUES(1, 'donothing1') ON CONFLICT DO NOTHING; } +step c1 { COMMIT; } +step show { SELECT * FROM ints; } -session "s2" -step "beginrr2" { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "begins2" { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "donothing2" { INSERT INTO ints(key, val) VALUES(1, 'donothing2'), (1, 'donothing3') ON CONFLICT DO NOTHING; } -step "c2" { COMMIT; } +session s2 +step beginrr2 { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step begins2 { BEGIN ISOLATION LEVEL SERIALIZABLE; } +step donothing2 { INSERT INTO ints(key, val) VALUES(1, 'donothing2'), (1, 'donothing3') ON CONFLICT DO NOTHING; } +step c2 { COMMIT; } -permutation "beginrr1" "beginrr2" "donothing1" "c1" "donothing2" "c2" "show" -permutation "beginrr1" "beginrr2" "donothing2" "c2" "donothing1" "c1" "show" -permutation "beginrr1" "beginrr2" "donothing1" "donothing2" "c1" "c2" "show" -permutation "beginrr1" "beginrr2" "donothing2" "donothing1" "c2" "c1" "show" -permutation "begins1" "begins2" "donothing1" "c1" "donothing2" "c2" "show" -permutation "begins1" "begins2" "donothing2" "c2" "donothing1" "c1" "show" -permutation "begins1" "begins2" "donothing1" "donothing2" "c1" "c2" "show" -permutation "begins1" "begins2" "donothing2" "donothing1" "c2" "c1" "show" +permutation beginrr1 beginrr2 donothing1 c1 donothing2 c2 show +permutation beginrr1 beginrr2 donothing2 c2 donothing1 c1 show +permutation beginrr1 beginrr2 donothing1 donothing2 c1 c2 show +permutation beginrr1 beginrr2 donothing2 donothing1 c2 c1 show +permutation begins1 begins2 donothing1 c1 donothing2 c2 show +permutation begins1 begins2 donothing2 c2 donothing1 c1 show +permutation begins1 begins2 donothing1 donothing2 c1 c2 show +permutation begins1 begins2 donothing2 donothing1 c2 c1 show diff --git a/src/test/isolation/specs/insert-conflict-do-nothing.spec b/src/test/isolation/specs/insert-conflict-do-nothing.spec index 71acc380c7a..b0e6a372476 100644 --- a/src/test/isolation/specs/insert-conflict-do-nothing.spec +++ b/src/test/isolation/specs/insert-conflict-do-nothing.spec @@ -16,25 +16,25 @@ teardown DROP TABLE ints; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "donothing1" { INSERT INTO ints(key, val) VALUES(1, 'donothing1') ON CONFLICT DO NOTHING; } -step "c1" { COMMIT; } -step "a1" { ABORT; } +step donothing1 { INSERT INTO ints(key, val) VALUES(1, 'donothing1') ON CONFLICT DO NOTHING; } +step c1 { COMMIT; } +step a1 { ABORT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "donothing2" { INSERT INTO ints(key, val) VALUES(1, 'donothing2') ON CONFLICT DO NOTHING; } -step "select2" { SELECT * FROM ints; } -step "c2" { COMMIT; } +step donothing2 { INSERT INTO ints(key, val) VALUES(1, 'donothing2') ON CONFLICT DO NOTHING; } +step select2 { SELECT * FROM ints; } +step c2 { COMMIT; } # Regular case where one session block-waits on another to determine if it # should proceed with an insert or do nothing. -permutation "donothing1" "donothing2" "c1" "select2" "c2" -permutation "donothing1" "donothing2" "a1" "select2" "c2" +permutation donothing1 donothing2 c1 select2 c2 +permutation donothing1 donothing2 a1 select2 c2 diff --git a/src/test/isolation/specs/insert-conflict-do-update-2.spec b/src/test/isolation/specs/insert-conflict-do-update-2.spec index 6e4f3d6017b..3ae220417e3 100644 --- a/src/test/isolation/specs/insert-conflict-do-update-2.spec +++ b/src/test/isolation/specs/insert-conflict-do-update-2.spec @@ -15,26 +15,26 @@ teardown DROP TABLE upsert; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "insert1" { INSERT INTO upsert(key, payload) VALUES('FooFoo', 'insert1') ON CONFLICT (lower(key)) DO UPDATE set key = EXCLUDED.key, payload = upsert.payload || ' updated by insert1'; } -step "c1" { COMMIT; } -step "a1" { ABORT; } +step insert1 { INSERT INTO upsert(key, payload) VALUES('FooFoo', 'insert1') ON CONFLICT (lower(key)) DO UPDATE set key = EXCLUDED.key, payload = upsert.payload || ' updated by insert1'; } +step c1 { COMMIT; } +step a1 { ABORT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "insert2" { INSERT INTO upsert(key, payload) VALUES('FOOFOO', 'insert2') ON CONFLICT (lower(key)) DO UPDATE set key = EXCLUDED.key, payload = upsert.payload || ' updated by insert2'; } -step "select2" { SELECT * FROM upsert; } -step "c2" { COMMIT; } +step insert2 { INSERT INTO upsert(key, payload) VALUES('FOOFOO', 'insert2') ON CONFLICT (lower(key)) DO UPDATE set key = EXCLUDED.key, payload = upsert.payload || ' updated by insert2'; } +step select2 { SELECT * FROM upsert; } +step c2 { COMMIT; } # One session (session 2) block-waits on another (session 1) to determine if it # should proceed with an insert or update. The user can still usefully UPDATE # a column constrained by a unique index, as the example illustrates. -permutation "insert1" "insert2" "c1" "select2" "c2" -permutation "insert1" "insert2" "a1" "select2" "c2" +permutation insert1 insert2 c1 select2 c2 +permutation insert1 insert2 a1 select2 c2 diff --git a/src/test/isolation/specs/insert-conflict-do-update-3.spec b/src/test/isolation/specs/insert-conflict-do-update-3.spec index e282c3beca5..df6795467da 100644 --- a/src/test/isolation/specs/insert-conflict-do-update-3.spec +++ b/src/test/isolation/specs/insert-conflict-do-update-3.spec @@ -37,12 +37,12 @@ teardown DROP TABLE colors; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "insert1" { +step insert1 { WITH t AS ( INSERT INTO colors(key, color, is_active) VALUES(1, 'Brown', true), (2, 'Gray', true) @@ -50,20 +50,20 @@ step "insert1" { SET color = EXCLUDED.color WHERE colors.is_active) SELECT * FROM colors ORDER BY key;} -step "select1surprise" { SELECT * FROM colors ORDER BY key; } -step "c1" { COMMIT; } +step select1surprise { SELECT * FROM colors ORDER BY key; } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "update2" { UPDATE colors SET is_active = true WHERE key = 1; } -step "c2" { COMMIT; } +step update2 { UPDATE colors SET is_active = true WHERE key = 1; } +step c2 { COMMIT; } # Perhaps surprisingly, the session 1 MVCC-snapshot-visible tuple (the tuple # with the pre-populated color 'Red') is denied the opportunity to prevent the # UPDATE from taking place -- only the conclusively-locked tuple version # matters, and so the tuple with key value 1 was updated to 'Brown' (but not # tuple with key value 2, since nothing changed there): -permutation "update2" "insert1" "c2" "select1surprise" "c1" +permutation update2 insert1 c2 select1surprise c1 diff --git a/src/test/isolation/specs/insert-conflict-do-update.spec b/src/test/isolation/specs/insert-conflict-do-update.spec index 7c8cb471002..62cdafda988 100644 --- a/src/test/isolation/specs/insert-conflict-do-update.spec +++ b/src/test/isolation/specs/insert-conflict-do-update.spec @@ -13,27 +13,27 @@ teardown DROP TABLE upsert; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "insert1" { INSERT INTO upsert(key, val) VALUES(1, 'insert1') ON CONFLICT (key) DO UPDATE set val = upsert.val || ' updated by insert1'; } -step "c1" { COMMIT; } -step "a1" { ABORT; } +step insert1 { INSERT INTO upsert(key, val) VALUES(1, 'insert1') ON CONFLICT (key) DO UPDATE set val = upsert.val || ' updated by insert1'; } +step c1 { COMMIT; } +step a1 { ABORT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "insert2" { INSERT INTO upsert(key, val) VALUES(1, 'insert2') ON CONFLICT (key) DO UPDATE set val = upsert.val || ' updated by insert2'; } -step "select2" { SELECT * FROM upsert; } -step "c2" { COMMIT; } +step insert2 { INSERT INTO upsert(key, val) VALUES(1, 'insert2') ON CONFLICT (key) DO UPDATE set val = upsert.val || ' updated by insert2'; } +step select2 { SELECT * FROM upsert; } +step c2 { COMMIT; } # One session (session 2) block-waits on another (session 1) to determine if it # should proceed with an insert or update. Notably, this entails updating a # tuple while there is no version of that tuple visible to the updating # session's snapshot. This is permitted only in READ COMMITTED mode. -permutation "insert1" "insert2" "c1" "select2" "c2" -permutation "insert1" "insert2" "a1" "select2" "c2" +permutation insert1 insert2 c1 select2 c2 +permutation insert1 insert2 a1 select2 c2 diff --git a/src/test/isolation/specs/insert-conflict-specconflict.spec b/src/test/isolation/specs/insert-conflict-specconflict.spec index 3a70484fc29..e1afa6f11c3 100644 --- a/src/test/isolation/specs/insert-conflict-specconflict.spec +++ b/src/test/isolation/specs/insert-conflict-specconflict.spec @@ -33,39 +33,39 @@ teardown DROP TABLE upserttest; } -session "controller" +session controller setup { SET default_transaction_isolation = 'read committed'; } -step "controller_locks" {SELECT pg_advisory_lock(sess, lock), sess, lock FROM generate_series(1, 2) a(sess), generate_series(1,3) b(lock);} -step "controller_unlock_1_1" { SELECT pg_advisory_unlock(1, 1); } -step "controller_unlock_2_1" { SELECT pg_advisory_unlock(2, 1); } -step "controller_unlock_1_2" { SELECT pg_advisory_unlock(1, 2); } -step "controller_unlock_2_2" { SELECT pg_advisory_unlock(2, 2); } -step "controller_unlock_1_3" { SELECT pg_advisory_unlock(1, 3); } -step "controller_unlock_2_3" { SELECT pg_advisory_unlock(2, 3); } -step "controller_show" {SELECT * FROM upserttest; } +step controller_locks {SELECT pg_advisory_lock(sess, lock), sess, lock FROM generate_series(1, 2) a(sess), generate_series(1,3) b(lock);} +step controller_unlock_1_1 { SELECT pg_advisory_unlock(1, 1); } +step controller_unlock_2_1 { SELECT pg_advisory_unlock(2, 1); } +step controller_unlock_1_2 { SELECT pg_advisory_unlock(1, 2); } +step controller_unlock_2_2 { SELECT pg_advisory_unlock(2, 2); } +step controller_unlock_1_3 { SELECT pg_advisory_unlock(1, 3); } +step controller_unlock_2_3 { SELECT pg_advisory_unlock(2, 3); } +step controller_show {SELECT * FROM upserttest; } -session "s1" +session s1 setup { SET default_transaction_isolation = 'read committed'; SET spec.session = 1; } -step "s1_begin" { BEGIN; } -step "s1_upsert" { INSERT INTO upserttest(key, data) VALUES('k1', 'inserted s1') ON CONFLICT (blurt_and_lock(key)) DO UPDATE SET data = upserttest.data || ' with conflict update s1'; } -step "s1_commit" { COMMIT; } +step s1_begin { BEGIN; } +step s1_upsert { INSERT INTO upserttest(key, data) VALUES('k1', 'inserted s1') ON CONFLICT (blurt_and_lock(key)) DO UPDATE SET data = upserttest.data || ' with conflict update s1'; } +step s1_commit { COMMIT; } -session "s2" +session s2 setup { SET default_transaction_isolation = 'read committed'; SET spec.session = 2; } -step "s2_begin" { BEGIN; } -step "s2_upsert" { INSERT INTO upserttest(key, data) VALUES('k1', 'inserted s2') ON CONFLICT (blurt_and_lock(key)) DO UPDATE SET data = upserttest.data || ' with conflict update s2'; } -step "s2_commit" { COMMIT; } +step s2_begin { BEGIN; } +step s2_upsert { INSERT INTO upserttest(key, data) VALUES('k1', 'inserted s2') ON CONFLICT (blurt_and_lock(key)) DO UPDATE SET data = upserttest.data || ' with conflict update s2'; } +step s2_commit { COMMIT; } # Test that speculative locks are correctly acquired and released, s2 # inserts, s1 updates. @@ -74,23 +74,23 @@ permutation # blurt_and_lock function acquires advisory locks that allow us to # continue after a) the optimistic conflict probe b) after the # insertion of the speculative tuple. - "controller_locks" - "controller_show" - "s1_upsert" "s2_upsert" - "controller_show" + controller_locks + controller_show + s1_upsert s2_upsert + controller_show # Switch both sessions to wait on the other lock next time (the speculative insertion) - "controller_unlock_1_1" "controller_unlock_2_1" + controller_unlock_1_1 controller_unlock_2_1 # Allow both sessions to continue - "controller_unlock_1_3" "controller_unlock_2_3" - "controller_show" + controller_unlock_1_3 controller_unlock_2_3 + controller_show # Allow the second session to finish insertion - "controller_unlock_2_2" + controller_unlock_2_2 # This should now show a successful insertion - "controller_show" + controller_show # Allow the first session to finish insertion - "controller_unlock_1_2" + controller_unlock_1_2 # This should now show a successful UPSERT - "controller_show" + controller_show # Test that speculative locks are correctly acquired and released, s2 # inserts, s1 updates. @@ -99,23 +99,23 @@ permutation # blurt_and_lock function acquires advisory locks that allow us to # continue after a) the optimistic conflict probe b) after the # insertion of the speculative tuple. - "controller_locks" - "controller_show" - "s1_upsert" "s2_upsert" - "controller_show" + controller_locks + controller_show + s1_upsert s2_upsert + controller_show # Switch both sessions to wait on the other lock next time (the speculative insertion) - "controller_unlock_1_1" "controller_unlock_2_1" + controller_unlock_1_1 controller_unlock_2_1 # Allow both sessions to continue - "controller_unlock_1_3" "controller_unlock_2_3" - "controller_show" + controller_unlock_1_3 controller_unlock_2_3 + controller_show # Allow the first session to finish insertion - "controller_unlock_1_2" + controller_unlock_1_2 # This should now show a successful insertion - "controller_show" + controller_show # Allow the second session to finish insertion - "controller_unlock_2_2" + controller_unlock_2_2 # This should now show a successful UPSERT - "controller_show" + controller_show # Test that speculative locks are correctly acquired and released, s2 # inserts, s1 updates. With the added complication that transactions @@ -125,25 +125,25 @@ permutation # blurt_and_lock function acquires advisory locks that allow us to # continue after a) the optimistic conflict probe b) after the # insertion of the speculative tuple. - "controller_locks" - "controller_show" - "s1_begin" "s2_begin" - "s1_upsert" "s2_upsert" - "controller_show" + controller_locks + controller_show + s1_begin s2_begin + s1_upsert s2_upsert + controller_show # Switch both sessions to wait on the other lock next time (the speculative insertion) - "controller_unlock_1_1" "controller_unlock_2_1" + controller_unlock_1_1 controller_unlock_2_1 # Allow both sessions to continue - "controller_unlock_1_3" "controller_unlock_2_3" - "controller_show" + controller_unlock_1_3 controller_unlock_2_3 + controller_show # Allow the first session to finish insertion - "controller_unlock_1_2" + controller_unlock_1_2 # But the change isn't visible yet, nor should the second session continue - "controller_show" + controller_show # Allow the second session to finish insertion, but it's blocked - "controller_unlock_2_2" - "controller_show" + controller_unlock_2_2 + controller_show # But committing should unblock - "s1_commit" - "controller_show" - "s2_commit" - "controller_show" + s1_commit + controller_show + s2_commit + controller_show diff --git a/src/test/isolation/specs/insert-conflict-toast.spec b/src/test/isolation/specs/insert-conflict-toast.spec index c5e39ef9e31..efd4474f377 100644 --- a/src/test/isolation/specs/insert-conflict-toast.spec +++ b/src/test/isolation/specs/insert-conflict-toast.spec @@ -22,30 +22,30 @@ teardown DROP FUNCTION ctoast_large_val(); } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT pg_advisory_xact_lock(1); } -step "s1commit" { COMMIT; } +step s1commit { COMMIT; } -session "s2" +session s2 setup { SET default_transaction_isolation = 'read committed'; } -step "s2insert" { +step s2insert { INSERT INTO ctoast (key, val) VALUES (1, ctoast_large_val()) ON CONFLICT DO NOTHING; } -session "s3" +session s3 setup { SET default_transaction_isolation = 'read committed'; } -step "s3insert" { +step s3insert { INSERT INTO ctoast (key, val) VALUES (1, ctoast_large_val()) ON CONFLICT DO NOTHING; } -permutation "s2insert" "s3insert" "s1commit" +permutation s2insert s3insert s1commit diff --git a/src/test/isolation/specs/lock-committed-keyupdate.spec b/src/test/isolation/specs/lock-committed-keyupdate.spec index 1630282d0f4..652233c4beb 100644 --- a/src/test/isolation/specs/lock-committed-keyupdate.spec +++ b/src/test/isolation/specs/lock-committed-keyupdate.spec @@ -18,49 +18,49 @@ teardown DROP TABLE lcku_table; } -session "s1" -step "s1b" { BEGIN; } -step "s1l" { SELECT pg_advisory_lock(578902068); } -step "s1u" { UPDATE lcku_table SET id = 2 WHERE id = 3; } -step "s1hint" { SELECT * FROM lcku_table; } -step "s1ul" { SELECT pg_advisory_unlock(578902068); } -step "s1c" { COMMIT; } +session s1 +step s1b { BEGIN; } +step s1l { SELECT pg_advisory_lock(578902068); } +step s1u { UPDATE lcku_table SET id = 2 WHERE id = 3; } +step s1hint { SELECT * FROM lcku_table; } +step s1ul { SELECT pg_advisory_unlock(578902068); } +step s1c { COMMIT; } teardown { SELECT pg_advisory_unlock_all(); } -session "s2" -step "s2b1" { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "s2b2" { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "s2b3" { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "s2l" { SELECT * FROM lcku_table WHERE pg_advisory_lock(578902068) IS NOT NULL FOR KEY SHARE; } -step "s2c" { COMMIT; } +session s2 +step s2b1 { BEGIN ISOLATION LEVEL READ COMMITTED; } +step s2b2 { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step s2b3 { BEGIN ISOLATION LEVEL SERIALIZABLE; } +step s2l { SELECT * FROM lcku_table WHERE pg_advisory_lock(578902068) IS NOT NULL FOR KEY SHARE; } +step s2c { COMMIT; } teardown { SELECT pg_advisory_unlock_all(); } -permutation "s1b" "s2b1" "s1l" "s2l" "s1u" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b1" "s1l" "s1u" "s2l" "s1c" "s1ul" "s2c" -#permutation "s1b" "s2b1" "s1l" "s2l" "s1ul" "s1u" "s1c" "s2c" -permutation "s1b" "s2b1" "s1l" "s1u" "s1ul" "s2l" "s1c" "s2c" +permutation s1b s2b1 s1l s2l s1u s1c s1ul s2c +permutation s1b s2b1 s1l s1u s2l s1c s1ul s2c +#permutation s1b s2b1 s1l s2l s1ul s1u s1c s2c +permutation s1b s2b1 s1l s1u s1ul s2l s1c s2c -permutation "s1b" "s2b1" "s1l" "s2l" "s1u" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b1" "s1l" "s1u" "s2l" "s1c" "s1hint" "s1ul" "s2c" -#permutation "s1b" "s2b1" "s1l" "s2l" "s1ul" "s1u" "s1c" "s1hint" "s2c" -permutation "s1b" "s2b1" "s1l" "s1u" "s1ul" "s2l" "s1c" "s1hint" "s2c" +permutation s1b s2b1 s1l s2l s1u s1c s1hint s1ul s2c +permutation s1b s2b1 s1l s1u s2l s1c s1hint s1ul s2c +#permutation s1b s2b1 s1l s2l s1ul s1u s1c s1hint s2c +permutation s1b s2b1 s1l s1u s1ul s2l s1c s1hint s2c -permutation "s1b" "s2b2" "s1l" "s2l" "s1u" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b2" "s1l" "s1u" "s2l" "s1c" "s1ul" "s2c" -#permutation "s1b" "s2b2" "s1l" "s2l" "s1ul" "s1u" "s1c" "s2c" -permutation "s1b" "s2b2" "s1l" "s1u" "s1ul" "s2l" "s1c" "s2c" +permutation s1b s2b2 s1l s2l s1u s1c s1ul s2c +permutation s1b s2b2 s1l s1u s2l s1c s1ul s2c +#permutation s1b s2b2 s1l s2l s1ul s1u s1c s2c +permutation s1b s2b2 s1l s1u s1ul s2l s1c s2c -permutation "s1b" "s2b2" "s1l" "s2l" "s1u" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b2" "s1l" "s1u" "s2l" "s1c" "s1hint" "s1ul" "s2c" -#permutation "s1b" "s2b2" "s1l" "s2l" "s1ul" "s1u" "s1c" "s1hint" "s2c" -permutation "s1b" "s2b2" "s1l" "s1u" "s1ul" "s2l" "s1c" "s1hint" "s2c" +permutation s1b s2b2 s1l s2l s1u s1c s1hint s1ul s2c +permutation s1b s2b2 s1l s1u s2l s1c s1hint s1ul s2c +#permutation s1b s2b2 s1l s2l s1ul s1u s1c s1hint s2c +permutation s1b s2b2 s1l s1u s1ul s2l s1c s1hint s2c -permutation "s1b" "s2b3" "s1l" "s2l" "s1u" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b3" "s1l" "s1u" "s2l" "s1c" "s1ul" "s2c" -#permutation "s1b" "s2b3" "s1l" "s2l" "s1ul" "s1u" "s1c" "s2c" -permutation "s1b" "s2b3" "s1l" "s1u" "s1ul" "s2l" "s1c" "s2c" +permutation s1b s2b3 s1l s2l s1u s1c s1ul s2c +permutation s1b s2b3 s1l s1u s2l s1c s1ul s2c +#permutation s1b s2b3 s1l s2l s1ul s1u s1c s2c +permutation s1b s2b3 s1l s1u s1ul s2l s1c s2c -permutation "s1b" "s2b3" "s1l" "s2l" "s1u" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b3" "s1l" "s1u" "s2l" "s1c" "s1hint" "s1ul" "s2c" -#permutation "s1b" "s2b3" "s1l" "s2l" "s1ul" "s1u" "s1c" "s1hint" "s2c" -permutation "s1b" "s2b3" "s1l" "s1u" "s1ul" "s2l" "s1c" "s1hint" "s2c" +permutation s1b s2b3 s1l s2l s1u s1c s1hint s1ul s2c +permutation s1b s2b3 s1l s1u s2l s1c s1hint s1ul s2c +#permutation s1b s2b3 s1l s2l s1ul s1u s1c s1hint s2c +permutation s1b s2b3 s1l s1u s1ul s2l s1c s1hint s2c diff --git a/src/test/isolation/specs/lock-committed-update.spec b/src/test/isolation/specs/lock-committed-update.spec index 0495c115707..74d80d53e61 100644 --- a/src/test/isolation/specs/lock-committed-update.spec +++ b/src/test/isolation/specs/lock-committed-update.spec @@ -14,49 +14,49 @@ teardown DROP TABLE lcu_table; } -session "s1" -step "s1b" { BEGIN; } -step "s1l" { SELECT pg_advisory_lock(380170116); } -step "s1u" { UPDATE lcu_table SET value = 'two' WHERE id = 1; } -step "s1hint" { SELECT * FROM lcu_table; } -step "s1ul" { SELECT pg_advisory_unlock(380170116); } -step "s1c" { COMMIT; } +session s1 +step s1b { BEGIN; } +step s1l { SELECT pg_advisory_lock(380170116); } +step s1u { UPDATE lcu_table SET value = 'two' WHERE id = 1; } +step s1hint { SELECT * FROM lcu_table; } +step s1ul { SELECT pg_advisory_unlock(380170116); } +step s1c { COMMIT; } teardown { SELECT pg_advisory_unlock_all(); } -session "s2" -step "s2b1" { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "s2b2" { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "s2b3" { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "s2l" { SELECT * FROM lcu_table WHERE pg_advisory_lock(380170116) IS NOT NULL FOR KEY SHARE; } -step "s2c" { COMMIT; } +session s2 +step s2b1 { BEGIN ISOLATION LEVEL READ COMMITTED; } +step s2b2 { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step s2b3 { BEGIN ISOLATION LEVEL SERIALIZABLE; } +step s2l { SELECT * FROM lcu_table WHERE pg_advisory_lock(380170116) IS NOT NULL FOR KEY SHARE; } +step s2c { COMMIT; } teardown { SELECT pg_advisory_unlock_all(); } -permutation "s1b" "s2b1" "s1l" "s2l" "s1u" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b1" "s1l" "s1u" "s2l" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b1" "s1l" "s2l" "s1ul" "s1u" "s1c" "s2c" -permutation "s1b" "s2b1" "s1l" "s1u" "s1ul" "s2l" "s1c" "s2c" +permutation s1b s2b1 s1l s2l s1u s1c s1ul s2c +permutation s1b s2b1 s1l s1u s2l s1c s1ul s2c +permutation s1b s2b1 s1l s2l s1ul s1u s1c s2c +permutation s1b s2b1 s1l s1u s1ul s2l s1c s2c -permutation "s1b" "s2b1" "s1l" "s2l" "s1u" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b1" "s1l" "s1u" "s2l" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b1" "s1l" "s2l" "s1ul" "s1u" "s1c" "s1hint" "s2c" -permutation "s1b" "s2b1" "s1l" "s1u" "s1ul" "s2l" "s1c" "s1hint" "s2c" +permutation s1b s2b1 s1l s2l s1u s1c s1hint s1ul s2c +permutation s1b s2b1 s1l s1u s2l s1c s1hint s1ul s2c +permutation s1b s2b1 s1l s2l s1ul s1u s1c s1hint s2c +permutation s1b s2b1 s1l s1u s1ul s2l s1c s1hint s2c -permutation "s1b" "s2b2" "s1l" "s2l" "s1u" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b2" "s1l" "s1u" "s2l" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b2" "s1l" "s2l" "s1ul" "s1u" "s1c" "s2c" -permutation "s1b" "s2b2" "s1l" "s1u" "s1ul" "s2l" "s1c" "s2c" +permutation s1b s2b2 s1l s2l s1u s1c s1ul s2c +permutation s1b s2b2 s1l s1u s2l s1c s1ul s2c +permutation s1b s2b2 s1l s2l s1ul s1u s1c s2c +permutation s1b s2b2 s1l s1u s1ul s2l s1c s2c -permutation "s1b" "s2b2" "s1l" "s2l" "s1u" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b2" "s1l" "s1u" "s2l" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b2" "s1l" "s2l" "s1ul" "s1u" "s1c" "s1hint" "s2c" -permutation "s1b" "s2b2" "s1l" "s1u" "s1ul" "s2l" "s1c" "s1hint" "s2c" +permutation s1b s2b2 s1l s2l s1u s1c s1hint s1ul s2c +permutation s1b s2b2 s1l s1u s2l s1c s1hint s1ul s2c +permutation s1b s2b2 s1l s2l s1ul s1u s1c s1hint s2c +permutation s1b s2b2 s1l s1u s1ul s2l s1c s1hint s2c -permutation "s1b" "s2b3" "s1l" "s2l" "s1u" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b3" "s1l" "s1u" "s2l" "s1c" "s1ul" "s2c" -permutation "s1b" "s2b3" "s1l" "s2l" "s1ul" "s1u" "s1c" "s2c" -permutation "s1b" "s2b3" "s1l" "s1u" "s1ul" "s2l" "s1c" "s2c" +permutation s1b s2b3 s1l s2l s1u s1c s1ul s2c +permutation s1b s2b3 s1l s1u s2l s1c s1ul s2c +permutation s1b s2b3 s1l s2l s1ul s1u s1c s2c +permutation s1b s2b3 s1l s1u s1ul s2l s1c s2c -permutation "s1b" "s2b3" "s1l" "s2l" "s1u" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b3" "s1l" "s1u" "s2l" "s1c" "s1hint" "s1ul" "s2c" -permutation "s1b" "s2b3" "s1l" "s2l" "s1ul" "s1u" "s1c" "s1hint" "s2c" -permutation "s1b" "s2b3" "s1l" "s1u" "s1ul" "s2l" "s1c" "s1hint" "s2c" +permutation s1b s2b3 s1l s2l s1u s1c s1hint s1ul s2c +permutation s1b s2b3 s1l s1u s2l s1c s1hint s1ul s2c +permutation s1b s2b3 s1l s2l s1ul s1u s1c s1hint s2c +permutation s1b s2b3 s1l s1u s1ul s2l s1c s1hint s2c diff --git a/src/test/isolation/specs/lock-update-delete.spec b/src/test/isolation/specs/lock-update-delete.spec index b7b796fc019..b9dd7d12a99 100644 --- a/src/test/isolation/specs/lock-update-delete.spec +++ b/src/test/isolation/specs/lock-update-delete.spec @@ -31,31 +31,31 @@ teardown DROP TABLE foo; } -session "s1" +session s1 # obtain lock on the tuple, traversing its update chain -step "s1l" { SELECT * FROM foo WHERE pg_advisory_xact_lock(0) IS NOT NULL AND key = 1 FOR KEY SHARE; } +step s1l { SELECT * FROM foo WHERE pg_advisory_xact_lock(0) IS NOT NULL AND key = 1 FOR KEY SHARE; } -session "s2" +session s2 setup { SELECT pg_advisory_lock(0); } -step "s2b" { BEGIN; } -step "s2u" { UPDATE foo SET value = 2 WHERE key = 1; } -step "s2_blocker1" { DELETE FROM foo; } -step "s2_blocker2" { UPDATE foo SET key = 2 WHERE key = 1; } -step "s2_blocker3" { UPDATE foo SET value = 2 WHERE key = 1; } -step "s2_unlock" { SELECT pg_advisory_unlock(0); } -step "s2c" { COMMIT; } -step "s2r" { ROLLBACK; } +step s2b { BEGIN; } +step s2u { UPDATE foo SET value = 2 WHERE key = 1; } +step s2_blocker1 { DELETE FROM foo; } +step s2_blocker2 { UPDATE foo SET key = 2 WHERE key = 1; } +step s2_blocker3 { UPDATE foo SET value = 2 WHERE key = 1; } +step s2_unlock { SELECT pg_advisory_unlock(0); } +step s2c { COMMIT; } +step s2r { ROLLBACK; } -permutation "s2b" "s1l" "s2u" "s2_blocker1" "s2_unlock" "s2c" -permutation "s2b" "s1l" "s2u" "s2_blocker2" "s2_unlock" "s2c" -permutation "s2b" "s1l" "s2u" "s2_blocker3" "s2_unlock" "s2c" -permutation "s2b" "s1l" "s2u" "s2_blocker1" "s2_unlock" "s2r" -permutation "s2b" "s1l" "s2u" "s2_blocker2" "s2_unlock" "s2r" -permutation "s2b" "s1l" "s2u" "s2_blocker3" "s2_unlock" "s2r" +permutation s2b s1l s2u s2_blocker1 s2_unlock s2c +permutation s2b s1l s2u s2_blocker2 s2_unlock s2c +permutation s2b s1l s2u s2_blocker3 s2_unlock s2c +permutation s2b s1l s2u s2_blocker1 s2_unlock s2r +permutation s2b s1l s2u s2_blocker2 s2_unlock s2r +permutation s2b s1l s2u s2_blocker3 s2_unlock s2r -permutation "s2b" "s1l" "s2u" "s2_blocker1" "s2c" "s2_unlock" -permutation "s2b" "s1l" "s2u" "s2_blocker2" "s2c" "s2_unlock" -permutation "s2b" "s1l" "s2u" "s2_blocker3" "s2c" "s2_unlock" -permutation "s2b" "s1l" "s2u" "s2_blocker1" "s2r" "s2_unlock" -permutation "s2b" "s1l" "s2u" "s2_blocker2" "s2r" "s2_unlock" -permutation "s2b" "s1l" "s2u" "s2_blocker3" "s2r" "s2_unlock" +permutation s2b s1l s2u s2_blocker1 s2c s2_unlock +permutation s2b s1l s2u s2_blocker2 s2c s2_unlock +permutation s2b s1l s2u s2_blocker3 s2c s2_unlock +permutation s2b s1l s2u s2_blocker1 s2r s2_unlock +permutation s2b s1l s2u s2_blocker2 s2r s2_unlock +permutation s2b s1l s2u s2_blocker3 s2r s2_unlock diff --git a/src/test/isolation/specs/lock-update-traversal.spec b/src/test/isolation/specs/lock-update-traversal.spec index 7042b9399cf..a7f83894a44 100644 --- a/src/test/isolation/specs/lock-update-traversal.spec +++ b/src/test/isolation/specs/lock-update-traversal.spec @@ -19,20 +19,20 @@ teardown DROP TABLE foo; } -session "s1" -step "s1b" { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "s1s" { SELECT * FROM foo; } # obtain snapshot -step "s1l" { SELECT * FROM foo FOR KEY SHARE; } # obtain lock -step "s1c" { COMMIT; } +session s1 +step s1b { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step s1s { SELECT * FROM foo; } # obtain snapshot +step s1l { SELECT * FROM foo FOR KEY SHARE; } # obtain lock +step s1c { COMMIT; } -session "s2" -step "s2b" { BEGIN; } -step "s2u" { UPDATE foo SET value = 2 WHERE key = 1; } -step "s2c" { COMMIT; } -step "s2d1" { DELETE FROM foo WHERE key = 1; } -step "s2d2" { UPDATE foo SET key = 3 WHERE key = 1; } -step "s2d3" { UPDATE foo SET value = 3 WHERE key = 1; } +session s2 +step s2b { BEGIN; } +step s2u { UPDATE foo SET value = 2 WHERE key = 1; } +step s2c { COMMIT; } +step s2d1 { DELETE FROM foo WHERE key = 1; } +step s2d2 { UPDATE foo SET key = 3 WHERE key = 1; } +step s2d3 { UPDATE foo SET value = 3 WHERE key = 1; } -permutation "s1b" "s2b" "s1s" "s2u" "s1l" "s2c" "s2d1" "s1c" -permutation "s1b" "s2b" "s1s" "s2u" "s1l" "s2c" "s2d2" "s1c" -permutation "s1b" "s2b" "s1s" "s2u" "s1l" "s2c" "s2d3" "s1c" +permutation s1b s2b s1s s2u s1l s2c s2d1 s1c +permutation s1b s2b s1s s2u s1l s2c s2d2 s1c +permutation s1b s2b s1s s2u s1l s2c s2d3 s1c diff --git a/src/test/isolation/specs/multiple-cic.spec b/src/test/isolation/specs/multiple-cic.spec index 3ac1d39d86d..e34a6b0f9b5 100644 --- a/src/test/isolation/specs/multiple-cic.spec +++ b/src/test/isolation/specs/multiple-cic.spec @@ -22,17 +22,17 @@ teardown DROP FUNCTION unlck(); } -session "s1" -step "s1i" { +session s1 +step s1i { CREATE INDEX CONCURRENTLY mcic_one_pkey ON mcic_one (id) WHERE lck_shr(281457); } teardown { SELECT unlck(); } -session "s2" -step "s2l" { SELECT pg_advisory_lock(281457); } -step "s2i" { +session s2 +step s2l { SELECT pg_advisory_lock(281457); } +step s2i { CREATE INDEX CONCURRENTLY mcic_two_pkey ON mcic_two (id) WHERE unlck(); } @@ -40,4 +40,4 @@ step "s2i" { # (*) marker ensures that s2i is reported as "waiting", even if it # completes very quickly -permutation "s2l" "s1i" "s2i"(*) +permutation s2l s1i s2i(*) diff --git a/src/test/isolation/specs/multiple-row-versions.spec b/src/test/isolation/specs/multiple-row-versions.spec index 1bb5b4e8ba2..0779ea09b8d 100644 --- a/src/test/isolation/specs/multiple-row-versions.spec +++ b/src/test/isolation/specs/multiple-row-versions.spec @@ -19,29 +19,29 @@ teardown DROP TABLE t; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rx1" { SELECT * FROM t WHERE id = 1000000; } +step rx1 { SELECT * FROM t WHERE id = 1000000; } # delay until after T3 commits -step "wz1" { UPDATE t SET txt = 'a' WHERE id = 1; } -step "c1" { COMMIT; } +step wz1 { UPDATE t SET txt = 'a' WHERE id = 1; } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wx2" { UPDATE t SET txt = 'b' WHERE id = 1000000; } -step "c2" { COMMIT; } +step wx2 { UPDATE t SET txt = 'b' WHERE id = 1000000; } +step c2 { COMMIT; } -session "s3" +session s3 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wx3" { UPDATE t SET txt = 'c' WHERE id = 1000000; } -step "ry3" { SELECT * FROM t WHERE id = 500000; } +step wx3 { UPDATE t SET txt = 'c' WHERE id = 1000000; } +step ry3 { SELECT * FROM t WHERE id = 500000; } # delay until after T4 commits -step "c3" { COMMIT; } +step c3 { COMMIT; } -session "s4" +session s4 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wy4" { UPDATE t SET txt = 'd' WHERE id = 500000; } -step "rz4" { SELECT * FROM t WHERE id = 1; } -step "c4" { COMMIT; } +step wy4 { UPDATE t SET txt = 'd' WHERE id = 500000; } +step rz4 { SELECT * FROM t WHERE id = 1; } +step c4 { COMMIT; } -permutation "rx1" "wx2" "c2" "wx3" "ry3" "wy4" "rz4" "c4" "c3" "wz1" "c1" +permutation rx1 wx2 c2 wx3 ry3 wy4 rz4 c4 c3 wz1 c1 diff --git a/src/test/isolation/specs/multixact-no-deadlock.spec b/src/test/isolation/specs/multixact-no-deadlock.spec index 205658b897e..a8af724e58b 100644 --- a/src/test/isolation/specs/multixact-no-deadlock.spec +++ b/src/test/isolation/specs/multixact-no-deadlock.spec @@ -15,21 +15,21 @@ teardown DROP TABLE justthis; } -session "s1" +session s1 setup { BEGIN; } -step "s1lock" { SELECT * FROM justthis FOR SHARE; } -step "s1svpt" { SAVEPOINT foo; } -step "s1lock2" { SELECT * FROM justthis FOR SHARE; } -step "s1c" { COMMIT; } +step s1lock { SELECT * FROM justthis FOR SHARE; } +step s1svpt { SAVEPOINT foo; } +step s1lock2 { SELECT * FROM justthis FOR SHARE; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2lock" { SELECT * FROM justthis FOR SHARE; } # ensure it's a multi -step "s2c" { COMMIT; } +step s2lock { SELECT * FROM justthis FOR SHARE; } # ensure it's a multi +step s2c { COMMIT; } -session "s3" +session s3 setup { BEGIN; } -step "s3lock" { SELECT * FROM justthis FOR UPDATE; } -step "s3c" { COMMIT; } +step s3lock { SELECT * FROM justthis FOR UPDATE; } +step s3c { COMMIT; } -permutation "s1lock" "s2lock" "s1svpt" "s3lock" "s1lock2" "s2c" "s1c" "s3c" +permutation s1lock s2lock s1svpt s3lock s1lock2 s2c s1c s3c diff --git a/src/test/isolation/specs/multixact-no-forget.spec b/src/test/isolation/specs/multixact-no-forget.spec index 7fb93c1e344..7f8a38b51b6 100644 --- a/src/test/isolation/specs/multixact-no-forget.spec +++ b/src/test/isolation/specs/multixact-no-forget.spec @@ -14,31 +14,31 @@ teardown DROP TABLE dont_forget; } -session "s1" +session s1 setup { BEGIN; } -step "s1_show" { SELECT current_setting('default_transaction_isolation') <> 'read committed'; } -step "s1_lock" { SELECT * FROM dont_forget FOR KEY SHARE; } -step "s1_commit" { COMMIT; } +step s1_show { SELECT current_setting('default_transaction_isolation') <> 'read committed'; } +step s1_lock { SELECT * FROM dont_forget FOR KEY SHARE; } +step s1_commit { COMMIT; } -session "s2" -setup { BEGIN; } -step "s2_update" { UPDATE dont_forget SET value = 2; } -step "s2_abort" { ROLLBACK; } -step "s2_commit" { COMMIT; } +session s2 +setup { BEGIN; } +step s2_update { UPDATE dont_forget SET value = 2; } +step s2_abort { ROLLBACK; } +step s2_commit { COMMIT; } -session "s3" +session s3 # try cases with both a non-conflicting lock with s1's and a conflicting one -step "s3_forkeyshr" { SELECT * FROM dont_forget FOR KEY SHARE; } -step "s3_fornokeyupd" { SELECT * FROM dont_forget FOR NO KEY UPDATE; } -step "s3_forupd" { SELECT * FROM dont_forget FOR UPDATE; } +step s3_forkeyshr { SELECT * FROM dont_forget FOR KEY SHARE; } +step s3_fornokeyupd { SELECT * FROM dont_forget FOR NO KEY UPDATE; } +step s3_forupd { SELECT * FROM dont_forget FOR UPDATE; } -permutation "s1_show" "s1_commit" "s2_commit" -permutation "s1_lock" "s2_update" "s2_abort" "s3_forkeyshr" "s1_commit" -permutation "s1_lock" "s2_update" "s2_commit" "s3_forkeyshr" "s1_commit" -permutation "s1_lock" "s2_update" "s1_commit" "s3_forkeyshr" "s2_commit" -permutation "s1_lock" "s2_update" "s2_abort" "s3_fornokeyupd" "s1_commit" -permutation "s1_lock" "s2_update" "s2_commit" "s3_fornokeyupd" "s1_commit" -permutation "s1_lock" "s2_update" "s1_commit" "s3_fornokeyupd" "s2_commit" -permutation "s1_lock" "s2_update" "s2_abort" "s3_forupd" "s1_commit" -permutation "s1_lock" "s2_update" "s2_commit" "s3_forupd" "s1_commit" -permutation "s1_lock" "s2_update" "s1_commit" "s3_forupd" "s2_commit" +permutation s1_show s1_commit s2_commit +permutation s1_lock s2_update s2_abort s3_forkeyshr s1_commit +permutation s1_lock s2_update s2_commit s3_forkeyshr s1_commit +permutation s1_lock s2_update s1_commit s3_forkeyshr s2_commit +permutation s1_lock s2_update s2_abort s3_fornokeyupd s1_commit +permutation s1_lock s2_update s2_commit s3_fornokeyupd s1_commit +permutation s1_lock s2_update s1_commit s3_fornokeyupd s2_commit +permutation s1_lock s2_update s2_abort s3_forupd s1_commit +permutation s1_lock s2_update s2_commit s3_forupd s1_commit +permutation s1_lock s2_update s1_commit s3_forupd s2_commit diff --git a/src/test/isolation/specs/nowait-2.spec b/src/test/isolation/specs/nowait-2.spec index 69ce5edd81a..cf892f2cbec 100644 --- a/src/test/isolation/specs/nowait-2.spec +++ b/src/test/isolation/specs/nowait-2.spec @@ -14,24 +14,24 @@ teardown DROP TABLE foo; } -session "s1" +session s1 setup { BEGIN; } -step "s1a" { SELECT * FROM foo FOR SHARE NOWAIT; } -step "s1b" { COMMIT; } +step s1a { SELECT * FROM foo FOR SHARE NOWAIT; } +step s1b { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2a" { SELECT * FROM foo FOR SHARE NOWAIT; } -step "s2b" { SELECT * FROM foo FOR UPDATE NOWAIT; } -step "s2c" { COMMIT; } +step s2a { SELECT * FROM foo FOR SHARE NOWAIT; } +step s2b { SELECT * FROM foo FOR UPDATE NOWAIT; } +step s2c { COMMIT; } # s1 and s2 both get SHARE lock, creating a multixact lock, then s2 # tries to upgrade to UPDATE but aborts because it cannot acquire a # multi-xact lock -permutation "s1a" "s2a" "s2b" "s1b" "s2c" +permutation s1a s2a s2b s1b s2c # the same but with the SHARE locks acquired in a different order, so # s2 again aborts because it can't acquired a multi-xact lock -permutation "s2a" "s1a" "s2b" "s1b" "s2c" +permutation s2a s1a s2b s1b s2c # s2 acquires SHARE then UPDATE, then s1 tries to acquire SHARE but # can't so aborts because it can't acquire a regular lock -permutation "s2a" "s2b" "s1a" "s1b" "s2c" +permutation s2a s2b s1a s1b s2c diff --git a/src/test/isolation/specs/nowait-3.spec b/src/test/isolation/specs/nowait-3.spec index 9e6b994fddc..06fb7624c3c 100644 --- a/src/test/isolation/specs/nowait-3.spec +++ b/src/test/isolation/specs/nowait-3.spec @@ -14,20 +14,20 @@ teardown DROP TABLE foo; } -session "s1" +session s1 setup { BEGIN; } -step "s1a" { SELECT * FROM foo FOR UPDATE; } -step "s1b" { COMMIT; } +step s1a { SELECT * FROM foo FOR UPDATE; } +step s1b { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2a" { SELECT * FROM foo FOR UPDATE; } -step "s2b" { COMMIT; } +step s2a { SELECT * FROM foo FOR UPDATE; } +step s2b { COMMIT; } -session "s3" +session s3 setup { BEGIN; } -step "s3a" { SELECT * FROM foo FOR UPDATE NOWAIT; } -step "s3b" { COMMIT; } +step s3a { SELECT * FROM foo FOR UPDATE NOWAIT; } +step s3b { COMMIT; } # s3 skips to second record due to tuple lock held by s2 -permutation "s1a" "s2a" "s3a" "s1b" "s2b" "s3b" +permutation s1a s2a s3a s1b s2b s3b diff --git a/src/test/isolation/specs/nowait-4.spec b/src/test/isolation/specs/nowait-4.spec index 48ac777d78a..da80330a62b 100644 --- a/src/test/isolation/specs/nowait-4.spec +++ b/src/test/isolation/specs/nowait-4.spec @@ -14,22 +14,22 @@ teardown DROP TABLE foo; } -session "s1" +session s1 setup { BEGIN; } -step "s1a" { SELECT * FROM foo WHERE pg_advisory_lock(0) IS NOT NULL FOR UPDATE NOWAIT; } -step "s1b" { COMMIT; } +step s1a { SELECT * FROM foo WHERE pg_advisory_lock(0) IS NOT NULL FOR UPDATE NOWAIT; } +step s1b { COMMIT; } -session "s2" -step "s2a" { SELECT pg_advisory_lock(0); } -step "s2b" { UPDATE foo SET data = data; } -step "s2c" { BEGIN; } -step "s2d" { UPDATE foo SET data = data; } -step "s2e" { SELECT pg_advisory_unlock(0); } -step "s2f" { COMMIT; } +session s2 +step s2a { SELECT pg_advisory_lock(0); } +step s2b { UPDATE foo SET data = data; } +step s2c { BEGIN; } +step s2d { UPDATE foo SET data = data; } +step s2e { SELECT pg_advisory_unlock(0); } +step s2f { COMMIT; } # s1 takes a snapshot but then waits on an advisory lock, then s2 # updates the row in one transaction, then again in another without # committing, before allowing s1 to proceed to try to lock a row; # because it has a snapshot that sees the older version, we reach the # waiting code in EvalPlanQualFetch which ereports when in NOWAIT mode. -permutation "s2a" "s1a" "s2b" "s2c" "s2d" "s2e" "s1b" "s2f" +permutation s2a s1a s2b s2c s2d s2e s1b s2f diff --git a/src/test/isolation/specs/nowait-5.spec b/src/test/isolation/specs/nowait-5.spec index 75e9462fc1f..46108de16d4 100644 --- a/src/test/isolation/specs/nowait-5.spec +++ b/src/test/isolation/specs/nowait-5.spec @@ -18,11 +18,11 @@ teardown DROP TABLE test_nowait; } -session "sl1" -step "sl1_prep" { +session sl1 +step sl1_prep { PREPARE sl1_run AS SELECT id FROM test_nowait WHERE pg_advisory_lock(0) is not null FOR UPDATE NOWAIT; } -step "sl1_exec" { +step sl1_exec { BEGIN ISOLATION LEVEL READ COMMITTED; EXECUTE sl1_run; SELECT xmin, xmax, ctid, * FROM test_nowait; @@ -31,22 +31,22 @@ teardown { COMMIT; } # A session that's used for an UPDATE of the rows to be locked, for when we're testing ctid # chain following. -session "upd" -step "upd_getlock" { +session upd +step upd_getlock { SELECT pg_advisory_lock(0); } -step "upd_doupdate" { +step upd_doupdate { BEGIN ISOLATION LEVEL READ COMMITTED; UPDATE test_nowait SET value = value WHERE id % 2 = 0; COMMIT; } -step "upd_releaselock" { +step upd_releaselock { SELECT pg_advisory_unlock(0); } # A session that acquires locks that sl1 is supposed to avoid blocking on -session "lk1" -step "lk1_doforshare" { +session lk1 +step lk1_doforshare { BEGIN ISOLATION LEVEL READ COMMITTED; SELECT id FROM test_nowait WHERE id % 2 = 0 FOR SHARE; } @@ -54,4 +54,4 @@ teardown { COMMIT; } -permutation "sl1_prep" "upd_getlock" "sl1_exec" "upd_doupdate" "lk1_doforshare" "upd_releaselock" +permutation sl1_prep upd_getlock sl1_exec upd_doupdate lk1_doforshare upd_releaselock diff --git a/src/test/isolation/specs/nowait.spec b/src/test/isolation/specs/nowait.spec index 73580cd1b2a..a75e54cc67b 100644 --- a/src/test/isolation/specs/nowait.spec +++ b/src/test/isolation/specs/nowait.spec @@ -14,12 +14,12 @@ teardown DROP TABLE foo; } -session "s1" +session s1 setup { BEGIN; } -step "s1a" { SELECT * FROM foo FOR UPDATE NOWAIT; } -step "s1b" { COMMIT; } +step s1a { SELECT * FROM foo FOR UPDATE NOWAIT; } +step s1b { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2a" { SELECT * FROM foo FOR UPDATE NOWAIT; } -step "s2b" { COMMIT; } +step s2a { SELECT * FROM foo FOR UPDATE NOWAIT; } +step s2b { COMMIT; } diff --git a/src/test/isolation/specs/partial-index.spec b/src/test/isolation/specs/partial-index.spec index 74e72645d97..c0338418a8d 100644 --- a/src/test/isolation/specs/partial-index.spec +++ b/src/test/isolation/specs/partial-index.spec @@ -19,14 +19,14 @@ teardown DROP TABLE test_t; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rxy1" { select * from test_t where val2 = 1; } -step "wx1" { update test_t set val2 = 2 where val2 = 1 and id = 10; } -step "c1" { COMMIT; } +step rxy1 { select * from test_t where val2 = 1; } +step wx1 { update test_t set val2 = 2 where val2 = 1 and id = 10; } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wy2" { update test_t set val2 = 2 where val2 = 1 and id = 9; } -step "rxy2" { select * from test_t where val2 = 1; } -step "c2" { COMMIT; } +step wy2 { update test_t set val2 = 2 where val2 = 1 and id = 9; } +step rxy2 { select * from test_t where val2 = 1; } +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/predicate-lock-hot-tuple.spec b/src/test/isolation/specs/predicate-lock-hot-tuple.spec index d16fb60533b..5b8aecc4ed0 100644 --- a/src/test/isolation/specs/predicate-lock-hot-tuple.spec +++ b/src/test/isolation/specs/predicate-lock-hot-tuple.spec @@ -22,16 +22,16 @@ teardown DROP TABLE test; } -session "s1" -step "b1" { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r1" { SELECT * FROM test WHERE i IN (5, 7) } -step "w1" { UPDATE test SET t = 'pear_xact1' WHERE i = 7 } -step "c1" { COMMIT; } +session s1 +step b1 { BEGIN ISOLATION LEVEL SERIALIZABLE; } +step r1 { SELECT * FROM test WHERE i IN (5, 7) } +step w1 { UPDATE test SET t = 'pear_xact1' WHERE i = 7 } +step c1 { COMMIT; } -session "s2" -step "b2" { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r2" { SELECT * FROM test WHERE i IN (5, 7) } -step "w2" { UPDATE test SET t = 'apple_xact2' WHERE i = 5 } -step "c2" { COMMIT; } +session s2 +step b2 { BEGIN ISOLATION LEVEL SERIALIZABLE; } +step r2 { SELECT * FROM test WHERE i IN (5, 7) } +step w2 { UPDATE test SET t = 'apple_xact2' WHERE i = 5 } +step c2 { COMMIT; } -permutation "b1" "b2" "r1" "r2" "w1" "w2" "c1" "c2" +permutation b1 b2 r1 r2 w1 w2 c1 c2 diff --git a/src/test/isolation/specs/prepared-transactions-cic.spec b/src/test/isolation/specs/prepared-transactions-cic.spec index c39eaf5ad0c..626b1b686a2 100644 --- a/src/test/isolation/specs/prepared-transactions-cic.spec +++ b/src/test/isolation/specs/prepared-transactions-cic.spec @@ -12,26 +12,26 @@ teardown # Sessions for CREATE INDEX CONCURRENTLY test -session "s1" -step "w1" { BEGIN; INSERT INTO cic_test VALUES (1); } -step "p1" { PREPARE TRANSACTION 's1'; } -step "c1" { COMMIT PREPARED 's1'; } +session s1 +step w1 { BEGIN; INSERT INTO cic_test VALUES (1); } +step p1 { PREPARE TRANSACTION 's1'; } +step c1 { COMMIT PREPARED 's1'; } -session "s2" +session s2 # The isolation tester never recognizes that a lock of s1 blocks s2, because a # prepared transaction's locks have no pid associated. While there's a slight # chance of timeout while waiting for an autovacuum-held lock, that wouldn't # change the output. Hence, no timeout is too short. setup { SET lock_timeout = 10; } -step "cic2" +step cic2 { CREATE INDEX CONCURRENTLY on cic_test(a); } -step "r2" +step r2 { SET enable_seqscan to off; SET enable_bitmapscan to off; SELECT * FROM cic_test WHERE a = 1; } -permutation "w1" "p1" "cic2" "c1" "r2" +permutation w1 p1 cic2 c1 r2 diff --git a/src/test/isolation/specs/prepared-transactions.spec b/src/test/isolation/specs/prepared-transactions.spec index bb9e154e6ea..78b9d2c84ef 100644 --- a/src/test/isolation/specs/prepared-transactions.spec +++ b/src/test/isolation/specs/prepared-transactions.spec @@ -32,30 +32,30 @@ teardown } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; INSERT INTO test1 VALUES (1); } -step "r1" { SELECT * FROM test2; } -step "p1" { PREPARE TRANSACTION 's1'; } -step "c1" { COMMIT PREPARED 's1'; } +step r1 { SELECT * FROM test2; } +step p1 { PREPARE TRANSACTION 's1'; } +step c1 { COMMIT PREPARED 's1'; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; SELECT * FROM force_snapshot; } -step "r2" { SELECT * FROM test3; } -step "w2" { INSERT INTO test2 VALUES (2); } -step "p2" { PREPARE TRANSACTION 's2'; } -step "c2" { COMMIT PREPARED 's2'; } +step r2 { SELECT * FROM test3; } +step w2 { INSERT INTO test2 VALUES (2); } +step p2 { PREPARE TRANSACTION 's2'; } +step c2 { COMMIT PREPARED 's2'; } -session "s3" +session s3 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; SELECT * FROM force_snapshot; } -step "w3" { INSERT INTO test3 VALUES (3); } -step "p3" { PREPARE TRANSACTION 's3'; } -step "c3" { COMMIT PREPARED 's3'; } +step w3 { INSERT INTO test3 VALUES (3); } +step p3 { PREPARE TRANSACTION 's3'; } +step c3 { COMMIT PREPARED 's3'; } # When run at the end of the permutations below, this SELECT statement # should never return any tuples, because at least one of the three # transactions involved should be aborted. -session "s4" -step "check" { SELECT * FROM test1,test2,test3; } +session s4 +step check { SELECT * FROM test1,test2,test3; } # We run on all permutations of the statements above subject to the # following constraints: @@ -73,1435 +73,1435 @@ step "check" { SELECT * FROM test1,test2,test3; } # This eliminates some redundant combinations. For example, it doesn't # matter if w2 happens before w3 as long as both come before the # conflicting reads. -permutation "r1" "r2" "w2" "w3" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "r2" "w2" "w3" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "r2" "w2" "w3" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "r2" "w2" "p1" "w3" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "p1" "w3" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "p1" "w3" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "p1" "w3" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "p1" "w3" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "r2" "w2" "p1" "w3" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "r2" "w2" "p1" "w3" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "r2" "w2" "p1" "p2" "w3" "p3" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "p1" "p2" "w3" "p3" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "p2" "w3" "p1" "p3" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "p2" "w3" "p1" "p3" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "p2" "w3" "p3" "p1" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "p2" "w3" "p3" "p1" "c3" "c2" "c1" "check" -permutation "r1" "r2" "w2" "p2" "w3" "p3" "c3" "p1" "c1" "c2" "check" -permutation "r1" "r2" "w2" "p2" "w3" "p3" "c3" "p1" "c2" "c1" "check" -permutation "r1" "r2" "w2" "p2" "w3" "p3" "c3" "c2" "p1" "c1" "check" -permutation "r1" "r2" "w2" "p2" "p1" "w3" "p3" "c3" "c1" "c2" "check" -permutation "r1" "r2" "w2" "p2" "p1" "w3" "p3" "c3" "c2" "c1" "check" -permutation "r1" "r2" "p1" "w2" "w3" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "r2" "p1" "w2" "w3" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "r2" "p1" "w2" "w3" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "r2" "p1" "w2" "w3" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "r2" "p1" "w2" "w3" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "r2" "p1" "w2" "w3" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "r2" "p1" "w2" "w3" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "r2" "p1" "w2" "p2" "w3" "p3" "c3" "c1" "c2" "check" -permutation "r1" "r2" "p1" "w2" "p2" "w3" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w2" "w3" "r2" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w2" "w3" "r2" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w2" "w3" "p1" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p1" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p1" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p1" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p1" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p1" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p1" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p1" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p1" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p1" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p1" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p1" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p1" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p1" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p1" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p1" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "r2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w2" "w3" "p3" "r2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "r2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "r2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "r2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w2" "w3" "p3" "p1" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "p1" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "p1" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "p1" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "p1" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p3" "p1" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "p1" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "p1" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p3" "p1" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p3" "c3" "r2" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "c3" "r2" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "c3" "r2" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p3" "c3" "r2" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "c3" "r2" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "c3" "r2" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w2" "w3" "p3" "c3" "p1" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w2" "w3" "p3" "c3" "p1" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w2" "w3" "p3" "c3" "p1" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w2" "w3" "p3" "c3" "p1" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w2" "p1" "w3" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w2" "p1" "w3" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w2" "p1" "w3" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w2" "p1" "w3" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w2" "p1" "w3" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w2" "p1" "w3" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w2" "p1" "w3" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w2" "p1" "w3" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w2" "p1" "w3" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w2" "p1" "w3" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w2" "p1" "w3" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w2" "p1" "w3" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w2" "p1" "w3" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w2" "p1" "w3" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w2" "p1" "w3" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w2" "p1" "w3" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "r2" "w2" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "r2" "w2" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "r2" "p1" "w2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p1" "w2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p1" "w2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p1" "w2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p1" "w2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p1" "w2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p1" "w2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p1" "p3" "w2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p1" "p3" "w2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p1" "p3" "w2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p1" "p3" "w2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p1" "p3" "w2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p1" "p3" "c3" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p1" "p3" "c3" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p1" "p3" "c3" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p1" "p3" "c3" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "w2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w3" "r2" "p3" "w2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "w2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "w2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "w2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "r2" "p3" "p1" "w2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "p1" "w2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "p1" "w2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "p1" "w2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "p1" "w2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p3" "p1" "c3" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "p1" "c3" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "p1" "c3" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p3" "p1" "c3" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p3" "c3" "w2" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "c3" "w2" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "c3" "w2" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p3" "c3" "w2" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "c3" "w2" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "c3" "w2" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "r2" "p3" "c3" "p1" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "r2" "p3" "c3" "p1" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "r2" "p3" "c3" "p1" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "r2" "p3" "c3" "p1" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "w2" "r2" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "w2" "r2" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "w2" "p1" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p1" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p1" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p1" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p1" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p1" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p1" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p1" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p1" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p1" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p1" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p1" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p1" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p1" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p1" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p1" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "r2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w3" "w2" "p3" "r2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "r2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "r2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "r2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "w2" "p3" "p1" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "p1" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "p1" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "p1" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "p1" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p3" "p1" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "p1" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "p1" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p3" "p1" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p3" "c3" "r2" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "c3" "r2" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "c3" "r2" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p3" "c3" "r2" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "c3" "r2" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "c3" "r2" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "w2" "p3" "c3" "p1" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "w2" "p3" "c3" "p1" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "w2" "p3" "c3" "p1" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "w2" "p3" "c3" "p1" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p1" "r2" "w2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p1" "r2" "w2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p1" "r2" "w2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p1" "r2" "w2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p1" "r2" "w2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "r2" "w2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "r2" "w2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "r2" "p3" "w2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p1" "r2" "p3" "w2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p1" "r2" "p3" "w2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "r2" "p3" "w2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "r2" "p3" "w2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "r2" "p3" "c3" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "r2" "p3" "c3" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "r2" "p3" "c3" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "r2" "p3" "c3" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p1" "w2" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p1" "w2" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p1" "w2" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p1" "w2" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p1" "w2" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "w2" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "w2" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "w2" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p1" "w2" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p1" "w2" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "w2" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "w2" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "w2" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "w2" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "w2" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "w2" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "r2" "w2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p1" "p3" "r2" "w2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p1" "p3" "r2" "w2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "p3" "r2" "w2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "p3" "r2" "w2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "r2" "c3" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "p3" "r2" "c3" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "p3" "r2" "c3" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "r2" "c3" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "w2" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p1" "p3" "w2" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p1" "p3" "w2" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "p3" "w2" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "p3" "w2" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "w2" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "p3" "w2" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "p3" "w2" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "w2" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "c3" "r2" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "p3" "c3" "r2" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "p3" "c3" "r2" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "c3" "r2" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "c3" "w2" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p1" "p3" "c3" "w2" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p1" "p3" "c3" "w2" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "c3" "w2" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "c3" "c1" "r2" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p1" "p3" "c3" "c1" "w2" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "w2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w3" "p3" "r2" "w2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "w2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "w2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "w2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "p3" "r2" "p1" "w2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "p1" "w2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "p1" "w2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "p1" "w2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "p1" "w2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "r2" "p1" "c3" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "p1" "c3" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "p1" "c3" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "r2" "p1" "c3" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "r2" "c3" "w2" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "c3" "w2" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "c3" "w2" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "r2" "c3" "w2" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "c3" "w2" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "c3" "w2" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "p3" "r2" "c3" "p1" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "r2" "c3" "p1" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "r2" "c3" "p1" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "r2" "c3" "p1" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "r2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "r1" "w3" "p3" "w2" "r2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "r2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "r2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "r2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "p3" "w2" "p1" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "p1" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "p1" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "p1" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "p1" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "w2" "p1" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "p1" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "p1" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "w2" "p1" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "w2" "c3" "r2" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "c3" "r2" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "c3" "r2" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "w2" "c3" "r2" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "c3" "r2" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "c3" "r2" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "p3" "w2" "c3" "p1" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "w2" "c3" "p1" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "w2" "c3" "p1" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "w2" "c3" "p1" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "r2" "w2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p3" "p1" "r2" "w2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p3" "p1" "r2" "w2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "p1" "r2" "w2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "p1" "r2" "w2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "r2" "c3" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "p1" "r2" "c3" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "p1" "r2" "c3" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "r2" "c3" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "w2" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "w3" "p3" "p1" "w2" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "w3" "p3" "p1" "w2" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "p1" "w2" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "p1" "w2" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "w2" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "p1" "w2" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "p1" "w2" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "w2" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "c3" "r2" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "p1" "c3" "r2" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "p1" "c3" "r2" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "c3" "r2" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "c3" "w2" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "p1" "c3" "w2" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "p1" "c3" "w2" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "c3" "w2" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "c3" "c1" "r2" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "p1" "c3" "c1" "w2" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "r2" "w2" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "c3" "r2" "w2" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "c3" "r2" "w2" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "r2" "w2" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "p3" "c3" "r2" "w2" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "p3" "c3" "r2" "w2" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "p3" "c3" "r2" "p1" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "c3" "r2" "p1" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "c3" "r2" "p1" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "r2" "p1" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "w2" "r2" "p1" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "c3" "w2" "r2" "p1" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "c3" "w2" "r2" "p1" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "w2" "r2" "p2" "p1" "c1" "c2" "check" -permutation "r1" "w3" "p3" "c3" "w2" "r2" "p2" "p1" "c2" "c1" "check" -permutation "r1" "w3" "p3" "c3" "w2" "r2" "p2" "c2" "p1" "c1" "check" -permutation "r1" "w3" "p3" "c3" "w2" "p1" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "c3" "w2" "p1" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "c3" "w2" "p1" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "w2" "p1" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "p1" "r2" "w2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "c3" "p1" "r2" "w2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "c3" "p1" "r2" "w2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "p1" "r2" "c1" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "p1" "w2" "r2" "p2" "c1" "c2" "check" -permutation "r1" "w3" "p3" "c3" "p1" "w2" "r2" "p2" "c2" "c1" "check" -permutation "r1" "w3" "p3" "c3" "p1" "w2" "r2" "c1" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "p1" "w2" "c1" "r2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "p1" "c1" "r2" "w2" "p2" "c2" "check" -permutation "r1" "w3" "p3" "c3" "p1" "c1" "w2" "r2" "p2" "c2" "check" -permutation "r1" "p1" "r2" "w2" "w3" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "p1" "r2" "w2" "w3" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "p1" "r2" "w2" "w3" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "r2" "w2" "w3" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "r2" "w2" "w3" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "r2" "w2" "w3" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "r2" "w2" "w3" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "r2" "w2" "p2" "w3" "p3" "c3" "c1" "c2" "check" -permutation "r1" "p1" "r2" "w2" "p2" "w3" "p3" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w2" "w3" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w2" "w3" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w2" "w3" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w2" "w3" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w2" "w3" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w2" "w3" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w2" "w3" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w2" "w3" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w2" "w3" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w2" "w3" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w2" "w3" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w2" "w3" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w2" "w3" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w2" "w3" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w2" "w3" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w2" "w3" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "p1" "w3" "r2" "w2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w3" "r2" "w2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w3" "r2" "w2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w3" "r2" "w2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w3" "r2" "w2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "r2" "w2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "r2" "w2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "r2" "p3" "w2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w3" "r2" "p3" "w2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w3" "r2" "p3" "w2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "r2" "p3" "w2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "r2" "p3" "w2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "r2" "p3" "c3" "w2" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "r2" "p3" "c3" "w2" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "r2" "p3" "c3" "w2" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "r2" "p3" "c3" "c1" "w2" "p2" "c2" "check" -permutation "r1" "p1" "w3" "w2" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w3" "w2" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w3" "w2" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w3" "w2" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w3" "w2" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "w2" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "w2" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "w2" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w3" "w2" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w3" "w2" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "w2" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "w2" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "w2" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "w2" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "w2" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "w2" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "r2" "w2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w3" "p3" "r2" "w2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w3" "p3" "r2" "w2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "p3" "r2" "w2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "p3" "r2" "w2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "r2" "c3" "w2" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "p3" "r2" "c3" "w2" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "p3" "r2" "c3" "w2" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "r2" "c3" "c1" "w2" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "w2" "r2" "p2" "c3" "c1" "c2" "check" -permutation "r1" "p1" "w3" "p3" "w2" "r2" "p2" "c3" "c2" "c1" "check" -permutation "r1" "p1" "w3" "p3" "w2" "r2" "c3" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "p3" "w2" "r2" "c3" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "p3" "w2" "r2" "c3" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "w2" "c3" "r2" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "p3" "w2" "c3" "r2" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "p3" "w2" "c3" "r2" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "w2" "c3" "c1" "r2" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "c3" "r2" "w2" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "p3" "c3" "r2" "w2" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "p3" "c3" "r2" "w2" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "c3" "r2" "c1" "w2" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "c3" "w2" "r2" "p2" "c1" "c2" "check" -permutation "r1" "p1" "w3" "p3" "c3" "w2" "r2" "p2" "c2" "c1" "check" -permutation "r1" "p1" "w3" "p3" "c3" "w2" "r2" "c1" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "c3" "w2" "c1" "r2" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "c3" "c1" "r2" "w2" "p2" "c2" "check" -permutation "r1" "p1" "w3" "p3" "c3" "c1" "w2" "r2" "p2" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w2" "r1" "r2" "w3" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w2" "r1" "r2" "w3" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w2" "r1" "r2" "p1" "w3" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "p1" "w3" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "p1" "w3" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "p1" "w3" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "p1" "w3" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "r2" "p1" "w3" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "r2" "p1" "w3" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "r2" "p1" "p2" "w3" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "p1" "p2" "w3" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "p2" "w3" "p1" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "p2" "w3" "p1" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "p2" "w3" "p3" "p1" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "p2" "w3" "p3" "p1" "c3" "c2" "c1" "check" -permutation "w2" "r1" "r2" "p2" "w3" "p3" "c3" "p1" "c1" "c2" "check" -permutation "w2" "r1" "r2" "p2" "w3" "p3" "c3" "p1" "c2" "c1" "check" -permutation "w2" "r1" "r2" "p2" "w3" "p3" "c3" "c2" "p1" "c1" "check" -permutation "w2" "r1" "r2" "p2" "p1" "w3" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "r2" "p2" "p1" "w3" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w2" "r1" "w3" "r2" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w2" "r1" "w3" "r2" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w2" "r1" "w3" "p1" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p1" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p1" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p1" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p1" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p1" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p1" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p1" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p1" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p1" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p1" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p1" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p1" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p1" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p1" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p1" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "r2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w2" "r1" "w3" "p3" "r2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "r2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "r2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "r2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w2" "r1" "w3" "p3" "p1" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "p1" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "p1" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "p1" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "p1" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p3" "p1" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "p1" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "p1" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p3" "p1" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p3" "c3" "r2" "p1" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "c3" "r2" "p1" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "c3" "r2" "p1" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p3" "c3" "r2" "p2" "p1" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "c3" "r2" "p2" "p1" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "c3" "r2" "p2" "c2" "p1" "c1" "check" -permutation "w2" "r1" "w3" "p3" "c3" "p1" "r2" "p2" "c1" "c2" "check" -permutation "w2" "r1" "w3" "p3" "c3" "p1" "r2" "p2" "c2" "c1" "check" -permutation "w2" "r1" "w3" "p3" "c3" "p1" "r2" "c1" "p2" "c2" "check" -permutation "w2" "r1" "w3" "p3" "c3" "p1" "c1" "r2" "p2" "c2" "check" -permutation "w2" "r1" "p1" "r2" "w3" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "p1" "r2" "w3" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "p1" "r2" "w3" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "p1" "r2" "w3" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "p1" "r2" "w3" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "p1" "r2" "w3" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "p1" "r2" "w3" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "p1" "r2" "p2" "w3" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "p1" "r2" "p2" "w3" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "p1" "w3" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w2" "r1" "p1" "w3" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w2" "r1" "p1" "w3" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "p1" "w3" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "p1" "w3" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "p1" "w3" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "p1" "w3" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "p1" "w3" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w2" "r1" "p1" "w3" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w2" "r1" "p1" "w3" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w2" "r1" "p1" "w3" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w2" "r1" "p1" "w3" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w2" "r1" "p1" "w3" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w2" "r1" "p1" "w3" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w2" "r1" "p1" "w3" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w2" "r1" "p1" "w3" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "r2" "w2" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "r2" "w2" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "r2" "p1" "w2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p1" "w2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p1" "w2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p1" "w2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p1" "w2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p1" "w2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p1" "w2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p1" "p3" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p1" "p3" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p1" "p3" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p1" "p3" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p1" "p3" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p1" "p3" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p1" "p3" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p1" "p3" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p1" "p3" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "w2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r1" "r2" "p3" "w2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "w2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "w2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "w2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "r2" "p3" "p1" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "p1" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "p1" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "p1" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "p1" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p3" "p1" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "p1" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "p1" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p3" "p1" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p3" "c3" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "c3" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "c3" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p3" "c3" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "c3" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "c3" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "r2" "p3" "c3" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "r2" "p3" "c3" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "r2" "p3" "c3" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "r2" "p3" "c3" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "w2" "r2" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "w2" "r2" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "w2" "p1" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p1" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p1" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p1" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p1" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p1" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p1" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p1" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p1" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p1" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p1" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p1" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p1" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p1" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p1" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p1" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "r2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r1" "w2" "p3" "r2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "r2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "r2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "r2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "w2" "p3" "p1" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "p1" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "p1" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "p1" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "p1" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p3" "p1" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "p1" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "p1" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p3" "p1" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p3" "c3" "r2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "c3" "r2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "c3" "r2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p3" "c3" "r2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "c3" "r2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "c3" "r2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "w2" "p3" "c3" "p1" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "w2" "p3" "c3" "p1" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "w2" "p3" "c3" "p1" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "w2" "p3" "c3" "p1" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p1" "r2" "w2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p1" "r2" "w2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p1" "r2" "w2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p1" "r2" "w2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p1" "r2" "w2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "r2" "w2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "r2" "w2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "r2" "p3" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p1" "r2" "p3" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p1" "r2" "p3" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "r2" "p3" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "r2" "p3" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "r2" "p3" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "r2" "p3" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "r2" "p3" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "r2" "p3" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p1" "w2" "r2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p1" "w2" "r2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p1" "w2" "r2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p1" "w2" "r2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p1" "w2" "r2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "w2" "r2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "w2" "r2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "w2" "p3" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p1" "w2" "p3" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p1" "w2" "p3" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "w2" "p3" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "w2" "p3" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "w2" "p3" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "w2" "p3" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "w2" "p3" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "w2" "p3" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "r2" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p1" "p3" "r2" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p1" "p3" "r2" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "p3" "r2" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "p3" "r2" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "r2" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "p3" "r2" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "p3" "r2" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "r2" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "w2" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p1" "p3" "w2" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p1" "p3" "w2" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "p3" "w2" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "p3" "w2" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "w2" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "p3" "w2" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "p3" "w2" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "w2" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "c3" "r2" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "p3" "c3" "r2" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "p3" "c3" "r2" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "c3" "r2" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "c3" "w2" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p1" "p3" "c3" "w2" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p1" "p3" "c3" "w2" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "c3" "w2" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "c3" "c1" "r2" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p1" "p3" "c3" "c1" "w2" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "w2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r1" "p3" "r2" "w2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "w2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "w2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "w2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "p3" "r2" "p1" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "p1" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "p1" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "p1" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "p1" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "r2" "p1" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "p1" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "p1" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "r2" "p1" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "r2" "c3" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "c3" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "c3" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "r2" "c3" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "c3" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "c3" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "p3" "r2" "c3" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "r2" "c3" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "r2" "c3" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "r2" "c3" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "r2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r1" "p3" "w2" "r2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "r2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "r2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "r2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "p3" "w2" "p1" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "p1" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "p1" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "p1" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "p1" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "w2" "p1" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "p1" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "p1" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "w2" "p1" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "w2" "c3" "r2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "c3" "r2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "c3" "r2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "w2" "c3" "r2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "c3" "r2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "c3" "r2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "p3" "w2" "c3" "p1" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "w2" "c3" "p1" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "w2" "c3" "p1" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "w2" "c3" "p1" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "r2" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p3" "p1" "r2" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p3" "p1" "r2" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "p1" "r2" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "p1" "r2" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "r2" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "p1" "r2" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "p1" "r2" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "r2" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "w2" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r1" "p3" "p1" "w2" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r1" "p3" "p1" "w2" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "p1" "w2" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "p1" "w2" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "w2" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "p1" "w2" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "p1" "w2" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "w2" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "c3" "r2" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "p1" "c3" "r2" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "p1" "c3" "r2" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "c3" "r2" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "c3" "w2" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "p1" "c3" "w2" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "p1" "c3" "w2" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "c3" "w2" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "c3" "c1" "r2" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "p1" "c3" "c1" "w2" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "r2" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "c3" "r2" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "c3" "r2" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "r2" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "p3" "c3" "r2" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "p3" "c3" "r2" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "p3" "c3" "r2" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "c3" "r2" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "c3" "r2" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "r2" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "w2" "r2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "c3" "w2" "r2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "c3" "w2" "r2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "w2" "r2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r1" "p3" "c3" "w2" "r2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r1" "p3" "c3" "w2" "r2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r1" "p3" "c3" "w2" "p1" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "c3" "w2" "p1" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "c3" "w2" "p1" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "w2" "p1" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "p1" "r2" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "c3" "p1" "r2" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "c3" "p1" "r2" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "p1" "r2" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "p1" "w2" "r2" "p2" "c1" "c2" "check" -permutation "w3" "r1" "p3" "c3" "p1" "w2" "r2" "p2" "c2" "c1" "check" -permutation "w3" "r1" "p3" "c3" "p1" "w2" "r2" "c1" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "p1" "w2" "c1" "r2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "p1" "c1" "r2" "w2" "p2" "c2" "check" -permutation "w3" "r1" "p3" "c3" "p1" "c1" "w2" "r2" "p2" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p1" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p1" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p1" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p1" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p1" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p1" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p1" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p2" "p1" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p2" "p1" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p2" "p3" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p2" "p3" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p2" "p3" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p2" "p3" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p2" "p3" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p3" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p3" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p3" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p3" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p3" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r2" "r1" "w2" "p3" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r2" "r1" "w2" "p3" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r2" "r1" "p1" "w2" "p2" "p3" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p1" "w2" "p2" "p3" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p1" "w2" "p3" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p1" "w2" "p3" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p1" "w2" "p3" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p1" "w2" "p3" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p1" "w2" "p3" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p1" "p3" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p1" "p3" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p1" "p3" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p1" "p3" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p1" "p3" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p1" "p3" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p1" "p3" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p1" "p3" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p1" "p3" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "w2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r2" "r1" "p3" "w2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "w2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "w2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "w2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r2" "r1" "p3" "p1" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "p1" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "p1" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "p1" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "p1" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p3" "p1" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "p1" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "p1" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p3" "p1" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p3" "c3" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "c3" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "c3" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p3" "c3" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "c3" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "c3" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r2" "r1" "p3" "c3" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r2" "r1" "p3" "c3" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r2" "r1" "p3" "c3" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r2" "r1" "p3" "c3" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "w2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "r2" "p3" "r1" "w2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "w2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "w2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "w2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r2" "p3" "r1" "p1" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "p1" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "p1" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "p1" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "p1" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "r2" "p3" "r1" "p1" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "p1" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "p1" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r2" "p3" "r1" "p1" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r2" "p3" "r1" "c3" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "c3" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "c3" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r2" "p3" "r1" "c3" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "c3" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "c3" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r2" "p3" "r1" "c3" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r2" "p3" "r1" "c3" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r2" "p3" "r1" "c3" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r2" "p3" "r1" "c3" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "r2" "p3" "c3" "r1" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "r2" "p3" "c3" "r1" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "r2" "p3" "c3" "r1" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "r2" "p3" "c3" "r1" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "r2" "p3" "c3" "r1" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "r2" "p3" "c3" "r1" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "r2" "p3" "c3" "r1" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "r2" "p3" "c3" "r1" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "r2" "p3" "c3" "r1" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "r2" "p3" "c3" "r1" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "w2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r1" "r2" "w2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "w2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "w2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "w2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r1" "r2" "p1" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "p1" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "p1" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "p1" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "p1" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "r2" "p1" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "p1" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "p1" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "r2" "p1" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "r2" "c3" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "c3" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "c3" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "r2" "c3" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "c3" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "c3" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r1" "r2" "c3" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "r2" "c3" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "r2" "c3" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "r2" "c3" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "r2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r1" "w2" "r2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "r2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "r2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "r2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r1" "w2" "p1" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "p1" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "p1" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "p1" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "p1" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "w2" "p1" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "p1" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "p1" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "w2" "p1" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "w2" "c3" "r2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "c3" "r2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "c3" "r2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "w2" "c3" "r2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "c3" "r2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "c3" "r2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r1" "w2" "c3" "p1" "r2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "w2" "c3" "p1" "r2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "w2" "c3" "p1" "r2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "w2" "c3" "p1" "c1" "r2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "r2" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r1" "p1" "r2" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r1" "p1" "r2" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "p1" "r2" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "p1" "r2" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "r2" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "p1" "r2" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "p1" "r2" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "r2" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "w2" "r2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r1" "p1" "w2" "r2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r1" "p1" "w2" "r2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "p1" "w2" "r2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "p1" "w2" "r2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "w2" "c3" "r2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "p1" "w2" "c3" "r2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "p1" "w2" "c3" "r2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "w2" "c3" "c1" "r2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "c3" "r2" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "p1" "c3" "r2" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "p1" "c3" "r2" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "c3" "r2" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "c3" "w2" "r2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "p1" "c3" "w2" "r2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "p1" "c3" "w2" "r2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "c3" "w2" "c1" "r2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "c3" "c1" "r2" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "p1" "c3" "c1" "w2" "r2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "r2" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "c3" "r2" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "c3" "r2" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "r2" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r1" "c3" "r2" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r1" "c3" "r2" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r1" "c3" "r2" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "c3" "r2" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "c3" "r2" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "r2" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "w2" "r2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "c3" "w2" "r2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "c3" "w2" "r2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "w2" "r2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r1" "c3" "w2" "r2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r1" "c3" "w2" "r2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r1" "c3" "w2" "p1" "r2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "c3" "w2" "p1" "r2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "c3" "w2" "p1" "r2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "w2" "p1" "c1" "r2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "p1" "r2" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "c3" "p1" "r2" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "c3" "p1" "r2" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "p1" "r2" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "p1" "w2" "r2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r1" "c3" "p1" "w2" "r2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r1" "c3" "p1" "w2" "r2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "p1" "w2" "c1" "r2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "p1" "c1" "r2" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r1" "c3" "p1" "c1" "w2" "r2" "p2" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p1" "p2" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p1" "p2" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p1" "c3" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p1" "c3" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p1" "c3" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p2" "p1" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p2" "p1" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p2" "c3" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p2" "c3" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "w2" "p2" "c3" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r2" "r1" "w2" "c3" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "c3" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "w2" "c3" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "c3" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "w2" "c3" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "w2" "c3" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r2" "r1" "p1" "w2" "p2" "c3" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "p1" "w2" "p2" "c3" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "p1" "w2" "c3" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "p1" "w2" "c3" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "p1" "w2" "c3" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r2" "r1" "p1" "c3" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "p1" "c3" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "p1" "c3" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r2" "r1" "p1" "c3" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r2" "r1" "c3" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "c3" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "c3" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r2" "r1" "c3" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "c3" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "c3" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r2" "r1" "c3" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r2" "r1" "c3" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r2" "r1" "c3" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r2" "r1" "c3" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "r2" "c3" "r1" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r2" "c3" "r1" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r2" "c3" "r1" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r2" "c3" "r1" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "r2" "c3" "r1" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "r2" "c3" "r1" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "r2" "c3" "r1" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "r2" "c3" "r1" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "r2" "c3" "r1" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "r2" "c3" "r1" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "r2" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r1" "r2" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r1" "r2" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "r2" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r1" "r2" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r1" "r2" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "c3" "r1" "r2" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r1" "r2" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r1" "r2" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "r2" "p1" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "w2" "r2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r1" "w2" "r2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r1" "w2" "r2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "w2" "r2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r1" "w2" "r2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r1" "w2" "r2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "c3" "r1" "w2" "p1" "r2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r1" "w2" "p1" "r2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r1" "w2" "p1" "r2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "w2" "p1" "c1" "r2" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "p1" "r2" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r1" "p1" "r2" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r1" "p1" "r2" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "p1" "r2" "c1" "w2" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "p1" "w2" "r2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r1" "p1" "w2" "r2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r1" "p1" "w2" "r2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "p1" "w2" "c1" "r2" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "p1" "c1" "r2" "w2" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r1" "p1" "c1" "w2" "r2" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r2" "r1" "w2" "p1" "p2" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r2" "r1" "w2" "p1" "p2" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r2" "r1" "w2" "p1" "c1" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r2" "r1" "w2" "p2" "p1" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r2" "r1" "w2" "p2" "p1" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r2" "r1" "w2" "p2" "c2" "p1" "c1" "check" -permutation "w3" "p3" "c3" "r2" "r1" "p1" "w2" "p2" "c1" "c2" "check" -permutation "w3" "p3" "c3" "r2" "r1" "p1" "w2" "p2" "c2" "c1" "check" -permutation "w3" "p3" "c3" "r2" "r1" "p1" "w2" "c1" "p2" "c2" "check" -permutation "w3" "p3" "c3" "r2" "r1" "p1" "c1" "w2" "p2" "c2" "check" +permutation r1 r2 w2 w3 p1 p2 p3 c3 c1 c2 check +permutation r1 r2 w2 w3 p1 p2 p3 c3 c2 c1 check +permutation r1 r2 w2 w3 p1 p3 p2 c3 c1 c2 check +permutation r1 r2 w2 w3 p1 p3 p2 c3 c2 c1 check +permutation r1 r2 w2 w3 p1 p3 c3 p2 c1 c2 check +permutation r1 r2 w2 w3 p1 p3 c3 p2 c2 c1 check +permutation r1 r2 w2 w3 p1 p3 c3 c1 p2 c2 check +permutation r1 r2 w2 w3 p2 p1 p3 c3 c1 c2 check +permutation r1 r2 w2 w3 p2 p1 p3 c3 c2 c1 check +permutation r1 r2 w2 w3 p2 p3 p1 c3 c1 c2 check +permutation r1 r2 w2 w3 p2 p3 p1 c3 c2 c1 check +permutation r1 r2 w2 w3 p2 p3 c3 p1 c1 c2 check +permutation r1 r2 w2 w3 p2 p3 c3 p1 c2 c1 check +permutation r1 r2 w2 w3 p2 p3 c3 c2 p1 c1 check +permutation r1 r2 w2 w3 p3 p1 p2 c3 c1 c2 check +permutation r1 r2 w2 w3 p3 p1 p2 c3 c2 c1 check +permutation r1 r2 w2 w3 p3 p1 c3 p2 c1 c2 check +permutation r1 r2 w2 w3 p3 p1 c3 p2 c2 c1 check +permutation r1 r2 w2 w3 p3 p1 c3 c1 p2 c2 check +permutation r1 r2 w2 w3 p3 p2 p1 c3 c1 c2 check +permutation r1 r2 w2 w3 p3 p2 p1 c3 c2 c1 check +permutation r1 r2 w2 w3 p3 p2 c3 p1 c1 c2 check +permutation r1 r2 w2 w3 p3 p2 c3 p1 c2 c1 check +permutation r1 r2 w2 w3 p3 p2 c3 c2 p1 c1 check +permutation r1 r2 w2 w3 p3 c3 p1 p2 c1 c2 check +permutation r1 r2 w2 w3 p3 c3 p1 p2 c2 c1 check +permutation r1 r2 w2 w3 p3 c3 p1 c1 p2 c2 check +permutation r1 r2 w2 w3 p3 c3 p2 p1 c1 c2 check +permutation r1 r2 w2 w3 p3 c3 p2 p1 c2 c1 check +permutation r1 r2 w2 w3 p3 c3 p2 c2 p1 c1 check +permutation r1 r2 w2 p1 w3 p2 p3 c3 c1 c2 check +permutation r1 r2 w2 p1 w3 p2 p3 c3 c2 c1 check +permutation r1 r2 w2 p1 w3 p3 p2 c3 c1 c2 check +permutation r1 r2 w2 p1 w3 p3 p2 c3 c2 c1 check +permutation r1 r2 w2 p1 w3 p3 c3 p2 c1 c2 check +permutation r1 r2 w2 p1 w3 p3 c3 p2 c2 c1 check +permutation r1 r2 w2 p1 w3 p3 c3 c1 p2 c2 check +permutation r1 r2 w2 p1 p2 w3 p3 c3 c1 c2 check +permutation r1 r2 w2 p1 p2 w3 p3 c3 c2 c1 check +permutation r1 r2 w2 p2 w3 p1 p3 c3 c1 c2 check +permutation r1 r2 w2 p2 w3 p1 p3 c3 c2 c1 check +permutation r1 r2 w2 p2 w3 p3 p1 c3 c1 c2 check +permutation r1 r2 w2 p2 w3 p3 p1 c3 c2 c1 check +permutation r1 r2 w2 p2 w3 p3 c3 p1 c1 c2 check +permutation r1 r2 w2 p2 w3 p3 c3 p1 c2 c1 check +permutation r1 r2 w2 p2 w3 p3 c3 c2 p1 c1 check +permutation r1 r2 w2 p2 p1 w3 p3 c3 c1 c2 check +permutation r1 r2 w2 p2 p1 w3 p3 c3 c2 c1 check +permutation r1 r2 p1 w2 w3 p2 p3 c3 c1 c2 check +permutation r1 r2 p1 w2 w3 p2 p3 c3 c2 c1 check +permutation r1 r2 p1 w2 w3 p3 p2 c3 c1 c2 check +permutation r1 r2 p1 w2 w3 p3 p2 c3 c2 c1 check +permutation r1 r2 p1 w2 w3 p3 c3 p2 c1 c2 check +permutation r1 r2 p1 w2 w3 p3 c3 p2 c2 c1 check +permutation r1 r2 p1 w2 w3 p3 c3 c1 p2 c2 check +permutation r1 r2 p1 w2 p2 w3 p3 c3 c1 c2 check +permutation r1 r2 p1 w2 p2 w3 p3 c3 c2 c1 check +permutation r1 w2 w3 r2 p1 p2 p3 c3 c1 c2 check +permutation r1 w2 w3 r2 p1 p2 p3 c3 c2 c1 check +permutation r1 w2 w3 r2 p1 p3 p2 c3 c1 c2 check +permutation r1 w2 w3 r2 p1 p3 p2 c3 c2 c1 check +permutation r1 w2 w3 r2 p1 p3 c3 p2 c1 c2 check +permutation r1 w2 w3 r2 p1 p3 c3 p2 c2 c1 check +permutation r1 w2 w3 r2 p1 p3 c3 c1 p2 c2 check +permutation r1 w2 w3 r2 p2 p1 p3 c3 c1 c2 check +permutation r1 w2 w3 r2 p2 p1 p3 c3 c2 c1 check +permutation r1 w2 w3 r2 p2 p3 p1 c3 c1 c2 check +permutation r1 w2 w3 r2 p2 p3 p1 c3 c2 c1 check +permutation r1 w2 w3 r2 p2 p3 c3 p1 c1 c2 check +permutation r1 w2 w3 r2 p2 p3 c3 p1 c2 c1 check +permutation r1 w2 w3 r2 p2 p3 c3 c2 p1 c1 check +permutation r1 w2 w3 r2 p3 p1 p2 c3 c1 c2 check +permutation r1 w2 w3 r2 p3 p1 p2 c3 c2 c1 check +permutation r1 w2 w3 r2 p3 p1 c3 p2 c1 c2 check +permutation r1 w2 w3 r2 p3 p1 c3 p2 c2 c1 check +permutation r1 w2 w3 r2 p3 p1 c3 c1 p2 c2 check +permutation r1 w2 w3 r2 p3 p2 p1 c3 c1 c2 check +permutation r1 w2 w3 r2 p3 p2 p1 c3 c2 c1 check +permutation r1 w2 w3 r2 p3 p2 c3 p1 c1 c2 check +permutation r1 w2 w3 r2 p3 p2 c3 p1 c2 c1 check +permutation r1 w2 w3 r2 p3 p2 c3 c2 p1 c1 check +permutation r1 w2 w3 r2 p3 c3 p1 p2 c1 c2 check +permutation r1 w2 w3 r2 p3 c3 p1 p2 c2 c1 check +permutation r1 w2 w3 r2 p3 c3 p1 c1 p2 c2 check +permutation r1 w2 w3 r2 p3 c3 p2 p1 c1 c2 check +permutation r1 w2 w3 r2 p3 c3 p2 p1 c2 c1 check +permutation r1 w2 w3 r2 p3 c3 p2 c2 p1 c1 check +permutation r1 w2 w3 p1 r2 p2 p3 c3 c1 c2 check +permutation r1 w2 w3 p1 r2 p2 p3 c3 c2 c1 check +permutation r1 w2 w3 p1 r2 p3 p2 c3 c1 c2 check +permutation r1 w2 w3 p1 r2 p3 p2 c3 c2 c1 check +permutation r1 w2 w3 p1 r2 p3 c3 p2 c1 c2 check +permutation r1 w2 w3 p1 r2 p3 c3 p2 c2 c1 check +permutation r1 w2 w3 p1 r2 p3 c3 c1 p2 c2 check +permutation r1 w2 w3 p1 p3 r2 p2 c3 c1 c2 check +permutation r1 w2 w3 p1 p3 r2 p2 c3 c2 c1 check +permutation r1 w2 w3 p1 p3 r2 c3 p2 c1 c2 check +permutation r1 w2 w3 p1 p3 r2 c3 p2 c2 c1 check +permutation r1 w2 w3 p1 p3 r2 c3 c1 p2 c2 check +permutation r1 w2 w3 p1 p3 c3 r2 p2 c1 c2 check +permutation r1 w2 w3 p1 p3 c3 r2 p2 c2 c1 check +permutation r1 w2 w3 p1 p3 c3 r2 c1 p2 c2 check +permutation r1 w2 w3 p1 p3 c3 c1 r2 p2 c2 check +permutation r1 w2 w3 p3 r2 p1 p2 c3 c1 c2 check +permutation r1 w2 w3 p3 r2 p1 p2 c3 c2 c1 check +permutation r1 w2 w3 p3 r2 p1 c3 p2 c1 c2 check +permutation r1 w2 w3 p3 r2 p1 c3 p2 c2 c1 check +permutation r1 w2 w3 p3 r2 p1 c3 c1 p2 c2 check +permutation r1 w2 w3 p3 r2 p2 p1 c3 c1 c2 check +permutation r1 w2 w3 p3 r2 p2 p1 c3 c2 c1 check +permutation r1 w2 w3 p3 r2 p2 c3 p1 c1 c2 check +permutation r1 w2 w3 p3 r2 p2 c3 p1 c2 c1 check +permutation r1 w2 w3 p3 r2 p2 c3 c2 p1 c1 check +permutation r1 w2 w3 p3 r2 c3 p1 p2 c1 c2 check +permutation r1 w2 w3 p3 r2 c3 p1 p2 c2 c1 check +permutation r1 w2 w3 p3 r2 c3 p1 c1 p2 c2 check +permutation r1 w2 w3 p3 r2 c3 p2 p1 c1 c2 check +permutation r1 w2 w3 p3 r2 c3 p2 p1 c2 c1 check +permutation r1 w2 w3 p3 r2 c3 p2 c2 p1 c1 check +permutation r1 w2 w3 p3 p1 r2 p2 c3 c1 c2 check +permutation r1 w2 w3 p3 p1 r2 p2 c3 c2 c1 check +permutation r1 w2 w3 p3 p1 r2 c3 p2 c1 c2 check +permutation r1 w2 w3 p3 p1 r2 c3 p2 c2 c1 check +permutation r1 w2 w3 p3 p1 r2 c3 c1 p2 c2 check +permutation r1 w2 w3 p3 p1 c3 r2 p2 c1 c2 check +permutation r1 w2 w3 p3 p1 c3 r2 p2 c2 c1 check +permutation r1 w2 w3 p3 p1 c3 r2 c1 p2 c2 check +permutation r1 w2 w3 p3 p1 c3 c1 r2 p2 c2 check +permutation r1 w2 w3 p3 c3 r2 p1 p2 c1 c2 check +permutation r1 w2 w3 p3 c3 r2 p1 p2 c2 c1 check +permutation r1 w2 w3 p3 c3 r2 p1 c1 p2 c2 check +permutation r1 w2 w3 p3 c3 r2 p2 p1 c1 c2 check +permutation r1 w2 w3 p3 c3 r2 p2 p1 c2 c1 check +permutation r1 w2 w3 p3 c3 r2 p2 c2 p1 c1 check +permutation r1 w2 w3 p3 c3 p1 r2 p2 c1 c2 check +permutation r1 w2 w3 p3 c3 p1 r2 p2 c2 c1 check +permutation r1 w2 w3 p3 c3 p1 r2 c1 p2 c2 check +permutation r1 w2 w3 p3 c3 p1 c1 r2 p2 c2 check +permutation r1 w2 p1 w3 r2 p2 p3 c3 c1 c2 check +permutation r1 w2 p1 w3 r2 p2 p3 c3 c2 c1 check +permutation r1 w2 p1 w3 r2 p3 p2 c3 c1 c2 check +permutation r1 w2 p1 w3 r2 p3 p2 c3 c2 c1 check +permutation r1 w2 p1 w3 r2 p3 c3 p2 c1 c2 check +permutation r1 w2 p1 w3 r2 p3 c3 p2 c2 c1 check +permutation r1 w2 p1 w3 r2 p3 c3 c1 p2 c2 check +permutation r1 w2 p1 w3 p3 r2 p2 c3 c1 c2 check +permutation r1 w2 p1 w3 p3 r2 p2 c3 c2 c1 check +permutation r1 w2 p1 w3 p3 r2 c3 p2 c1 c2 check +permutation r1 w2 p1 w3 p3 r2 c3 p2 c2 c1 check +permutation r1 w2 p1 w3 p3 r2 c3 c1 p2 c2 check +permutation r1 w2 p1 w3 p3 c3 r2 p2 c1 c2 check +permutation r1 w2 p1 w3 p3 c3 r2 p2 c2 c1 check +permutation r1 w2 p1 w3 p3 c3 r2 c1 p2 c2 check +permutation r1 w2 p1 w3 p3 c3 c1 r2 p2 c2 check +permutation r1 w3 r2 w2 p1 p2 p3 c3 c1 c2 check +permutation r1 w3 r2 w2 p1 p2 p3 c3 c2 c1 check +permutation r1 w3 r2 w2 p1 p3 p2 c3 c1 c2 check +permutation r1 w3 r2 w2 p1 p3 p2 c3 c2 c1 check +permutation r1 w3 r2 w2 p1 p3 c3 p2 c1 c2 check +permutation r1 w3 r2 w2 p1 p3 c3 p2 c2 c1 check +permutation r1 w3 r2 w2 p1 p3 c3 c1 p2 c2 check +permutation r1 w3 r2 w2 p2 p1 p3 c3 c1 c2 check +permutation r1 w3 r2 w2 p2 p1 p3 c3 c2 c1 check +permutation r1 w3 r2 w2 p2 p3 p1 c3 c1 c2 check +permutation r1 w3 r2 w2 p2 p3 p1 c3 c2 c1 check +permutation r1 w3 r2 w2 p2 p3 c3 p1 c1 c2 check +permutation r1 w3 r2 w2 p2 p3 c3 p1 c2 c1 check +permutation r1 w3 r2 w2 p2 p3 c3 c2 p1 c1 check +permutation r1 w3 r2 w2 p3 p1 p2 c3 c1 c2 check +permutation r1 w3 r2 w2 p3 p1 p2 c3 c2 c1 check +permutation r1 w3 r2 w2 p3 p1 c3 p2 c1 c2 check +permutation r1 w3 r2 w2 p3 p1 c3 p2 c2 c1 check +permutation r1 w3 r2 w2 p3 p1 c3 c1 p2 c2 check +permutation r1 w3 r2 w2 p3 p2 p1 c3 c1 c2 check +permutation r1 w3 r2 w2 p3 p2 p1 c3 c2 c1 check +permutation r1 w3 r2 w2 p3 p2 c3 p1 c1 c2 check +permutation r1 w3 r2 w2 p3 p2 c3 p1 c2 c1 check +permutation r1 w3 r2 w2 p3 p2 c3 c2 p1 c1 check +permutation r1 w3 r2 w2 p3 c3 p1 p2 c1 c2 check +permutation r1 w3 r2 w2 p3 c3 p1 p2 c2 c1 check +permutation r1 w3 r2 w2 p3 c3 p1 c1 p2 c2 check +permutation r1 w3 r2 w2 p3 c3 p2 p1 c1 c2 check +permutation r1 w3 r2 w2 p3 c3 p2 p1 c2 c1 check +permutation r1 w3 r2 w2 p3 c3 p2 c2 p1 c1 check +permutation r1 w3 r2 p1 w2 p2 p3 c3 c1 c2 check +permutation r1 w3 r2 p1 w2 p2 p3 c3 c2 c1 check +permutation r1 w3 r2 p1 w2 p3 p2 c3 c1 c2 check +permutation r1 w3 r2 p1 w2 p3 p2 c3 c2 c1 check +permutation r1 w3 r2 p1 w2 p3 c3 p2 c1 c2 check +permutation r1 w3 r2 p1 w2 p3 c3 p2 c2 c1 check +permutation r1 w3 r2 p1 w2 p3 c3 c1 p2 c2 check +permutation r1 w3 r2 p1 p3 w2 p2 c3 c1 c2 check +permutation r1 w3 r2 p1 p3 w2 p2 c3 c2 c1 check +permutation r1 w3 r2 p1 p3 w2 c3 p2 c1 c2 check +permutation r1 w3 r2 p1 p3 w2 c3 p2 c2 c1 check +permutation r1 w3 r2 p1 p3 w2 c3 c1 p2 c2 check +permutation r1 w3 r2 p1 p3 c3 w2 p2 c1 c2 check +permutation r1 w3 r2 p1 p3 c3 w2 p2 c2 c1 check +permutation r1 w3 r2 p1 p3 c3 w2 c1 p2 c2 check +permutation r1 w3 r2 p1 p3 c3 c1 w2 p2 c2 check +permutation r1 w3 r2 p3 w2 p1 p2 c3 c1 c2 check +permutation r1 w3 r2 p3 w2 p1 p2 c3 c2 c1 check +permutation r1 w3 r2 p3 w2 p1 c3 p2 c1 c2 check +permutation r1 w3 r2 p3 w2 p1 c3 p2 c2 c1 check +permutation r1 w3 r2 p3 w2 p1 c3 c1 p2 c2 check +permutation r1 w3 r2 p3 w2 p2 p1 c3 c1 c2 check +permutation r1 w3 r2 p3 w2 p2 p1 c3 c2 c1 check +permutation r1 w3 r2 p3 w2 p2 c3 p1 c1 c2 check +permutation r1 w3 r2 p3 w2 p2 c3 p1 c2 c1 check +permutation r1 w3 r2 p3 w2 p2 c3 c2 p1 c1 check +permutation r1 w3 r2 p3 w2 c3 p1 p2 c1 c2 check +permutation r1 w3 r2 p3 w2 c3 p1 p2 c2 c1 check +permutation r1 w3 r2 p3 w2 c3 p1 c1 p2 c2 check +permutation r1 w3 r2 p3 w2 c3 p2 p1 c1 c2 check +permutation r1 w3 r2 p3 w2 c3 p2 p1 c2 c1 check +permutation r1 w3 r2 p3 w2 c3 p2 c2 p1 c1 check +permutation r1 w3 r2 p3 p1 w2 p2 c3 c1 c2 check +permutation r1 w3 r2 p3 p1 w2 p2 c3 c2 c1 check +permutation r1 w3 r2 p3 p1 w2 c3 p2 c1 c2 check +permutation r1 w3 r2 p3 p1 w2 c3 p2 c2 c1 check +permutation r1 w3 r2 p3 p1 w2 c3 c1 p2 c2 check +permutation r1 w3 r2 p3 p1 c3 w2 p2 c1 c2 check +permutation r1 w3 r2 p3 p1 c3 w2 p2 c2 c1 check +permutation r1 w3 r2 p3 p1 c3 w2 c1 p2 c2 check +permutation r1 w3 r2 p3 p1 c3 c1 w2 p2 c2 check +permutation r1 w3 r2 p3 c3 w2 p1 p2 c1 c2 check +permutation r1 w3 r2 p3 c3 w2 p1 p2 c2 c1 check +permutation r1 w3 r2 p3 c3 w2 p1 c1 p2 c2 check +permutation r1 w3 r2 p3 c3 w2 p2 p1 c1 c2 check +permutation r1 w3 r2 p3 c3 w2 p2 p1 c2 c1 check +permutation r1 w3 r2 p3 c3 w2 p2 c2 p1 c1 check +permutation r1 w3 r2 p3 c3 p1 w2 p2 c1 c2 check +permutation r1 w3 r2 p3 c3 p1 w2 p2 c2 c1 check +permutation r1 w3 r2 p3 c3 p1 w2 c1 p2 c2 check +permutation r1 w3 r2 p3 c3 p1 c1 w2 p2 c2 check +permutation r1 w3 w2 r2 p1 p2 p3 c3 c1 c2 check +permutation r1 w3 w2 r2 p1 p2 p3 c3 c2 c1 check +permutation r1 w3 w2 r2 p1 p3 p2 c3 c1 c2 check +permutation r1 w3 w2 r2 p1 p3 p2 c3 c2 c1 check +permutation r1 w3 w2 r2 p1 p3 c3 p2 c1 c2 check +permutation r1 w3 w2 r2 p1 p3 c3 p2 c2 c1 check +permutation r1 w3 w2 r2 p1 p3 c3 c1 p2 c2 check +permutation r1 w3 w2 r2 p2 p1 p3 c3 c1 c2 check +permutation r1 w3 w2 r2 p2 p1 p3 c3 c2 c1 check +permutation r1 w3 w2 r2 p2 p3 p1 c3 c1 c2 check +permutation r1 w3 w2 r2 p2 p3 p1 c3 c2 c1 check +permutation r1 w3 w2 r2 p2 p3 c3 p1 c1 c2 check +permutation r1 w3 w2 r2 p2 p3 c3 p1 c2 c1 check +permutation r1 w3 w2 r2 p2 p3 c3 c2 p1 c1 check +permutation r1 w3 w2 r2 p3 p1 p2 c3 c1 c2 check +permutation r1 w3 w2 r2 p3 p1 p2 c3 c2 c1 check +permutation r1 w3 w2 r2 p3 p1 c3 p2 c1 c2 check +permutation r1 w3 w2 r2 p3 p1 c3 p2 c2 c1 check +permutation r1 w3 w2 r2 p3 p1 c3 c1 p2 c2 check +permutation r1 w3 w2 r2 p3 p2 p1 c3 c1 c2 check +permutation r1 w3 w2 r2 p3 p2 p1 c3 c2 c1 check +permutation r1 w3 w2 r2 p3 p2 c3 p1 c1 c2 check +permutation r1 w3 w2 r2 p3 p2 c3 p1 c2 c1 check +permutation r1 w3 w2 r2 p3 p2 c3 c2 p1 c1 check +permutation r1 w3 w2 r2 p3 c3 p1 p2 c1 c2 check +permutation r1 w3 w2 r2 p3 c3 p1 p2 c2 c1 check +permutation r1 w3 w2 r2 p3 c3 p1 c1 p2 c2 check +permutation r1 w3 w2 r2 p3 c3 p2 p1 c1 c2 check +permutation r1 w3 w2 r2 p3 c3 p2 p1 c2 c1 check +permutation r1 w3 w2 r2 p3 c3 p2 c2 p1 c1 check +permutation r1 w3 w2 p1 r2 p2 p3 c3 c1 c2 check +permutation r1 w3 w2 p1 r2 p2 p3 c3 c2 c1 check +permutation r1 w3 w2 p1 r2 p3 p2 c3 c1 c2 check +permutation r1 w3 w2 p1 r2 p3 p2 c3 c2 c1 check +permutation r1 w3 w2 p1 r2 p3 c3 p2 c1 c2 check +permutation r1 w3 w2 p1 r2 p3 c3 p2 c2 c1 check +permutation r1 w3 w2 p1 r2 p3 c3 c1 p2 c2 check +permutation r1 w3 w2 p1 p3 r2 p2 c3 c1 c2 check +permutation r1 w3 w2 p1 p3 r2 p2 c3 c2 c1 check +permutation r1 w3 w2 p1 p3 r2 c3 p2 c1 c2 check +permutation r1 w3 w2 p1 p3 r2 c3 p2 c2 c1 check +permutation r1 w3 w2 p1 p3 r2 c3 c1 p2 c2 check +permutation r1 w3 w2 p1 p3 c3 r2 p2 c1 c2 check +permutation r1 w3 w2 p1 p3 c3 r2 p2 c2 c1 check +permutation r1 w3 w2 p1 p3 c3 r2 c1 p2 c2 check +permutation r1 w3 w2 p1 p3 c3 c1 r2 p2 c2 check +permutation r1 w3 w2 p3 r2 p1 p2 c3 c1 c2 check +permutation r1 w3 w2 p3 r2 p1 p2 c3 c2 c1 check +permutation r1 w3 w2 p3 r2 p1 c3 p2 c1 c2 check +permutation r1 w3 w2 p3 r2 p1 c3 p2 c2 c1 check +permutation r1 w3 w2 p3 r2 p1 c3 c1 p2 c2 check +permutation r1 w3 w2 p3 r2 p2 p1 c3 c1 c2 check +permutation r1 w3 w2 p3 r2 p2 p1 c3 c2 c1 check +permutation r1 w3 w2 p3 r2 p2 c3 p1 c1 c2 check +permutation r1 w3 w2 p3 r2 p2 c3 p1 c2 c1 check +permutation r1 w3 w2 p3 r2 p2 c3 c2 p1 c1 check +permutation r1 w3 w2 p3 r2 c3 p1 p2 c1 c2 check +permutation r1 w3 w2 p3 r2 c3 p1 p2 c2 c1 check +permutation r1 w3 w2 p3 r2 c3 p1 c1 p2 c2 check +permutation r1 w3 w2 p3 r2 c3 p2 p1 c1 c2 check +permutation r1 w3 w2 p3 r2 c3 p2 p1 c2 c1 check +permutation r1 w3 w2 p3 r2 c3 p2 c2 p1 c1 check +permutation r1 w3 w2 p3 p1 r2 p2 c3 c1 c2 check +permutation r1 w3 w2 p3 p1 r2 p2 c3 c2 c1 check +permutation r1 w3 w2 p3 p1 r2 c3 p2 c1 c2 check +permutation r1 w3 w2 p3 p1 r2 c3 p2 c2 c1 check +permutation r1 w3 w2 p3 p1 r2 c3 c1 p2 c2 check +permutation r1 w3 w2 p3 p1 c3 r2 p2 c1 c2 check +permutation r1 w3 w2 p3 p1 c3 r2 p2 c2 c1 check +permutation r1 w3 w2 p3 p1 c3 r2 c1 p2 c2 check +permutation r1 w3 w2 p3 p1 c3 c1 r2 p2 c2 check +permutation r1 w3 w2 p3 c3 r2 p1 p2 c1 c2 check +permutation r1 w3 w2 p3 c3 r2 p1 p2 c2 c1 check +permutation r1 w3 w2 p3 c3 r2 p1 c1 p2 c2 check +permutation r1 w3 w2 p3 c3 r2 p2 p1 c1 c2 check +permutation r1 w3 w2 p3 c3 r2 p2 p1 c2 c1 check +permutation r1 w3 w2 p3 c3 r2 p2 c2 p1 c1 check +permutation r1 w3 w2 p3 c3 p1 r2 p2 c1 c2 check +permutation r1 w3 w2 p3 c3 p1 r2 p2 c2 c1 check +permutation r1 w3 w2 p3 c3 p1 r2 c1 p2 c2 check +permutation r1 w3 w2 p3 c3 p1 c1 r2 p2 c2 check +permutation r1 w3 p1 r2 w2 p2 p3 c3 c1 c2 check +permutation r1 w3 p1 r2 w2 p2 p3 c3 c2 c1 check +permutation r1 w3 p1 r2 w2 p3 p2 c3 c1 c2 check +permutation r1 w3 p1 r2 w2 p3 p2 c3 c2 c1 check +permutation r1 w3 p1 r2 w2 p3 c3 p2 c1 c2 check +permutation r1 w3 p1 r2 w2 p3 c3 p2 c2 c1 check +permutation r1 w3 p1 r2 w2 p3 c3 c1 p2 c2 check +permutation r1 w3 p1 r2 p3 w2 p2 c3 c1 c2 check +permutation r1 w3 p1 r2 p3 w2 p2 c3 c2 c1 check +permutation r1 w3 p1 r2 p3 w2 c3 p2 c1 c2 check +permutation r1 w3 p1 r2 p3 w2 c3 p2 c2 c1 check +permutation r1 w3 p1 r2 p3 w2 c3 c1 p2 c2 check +permutation r1 w3 p1 r2 p3 c3 w2 p2 c1 c2 check +permutation r1 w3 p1 r2 p3 c3 w2 p2 c2 c1 check +permutation r1 w3 p1 r2 p3 c3 w2 c1 p2 c2 check +permutation r1 w3 p1 r2 p3 c3 c1 w2 p2 c2 check +permutation r1 w3 p1 w2 r2 p2 p3 c3 c1 c2 check +permutation r1 w3 p1 w2 r2 p2 p3 c3 c2 c1 check +permutation r1 w3 p1 w2 r2 p3 p2 c3 c1 c2 check +permutation r1 w3 p1 w2 r2 p3 p2 c3 c2 c1 check +permutation r1 w3 p1 w2 r2 p3 c3 p2 c1 c2 check +permutation r1 w3 p1 w2 r2 p3 c3 p2 c2 c1 check +permutation r1 w3 p1 w2 r2 p3 c3 c1 p2 c2 check +permutation r1 w3 p1 w2 p3 r2 p2 c3 c1 c2 check +permutation r1 w3 p1 w2 p3 r2 p2 c3 c2 c1 check +permutation r1 w3 p1 w2 p3 r2 c3 p2 c1 c2 check +permutation r1 w3 p1 w2 p3 r2 c3 p2 c2 c1 check +permutation r1 w3 p1 w2 p3 r2 c3 c1 p2 c2 check +permutation r1 w3 p1 w2 p3 c3 r2 p2 c1 c2 check +permutation r1 w3 p1 w2 p3 c3 r2 p2 c2 c1 check +permutation r1 w3 p1 w2 p3 c3 r2 c1 p2 c2 check +permutation r1 w3 p1 w2 p3 c3 c1 r2 p2 c2 check +permutation r1 w3 p1 p3 r2 w2 p2 c3 c1 c2 check +permutation r1 w3 p1 p3 r2 w2 p2 c3 c2 c1 check +permutation r1 w3 p1 p3 r2 w2 c3 p2 c1 c2 check +permutation r1 w3 p1 p3 r2 w2 c3 p2 c2 c1 check +permutation r1 w3 p1 p3 r2 w2 c3 c1 p2 c2 check +permutation r1 w3 p1 p3 r2 c3 w2 p2 c1 c2 check +permutation r1 w3 p1 p3 r2 c3 w2 p2 c2 c1 check +permutation r1 w3 p1 p3 r2 c3 w2 c1 p2 c2 check +permutation r1 w3 p1 p3 r2 c3 c1 w2 p2 c2 check +permutation r1 w3 p1 p3 w2 r2 p2 c3 c1 c2 check +permutation r1 w3 p1 p3 w2 r2 p2 c3 c2 c1 check +permutation r1 w3 p1 p3 w2 r2 c3 p2 c1 c2 check +permutation r1 w3 p1 p3 w2 r2 c3 p2 c2 c1 check +permutation r1 w3 p1 p3 w2 r2 c3 c1 p2 c2 check +permutation r1 w3 p1 p3 w2 c3 r2 p2 c1 c2 check +permutation r1 w3 p1 p3 w2 c3 r2 p2 c2 c1 check +permutation r1 w3 p1 p3 w2 c3 r2 c1 p2 c2 check +permutation r1 w3 p1 p3 w2 c3 c1 r2 p2 c2 check +permutation r1 w3 p1 p3 c3 r2 w2 p2 c1 c2 check +permutation r1 w3 p1 p3 c3 r2 w2 p2 c2 c1 check +permutation r1 w3 p1 p3 c3 r2 w2 c1 p2 c2 check +permutation r1 w3 p1 p3 c3 r2 c1 w2 p2 c2 check +permutation r1 w3 p1 p3 c3 w2 r2 p2 c1 c2 check +permutation r1 w3 p1 p3 c3 w2 r2 p2 c2 c1 check +permutation r1 w3 p1 p3 c3 w2 r2 c1 p2 c2 check +permutation r1 w3 p1 p3 c3 w2 c1 r2 p2 c2 check +permutation r1 w3 p1 p3 c3 c1 r2 w2 p2 c2 check +permutation r1 w3 p1 p3 c3 c1 w2 r2 p2 c2 check +permutation r1 w3 p3 r2 w2 p1 p2 c3 c1 c2 check +permutation r1 w3 p3 r2 w2 p1 p2 c3 c2 c1 check +permutation r1 w3 p3 r2 w2 p1 c3 p2 c1 c2 check +permutation r1 w3 p3 r2 w2 p1 c3 p2 c2 c1 check +permutation r1 w3 p3 r2 w2 p1 c3 c1 p2 c2 check +permutation r1 w3 p3 r2 w2 p2 p1 c3 c1 c2 check +permutation r1 w3 p3 r2 w2 p2 p1 c3 c2 c1 check +permutation r1 w3 p3 r2 w2 p2 c3 p1 c1 c2 check +permutation r1 w3 p3 r2 w2 p2 c3 p1 c2 c1 check +permutation r1 w3 p3 r2 w2 p2 c3 c2 p1 c1 check +permutation r1 w3 p3 r2 w2 c3 p1 p2 c1 c2 check +permutation r1 w3 p3 r2 w2 c3 p1 p2 c2 c1 check +permutation r1 w3 p3 r2 w2 c3 p1 c1 p2 c2 check +permutation r1 w3 p3 r2 w2 c3 p2 p1 c1 c2 check +permutation r1 w3 p3 r2 w2 c3 p2 p1 c2 c1 check +permutation r1 w3 p3 r2 w2 c3 p2 c2 p1 c1 check +permutation r1 w3 p3 r2 p1 w2 p2 c3 c1 c2 check +permutation r1 w3 p3 r2 p1 w2 p2 c3 c2 c1 check +permutation r1 w3 p3 r2 p1 w2 c3 p2 c1 c2 check +permutation r1 w3 p3 r2 p1 w2 c3 p2 c2 c1 check +permutation r1 w3 p3 r2 p1 w2 c3 c1 p2 c2 check +permutation r1 w3 p3 r2 p1 c3 w2 p2 c1 c2 check +permutation r1 w3 p3 r2 p1 c3 w2 p2 c2 c1 check +permutation r1 w3 p3 r2 p1 c3 w2 c1 p2 c2 check +permutation r1 w3 p3 r2 p1 c3 c1 w2 p2 c2 check +permutation r1 w3 p3 r2 c3 w2 p1 p2 c1 c2 check +permutation r1 w3 p3 r2 c3 w2 p1 p2 c2 c1 check +permutation r1 w3 p3 r2 c3 w2 p1 c1 p2 c2 check +permutation r1 w3 p3 r2 c3 w2 p2 p1 c1 c2 check +permutation r1 w3 p3 r2 c3 w2 p2 p1 c2 c1 check +permutation r1 w3 p3 r2 c3 w2 p2 c2 p1 c1 check +permutation r1 w3 p3 r2 c3 p1 w2 p2 c1 c2 check +permutation r1 w3 p3 r2 c3 p1 w2 p2 c2 c1 check +permutation r1 w3 p3 r2 c3 p1 w2 c1 p2 c2 check +permutation r1 w3 p3 r2 c3 p1 c1 w2 p2 c2 check +permutation r1 w3 p3 w2 r2 p1 p2 c3 c1 c2 check +permutation r1 w3 p3 w2 r2 p1 p2 c3 c2 c1 check +permutation r1 w3 p3 w2 r2 p1 c3 p2 c1 c2 check +permutation r1 w3 p3 w2 r2 p1 c3 p2 c2 c1 check +permutation r1 w3 p3 w2 r2 p1 c3 c1 p2 c2 check +permutation r1 w3 p3 w2 r2 p2 p1 c3 c1 c2 check +permutation r1 w3 p3 w2 r2 p2 p1 c3 c2 c1 check +permutation r1 w3 p3 w2 r2 p2 c3 p1 c1 c2 check +permutation r1 w3 p3 w2 r2 p2 c3 p1 c2 c1 check +permutation r1 w3 p3 w2 r2 p2 c3 c2 p1 c1 check +permutation r1 w3 p3 w2 r2 c3 p1 p2 c1 c2 check +permutation r1 w3 p3 w2 r2 c3 p1 p2 c2 c1 check +permutation r1 w3 p3 w2 r2 c3 p1 c1 p2 c2 check +permutation r1 w3 p3 w2 r2 c3 p2 p1 c1 c2 check +permutation r1 w3 p3 w2 r2 c3 p2 p1 c2 c1 check +permutation r1 w3 p3 w2 r2 c3 p2 c2 p1 c1 check +permutation r1 w3 p3 w2 p1 r2 p2 c3 c1 c2 check +permutation r1 w3 p3 w2 p1 r2 p2 c3 c2 c1 check +permutation r1 w3 p3 w2 p1 r2 c3 p2 c1 c2 check +permutation r1 w3 p3 w2 p1 r2 c3 p2 c2 c1 check +permutation r1 w3 p3 w2 p1 r2 c3 c1 p2 c2 check +permutation r1 w3 p3 w2 p1 c3 r2 p2 c1 c2 check +permutation r1 w3 p3 w2 p1 c3 r2 p2 c2 c1 check +permutation r1 w3 p3 w2 p1 c3 r2 c1 p2 c2 check +permutation r1 w3 p3 w2 p1 c3 c1 r2 p2 c2 check +permutation r1 w3 p3 w2 c3 r2 p1 p2 c1 c2 check +permutation r1 w3 p3 w2 c3 r2 p1 p2 c2 c1 check +permutation r1 w3 p3 w2 c3 r2 p1 c1 p2 c2 check +permutation r1 w3 p3 w2 c3 r2 p2 p1 c1 c2 check +permutation r1 w3 p3 w2 c3 r2 p2 p1 c2 c1 check +permutation r1 w3 p3 w2 c3 r2 p2 c2 p1 c1 check +permutation r1 w3 p3 w2 c3 p1 r2 p2 c1 c2 check +permutation r1 w3 p3 w2 c3 p1 r2 p2 c2 c1 check +permutation r1 w3 p3 w2 c3 p1 r2 c1 p2 c2 check +permutation r1 w3 p3 w2 c3 p1 c1 r2 p2 c2 check +permutation r1 w3 p3 p1 r2 w2 p2 c3 c1 c2 check +permutation r1 w3 p3 p1 r2 w2 p2 c3 c2 c1 check +permutation r1 w3 p3 p1 r2 w2 c3 p2 c1 c2 check +permutation r1 w3 p3 p1 r2 w2 c3 p2 c2 c1 check +permutation r1 w3 p3 p1 r2 w2 c3 c1 p2 c2 check +permutation r1 w3 p3 p1 r2 c3 w2 p2 c1 c2 check +permutation r1 w3 p3 p1 r2 c3 w2 p2 c2 c1 check +permutation r1 w3 p3 p1 r2 c3 w2 c1 p2 c2 check +permutation r1 w3 p3 p1 r2 c3 c1 w2 p2 c2 check +permutation r1 w3 p3 p1 w2 r2 p2 c3 c1 c2 check +permutation r1 w3 p3 p1 w2 r2 p2 c3 c2 c1 check +permutation r1 w3 p3 p1 w2 r2 c3 p2 c1 c2 check +permutation r1 w3 p3 p1 w2 r2 c3 p2 c2 c1 check +permutation r1 w3 p3 p1 w2 r2 c3 c1 p2 c2 check +permutation r1 w3 p3 p1 w2 c3 r2 p2 c1 c2 check +permutation r1 w3 p3 p1 w2 c3 r2 p2 c2 c1 check +permutation r1 w3 p3 p1 w2 c3 r2 c1 p2 c2 check +permutation r1 w3 p3 p1 w2 c3 c1 r2 p2 c2 check +permutation r1 w3 p3 p1 c3 r2 w2 p2 c1 c2 check +permutation r1 w3 p3 p1 c3 r2 w2 p2 c2 c1 check +permutation r1 w3 p3 p1 c3 r2 w2 c1 p2 c2 check +permutation r1 w3 p3 p1 c3 r2 c1 w2 p2 c2 check +permutation r1 w3 p3 p1 c3 w2 r2 p2 c1 c2 check +permutation r1 w3 p3 p1 c3 w2 r2 p2 c2 c1 check +permutation r1 w3 p3 p1 c3 w2 r2 c1 p2 c2 check +permutation r1 w3 p3 p1 c3 w2 c1 r2 p2 c2 check +permutation r1 w3 p3 p1 c3 c1 r2 w2 p2 c2 check +permutation r1 w3 p3 p1 c3 c1 w2 r2 p2 c2 check +permutation r1 w3 p3 c3 r2 w2 p1 p2 c1 c2 check +permutation r1 w3 p3 c3 r2 w2 p1 p2 c2 c1 check +permutation r1 w3 p3 c3 r2 w2 p1 c1 p2 c2 check +permutation r1 w3 p3 c3 r2 w2 p2 p1 c1 c2 check +permutation r1 w3 p3 c3 r2 w2 p2 p1 c2 c1 check +permutation r1 w3 p3 c3 r2 w2 p2 c2 p1 c1 check +permutation r1 w3 p3 c3 r2 p1 w2 p2 c1 c2 check +permutation r1 w3 p3 c3 r2 p1 w2 p2 c2 c1 check +permutation r1 w3 p3 c3 r2 p1 w2 c1 p2 c2 check +permutation r1 w3 p3 c3 r2 p1 c1 w2 p2 c2 check +permutation r1 w3 p3 c3 w2 r2 p1 p2 c1 c2 check +permutation r1 w3 p3 c3 w2 r2 p1 p2 c2 c1 check +permutation r1 w3 p3 c3 w2 r2 p1 c1 p2 c2 check +permutation r1 w3 p3 c3 w2 r2 p2 p1 c1 c2 check +permutation r1 w3 p3 c3 w2 r2 p2 p1 c2 c1 check +permutation r1 w3 p3 c3 w2 r2 p2 c2 p1 c1 check +permutation r1 w3 p3 c3 w2 p1 r2 p2 c1 c2 check +permutation r1 w3 p3 c3 w2 p1 r2 p2 c2 c1 check +permutation r1 w3 p3 c3 w2 p1 r2 c1 p2 c2 check +permutation r1 w3 p3 c3 w2 p1 c1 r2 p2 c2 check +permutation r1 w3 p3 c3 p1 r2 w2 p2 c1 c2 check +permutation r1 w3 p3 c3 p1 r2 w2 p2 c2 c1 check +permutation r1 w3 p3 c3 p1 r2 w2 c1 p2 c2 check +permutation r1 w3 p3 c3 p1 r2 c1 w2 p2 c2 check +permutation r1 w3 p3 c3 p1 w2 r2 p2 c1 c2 check +permutation r1 w3 p3 c3 p1 w2 r2 p2 c2 c1 check +permutation r1 w3 p3 c3 p1 w2 r2 c1 p2 c2 check +permutation r1 w3 p3 c3 p1 w2 c1 r2 p2 c2 check +permutation r1 w3 p3 c3 p1 c1 r2 w2 p2 c2 check +permutation r1 w3 p3 c3 p1 c1 w2 r2 p2 c2 check +permutation r1 p1 r2 w2 w3 p2 p3 c3 c1 c2 check +permutation r1 p1 r2 w2 w3 p2 p3 c3 c2 c1 check +permutation r1 p1 r2 w2 w3 p3 p2 c3 c1 c2 check +permutation r1 p1 r2 w2 w3 p3 p2 c3 c2 c1 check +permutation r1 p1 r2 w2 w3 p3 c3 p2 c1 c2 check +permutation r1 p1 r2 w2 w3 p3 c3 p2 c2 c1 check +permutation r1 p1 r2 w2 w3 p3 c3 c1 p2 c2 check +permutation r1 p1 r2 w2 p2 w3 p3 c3 c1 c2 check +permutation r1 p1 r2 w2 p2 w3 p3 c3 c2 c1 check +permutation r1 p1 w2 w3 r2 p2 p3 c3 c1 c2 check +permutation r1 p1 w2 w3 r2 p2 p3 c3 c2 c1 check +permutation r1 p1 w2 w3 r2 p3 p2 c3 c1 c2 check +permutation r1 p1 w2 w3 r2 p3 p2 c3 c2 c1 check +permutation r1 p1 w2 w3 r2 p3 c3 p2 c1 c2 check +permutation r1 p1 w2 w3 r2 p3 c3 p2 c2 c1 check +permutation r1 p1 w2 w3 r2 p3 c3 c1 p2 c2 check +permutation r1 p1 w2 w3 p3 r2 p2 c3 c1 c2 check +permutation r1 p1 w2 w3 p3 r2 p2 c3 c2 c1 check +permutation r1 p1 w2 w3 p3 r2 c3 p2 c1 c2 check +permutation r1 p1 w2 w3 p3 r2 c3 p2 c2 c1 check +permutation r1 p1 w2 w3 p3 r2 c3 c1 p2 c2 check +permutation r1 p1 w2 w3 p3 c3 r2 p2 c1 c2 check +permutation r1 p1 w2 w3 p3 c3 r2 p2 c2 c1 check +permutation r1 p1 w2 w3 p3 c3 r2 c1 p2 c2 check +permutation r1 p1 w2 w3 p3 c3 c1 r2 p2 c2 check +permutation r1 p1 w3 r2 w2 p2 p3 c3 c1 c2 check +permutation r1 p1 w3 r2 w2 p2 p3 c3 c2 c1 check +permutation r1 p1 w3 r2 w2 p3 p2 c3 c1 c2 check +permutation r1 p1 w3 r2 w2 p3 p2 c3 c2 c1 check +permutation r1 p1 w3 r2 w2 p3 c3 p2 c1 c2 check +permutation r1 p1 w3 r2 w2 p3 c3 p2 c2 c1 check +permutation r1 p1 w3 r2 w2 p3 c3 c1 p2 c2 check +permutation r1 p1 w3 r2 p3 w2 p2 c3 c1 c2 check +permutation r1 p1 w3 r2 p3 w2 p2 c3 c2 c1 check +permutation r1 p1 w3 r2 p3 w2 c3 p2 c1 c2 check +permutation r1 p1 w3 r2 p3 w2 c3 p2 c2 c1 check +permutation r1 p1 w3 r2 p3 w2 c3 c1 p2 c2 check +permutation r1 p1 w3 r2 p3 c3 w2 p2 c1 c2 check +permutation r1 p1 w3 r2 p3 c3 w2 p2 c2 c1 check +permutation r1 p1 w3 r2 p3 c3 w2 c1 p2 c2 check +permutation r1 p1 w3 r2 p3 c3 c1 w2 p2 c2 check +permutation r1 p1 w3 w2 r2 p2 p3 c3 c1 c2 check +permutation r1 p1 w3 w2 r2 p2 p3 c3 c2 c1 check +permutation r1 p1 w3 w2 r2 p3 p2 c3 c1 c2 check +permutation r1 p1 w3 w2 r2 p3 p2 c3 c2 c1 check +permutation r1 p1 w3 w2 r2 p3 c3 p2 c1 c2 check +permutation r1 p1 w3 w2 r2 p3 c3 p2 c2 c1 check +permutation r1 p1 w3 w2 r2 p3 c3 c1 p2 c2 check +permutation r1 p1 w3 w2 p3 r2 p2 c3 c1 c2 check +permutation r1 p1 w3 w2 p3 r2 p2 c3 c2 c1 check +permutation r1 p1 w3 w2 p3 r2 c3 p2 c1 c2 check +permutation r1 p1 w3 w2 p3 r2 c3 p2 c2 c1 check +permutation r1 p1 w3 w2 p3 r2 c3 c1 p2 c2 check +permutation r1 p1 w3 w2 p3 c3 r2 p2 c1 c2 check +permutation r1 p1 w3 w2 p3 c3 r2 p2 c2 c1 check +permutation r1 p1 w3 w2 p3 c3 r2 c1 p2 c2 check +permutation r1 p1 w3 w2 p3 c3 c1 r2 p2 c2 check +permutation r1 p1 w3 p3 r2 w2 p2 c3 c1 c2 check +permutation r1 p1 w3 p3 r2 w2 p2 c3 c2 c1 check +permutation r1 p1 w3 p3 r2 w2 c3 p2 c1 c2 check +permutation r1 p1 w3 p3 r2 w2 c3 p2 c2 c1 check +permutation r1 p1 w3 p3 r2 w2 c3 c1 p2 c2 check +permutation r1 p1 w3 p3 r2 c3 w2 p2 c1 c2 check +permutation r1 p1 w3 p3 r2 c3 w2 p2 c2 c1 check +permutation r1 p1 w3 p3 r2 c3 w2 c1 p2 c2 check +permutation r1 p1 w3 p3 r2 c3 c1 w2 p2 c2 check +permutation r1 p1 w3 p3 w2 r2 p2 c3 c1 c2 check +permutation r1 p1 w3 p3 w2 r2 p2 c3 c2 c1 check +permutation r1 p1 w3 p3 w2 r2 c3 p2 c1 c2 check +permutation r1 p1 w3 p3 w2 r2 c3 p2 c2 c1 check +permutation r1 p1 w3 p3 w2 r2 c3 c1 p2 c2 check +permutation r1 p1 w3 p3 w2 c3 r2 p2 c1 c2 check +permutation r1 p1 w3 p3 w2 c3 r2 p2 c2 c1 check +permutation r1 p1 w3 p3 w2 c3 r2 c1 p2 c2 check +permutation r1 p1 w3 p3 w2 c3 c1 r2 p2 c2 check +permutation r1 p1 w3 p3 c3 r2 w2 p2 c1 c2 check +permutation r1 p1 w3 p3 c3 r2 w2 p2 c2 c1 check +permutation r1 p1 w3 p3 c3 r2 w2 c1 p2 c2 check +permutation r1 p1 w3 p3 c3 r2 c1 w2 p2 c2 check +permutation r1 p1 w3 p3 c3 w2 r2 p2 c1 c2 check +permutation r1 p1 w3 p3 c3 w2 r2 p2 c2 c1 check +permutation r1 p1 w3 p3 c3 w2 r2 c1 p2 c2 check +permutation r1 p1 w3 p3 c3 w2 c1 r2 p2 c2 check +permutation r1 p1 w3 p3 c3 c1 r2 w2 p2 c2 check +permutation r1 p1 w3 p3 c3 c1 w2 r2 p2 c2 check +permutation w2 r1 r2 w3 p1 p2 p3 c3 c1 c2 check +permutation w2 r1 r2 w3 p1 p2 p3 c3 c2 c1 check +permutation w2 r1 r2 w3 p1 p3 p2 c3 c1 c2 check +permutation w2 r1 r2 w3 p1 p3 p2 c3 c2 c1 check +permutation w2 r1 r2 w3 p1 p3 c3 p2 c1 c2 check +permutation w2 r1 r2 w3 p1 p3 c3 p2 c2 c1 check +permutation w2 r1 r2 w3 p1 p3 c3 c1 p2 c2 check +permutation w2 r1 r2 w3 p2 p1 p3 c3 c1 c2 check +permutation w2 r1 r2 w3 p2 p1 p3 c3 c2 c1 check +permutation w2 r1 r2 w3 p2 p3 p1 c3 c1 c2 check +permutation w2 r1 r2 w3 p2 p3 p1 c3 c2 c1 check +permutation w2 r1 r2 w3 p2 p3 c3 p1 c1 c2 check +permutation w2 r1 r2 w3 p2 p3 c3 p1 c2 c1 check +permutation w2 r1 r2 w3 p2 p3 c3 c2 p1 c1 check +permutation w2 r1 r2 w3 p3 p1 p2 c3 c1 c2 check +permutation w2 r1 r2 w3 p3 p1 p2 c3 c2 c1 check +permutation w2 r1 r2 w3 p3 p1 c3 p2 c1 c2 check +permutation w2 r1 r2 w3 p3 p1 c3 p2 c2 c1 check +permutation w2 r1 r2 w3 p3 p1 c3 c1 p2 c2 check +permutation w2 r1 r2 w3 p3 p2 p1 c3 c1 c2 check +permutation w2 r1 r2 w3 p3 p2 p1 c3 c2 c1 check +permutation w2 r1 r2 w3 p3 p2 c3 p1 c1 c2 check +permutation w2 r1 r2 w3 p3 p2 c3 p1 c2 c1 check +permutation w2 r1 r2 w3 p3 p2 c3 c2 p1 c1 check +permutation w2 r1 r2 w3 p3 c3 p1 p2 c1 c2 check +permutation w2 r1 r2 w3 p3 c3 p1 p2 c2 c1 check +permutation w2 r1 r2 w3 p3 c3 p1 c1 p2 c2 check +permutation w2 r1 r2 w3 p3 c3 p2 p1 c1 c2 check +permutation w2 r1 r2 w3 p3 c3 p2 p1 c2 c1 check +permutation w2 r1 r2 w3 p3 c3 p2 c2 p1 c1 check +permutation w2 r1 r2 p1 w3 p2 p3 c3 c1 c2 check +permutation w2 r1 r2 p1 w3 p2 p3 c3 c2 c1 check +permutation w2 r1 r2 p1 w3 p3 p2 c3 c1 c2 check +permutation w2 r1 r2 p1 w3 p3 p2 c3 c2 c1 check +permutation w2 r1 r2 p1 w3 p3 c3 p2 c1 c2 check +permutation w2 r1 r2 p1 w3 p3 c3 p2 c2 c1 check +permutation w2 r1 r2 p1 w3 p3 c3 c1 p2 c2 check +permutation w2 r1 r2 p1 p2 w3 p3 c3 c1 c2 check +permutation w2 r1 r2 p1 p2 w3 p3 c3 c2 c1 check +permutation w2 r1 r2 p2 w3 p1 p3 c3 c1 c2 check +permutation w2 r1 r2 p2 w3 p1 p3 c3 c2 c1 check +permutation w2 r1 r2 p2 w3 p3 p1 c3 c1 c2 check +permutation w2 r1 r2 p2 w3 p3 p1 c3 c2 c1 check +permutation w2 r1 r2 p2 w3 p3 c3 p1 c1 c2 check +permutation w2 r1 r2 p2 w3 p3 c3 p1 c2 c1 check +permutation w2 r1 r2 p2 w3 p3 c3 c2 p1 c1 check +permutation w2 r1 r2 p2 p1 w3 p3 c3 c1 c2 check +permutation w2 r1 r2 p2 p1 w3 p3 c3 c2 c1 check +permutation w2 r1 w3 r2 p1 p2 p3 c3 c1 c2 check +permutation w2 r1 w3 r2 p1 p2 p3 c3 c2 c1 check +permutation w2 r1 w3 r2 p1 p3 p2 c3 c1 c2 check +permutation w2 r1 w3 r2 p1 p3 p2 c3 c2 c1 check +permutation w2 r1 w3 r2 p1 p3 c3 p2 c1 c2 check +permutation w2 r1 w3 r2 p1 p3 c3 p2 c2 c1 check +permutation w2 r1 w3 r2 p1 p3 c3 c1 p2 c2 check +permutation w2 r1 w3 r2 p2 p1 p3 c3 c1 c2 check +permutation w2 r1 w3 r2 p2 p1 p3 c3 c2 c1 check +permutation w2 r1 w3 r2 p2 p3 p1 c3 c1 c2 check +permutation w2 r1 w3 r2 p2 p3 p1 c3 c2 c1 check +permutation w2 r1 w3 r2 p2 p3 c3 p1 c1 c2 check +permutation w2 r1 w3 r2 p2 p3 c3 p1 c2 c1 check +permutation w2 r1 w3 r2 p2 p3 c3 c2 p1 c1 check +permutation w2 r1 w3 r2 p3 p1 p2 c3 c1 c2 check +permutation w2 r1 w3 r2 p3 p1 p2 c3 c2 c1 check +permutation w2 r1 w3 r2 p3 p1 c3 p2 c1 c2 check +permutation w2 r1 w3 r2 p3 p1 c3 p2 c2 c1 check +permutation w2 r1 w3 r2 p3 p1 c3 c1 p2 c2 check +permutation w2 r1 w3 r2 p3 p2 p1 c3 c1 c2 check +permutation w2 r1 w3 r2 p3 p2 p1 c3 c2 c1 check +permutation w2 r1 w3 r2 p3 p2 c3 p1 c1 c2 check +permutation w2 r1 w3 r2 p3 p2 c3 p1 c2 c1 check +permutation w2 r1 w3 r2 p3 p2 c3 c2 p1 c1 check +permutation w2 r1 w3 r2 p3 c3 p1 p2 c1 c2 check +permutation w2 r1 w3 r2 p3 c3 p1 p2 c2 c1 check +permutation w2 r1 w3 r2 p3 c3 p1 c1 p2 c2 check +permutation w2 r1 w3 r2 p3 c3 p2 p1 c1 c2 check +permutation w2 r1 w3 r2 p3 c3 p2 p1 c2 c1 check +permutation w2 r1 w3 r2 p3 c3 p2 c2 p1 c1 check +permutation w2 r1 w3 p1 r2 p2 p3 c3 c1 c2 check +permutation w2 r1 w3 p1 r2 p2 p3 c3 c2 c1 check +permutation w2 r1 w3 p1 r2 p3 p2 c3 c1 c2 check +permutation w2 r1 w3 p1 r2 p3 p2 c3 c2 c1 check +permutation w2 r1 w3 p1 r2 p3 c3 p2 c1 c2 check +permutation w2 r1 w3 p1 r2 p3 c3 p2 c2 c1 check +permutation w2 r1 w3 p1 r2 p3 c3 c1 p2 c2 check +permutation w2 r1 w3 p1 p3 r2 p2 c3 c1 c2 check +permutation w2 r1 w3 p1 p3 r2 p2 c3 c2 c1 check +permutation w2 r1 w3 p1 p3 r2 c3 p2 c1 c2 check +permutation w2 r1 w3 p1 p3 r2 c3 p2 c2 c1 check +permutation w2 r1 w3 p1 p3 r2 c3 c1 p2 c2 check +permutation w2 r1 w3 p1 p3 c3 r2 p2 c1 c2 check +permutation w2 r1 w3 p1 p3 c3 r2 p2 c2 c1 check +permutation w2 r1 w3 p1 p3 c3 r2 c1 p2 c2 check +permutation w2 r1 w3 p1 p3 c3 c1 r2 p2 c2 check +permutation w2 r1 w3 p3 r2 p1 p2 c3 c1 c2 check +permutation w2 r1 w3 p3 r2 p1 p2 c3 c2 c1 check +permutation w2 r1 w3 p3 r2 p1 c3 p2 c1 c2 check +permutation w2 r1 w3 p3 r2 p1 c3 p2 c2 c1 check +permutation w2 r1 w3 p3 r2 p1 c3 c1 p2 c2 check +permutation w2 r1 w3 p3 r2 p2 p1 c3 c1 c2 check +permutation w2 r1 w3 p3 r2 p2 p1 c3 c2 c1 check +permutation w2 r1 w3 p3 r2 p2 c3 p1 c1 c2 check +permutation w2 r1 w3 p3 r2 p2 c3 p1 c2 c1 check +permutation w2 r1 w3 p3 r2 p2 c3 c2 p1 c1 check +permutation w2 r1 w3 p3 r2 c3 p1 p2 c1 c2 check +permutation w2 r1 w3 p3 r2 c3 p1 p2 c2 c1 check +permutation w2 r1 w3 p3 r2 c3 p1 c1 p2 c2 check +permutation w2 r1 w3 p3 r2 c3 p2 p1 c1 c2 check +permutation w2 r1 w3 p3 r2 c3 p2 p1 c2 c1 check +permutation w2 r1 w3 p3 r2 c3 p2 c2 p1 c1 check +permutation w2 r1 w3 p3 p1 r2 p2 c3 c1 c2 check +permutation w2 r1 w3 p3 p1 r2 p2 c3 c2 c1 check +permutation w2 r1 w3 p3 p1 r2 c3 p2 c1 c2 check +permutation w2 r1 w3 p3 p1 r2 c3 p2 c2 c1 check +permutation w2 r1 w3 p3 p1 r2 c3 c1 p2 c2 check +permutation w2 r1 w3 p3 p1 c3 r2 p2 c1 c2 check +permutation w2 r1 w3 p3 p1 c3 r2 p2 c2 c1 check +permutation w2 r1 w3 p3 p1 c3 r2 c1 p2 c2 check +permutation w2 r1 w3 p3 p1 c3 c1 r2 p2 c2 check +permutation w2 r1 w3 p3 c3 r2 p1 p2 c1 c2 check +permutation w2 r1 w3 p3 c3 r2 p1 p2 c2 c1 check +permutation w2 r1 w3 p3 c3 r2 p1 c1 p2 c2 check +permutation w2 r1 w3 p3 c3 r2 p2 p1 c1 c2 check +permutation w2 r1 w3 p3 c3 r2 p2 p1 c2 c1 check +permutation w2 r1 w3 p3 c3 r2 p2 c2 p1 c1 check +permutation w2 r1 w3 p3 c3 p1 r2 p2 c1 c2 check +permutation w2 r1 w3 p3 c3 p1 r2 p2 c2 c1 check +permutation w2 r1 w3 p3 c3 p1 r2 c1 p2 c2 check +permutation w2 r1 w3 p3 c3 p1 c1 r2 p2 c2 check +permutation w2 r1 p1 r2 w3 p2 p3 c3 c1 c2 check +permutation w2 r1 p1 r2 w3 p2 p3 c3 c2 c1 check +permutation w2 r1 p1 r2 w3 p3 p2 c3 c1 c2 check +permutation w2 r1 p1 r2 w3 p3 p2 c3 c2 c1 check +permutation w2 r1 p1 r2 w3 p3 c3 p2 c1 c2 check +permutation w2 r1 p1 r2 w3 p3 c3 p2 c2 c1 check +permutation w2 r1 p1 r2 w3 p3 c3 c1 p2 c2 check +permutation w2 r1 p1 r2 p2 w3 p3 c3 c1 c2 check +permutation w2 r1 p1 r2 p2 w3 p3 c3 c2 c1 check +permutation w2 r1 p1 w3 r2 p2 p3 c3 c1 c2 check +permutation w2 r1 p1 w3 r2 p2 p3 c3 c2 c1 check +permutation w2 r1 p1 w3 r2 p3 p2 c3 c1 c2 check +permutation w2 r1 p1 w3 r2 p3 p2 c3 c2 c1 check +permutation w2 r1 p1 w3 r2 p3 c3 p2 c1 c2 check +permutation w2 r1 p1 w3 r2 p3 c3 p2 c2 c1 check +permutation w2 r1 p1 w3 r2 p3 c3 c1 p2 c2 check +permutation w2 r1 p1 w3 p3 r2 p2 c3 c1 c2 check +permutation w2 r1 p1 w3 p3 r2 p2 c3 c2 c1 check +permutation w2 r1 p1 w3 p3 r2 c3 p2 c1 c2 check +permutation w2 r1 p1 w3 p3 r2 c3 p2 c2 c1 check +permutation w2 r1 p1 w3 p3 r2 c3 c1 p2 c2 check +permutation w2 r1 p1 w3 p3 c3 r2 p2 c1 c2 check +permutation w2 r1 p1 w3 p3 c3 r2 p2 c2 c1 check +permutation w2 r1 p1 w3 p3 c3 r2 c1 p2 c2 check +permutation w2 r1 p1 w3 p3 c3 c1 r2 p2 c2 check +permutation w3 r1 r2 w2 p1 p2 p3 c3 c1 c2 check +permutation w3 r1 r2 w2 p1 p2 p3 c3 c2 c1 check +permutation w3 r1 r2 w2 p1 p3 p2 c3 c1 c2 check +permutation w3 r1 r2 w2 p1 p3 p2 c3 c2 c1 check +permutation w3 r1 r2 w2 p1 p3 c3 p2 c1 c2 check +permutation w3 r1 r2 w2 p1 p3 c3 p2 c2 c1 check +permutation w3 r1 r2 w2 p1 p3 c3 c1 p2 c2 check +permutation w3 r1 r2 w2 p2 p1 p3 c3 c1 c2 check +permutation w3 r1 r2 w2 p2 p1 p3 c3 c2 c1 check +permutation w3 r1 r2 w2 p2 p3 p1 c3 c1 c2 check +permutation w3 r1 r2 w2 p2 p3 p1 c3 c2 c1 check +permutation w3 r1 r2 w2 p2 p3 c3 p1 c1 c2 check +permutation w3 r1 r2 w2 p2 p3 c3 p1 c2 c1 check +permutation w3 r1 r2 w2 p2 p3 c3 c2 p1 c1 check +permutation w3 r1 r2 w2 p3 p1 p2 c3 c1 c2 check +permutation w3 r1 r2 w2 p3 p1 p2 c3 c2 c1 check +permutation w3 r1 r2 w2 p3 p1 c3 p2 c1 c2 check +permutation w3 r1 r2 w2 p3 p1 c3 p2 c2 c1 check +permutation w3 r1 r2 w2 p3 p1 c3 c1 p2 c2 check +permutation w3 r1 r2 w2 p3 p2 p1 c3 c1 c2 check +permutation w3 r1 r2 w2 p3 p2 p1 c3 c2 c1 check +permutation w3 r1 r2 w2 p3 p2 c3 p1 c1 c2 check +permutation w3 r1 r2 w2 p3 p2 c3 p1 c2 c1 check +permutation w3 r1 r2 w2 p3 p2 c3 c2 p1 c1 check +permutation w3 r1 r2 w2 p3 c3 p1 p2 c1 c2 check +permutation w3 r1 r2 w2 p3 c3 p1 p2 c2 c1 check +permutation w3 r1 r2 w2 p3 c3 p1 c1 p2 c2 check +permutation w3 r1 r2 w2 p3 c3 p2 p1 c1 c2 check +permutation w3 r1 r2 w2 p3 c3 p2 p1 c2 c1 check +permutation w3 r1 r2 w2 p3 c3 p2 c2 p1 c1 check +permutation w3 r1 r2 p1 w2 p2 p3 c3 c1 c2 check +permutation w3 r1 r2 p1 w2 p2 p3 c3 c2 c1 check +permutation w3 r1 r2 p1 w2 p3 p2 c3 c1 c2 check +permutation w3 r1 r2 p1 w2 p3 p2 c3 c2 c1 check +permutation w3 r1 r2 p1 w2 p3 c3 p2 c1 c2 check +permutation w3 r1 r2 p1 w2 p3 c3 p2 c2 c1 check +permutation w3 r1 r2 p1 w2 p3 c3 c1 p2 c2 check +permutation w3 r1 r2 p1 p3 w2 p2 c3 c1 c2 check +permutation w3 r1 r2 p1 p3 w2 p2 c3 c2 c1 check +permutation w3 r1 r2 p1 p3 w2 c3 p2 c1 c2 check +permutation w3 r1 r2 p1 p3 w2 c3 p2 c2 c1 check +permutation w3 r1 r2 p1 p3 w2 c3 c1 p2 c2 check +permutation w3 r1 r2 p1 p3 c3 w2 p2 c1 c2 check +permutation w3 r1 r2 p1 p3 c3 w2 p2 c2 c1 check +permutation w3 r1 r2 p1 p3 c3 w2 c1 p2 c2 check +permutation w3 r1 r2 p1 p3 c3 c1 w2 p2 c2 check +permutation w3 r1 r2 p3 w2 p1 p2 c3 c1 c2 check +permutation w3 r1 r2 p3 w2 p1 p2 c3 c2 c1 check +permutation w3 r1 r2 p3 w2 p1 c3 p2 c1 c2 check +permutation w3 r1 r2 p3 w2 p1 c3 p2 c2 c1 check +permutation w3 r1 r2 p3 w2 p1 c3 c1 p2 c2 check +permutation w3 r1 r2 p3 w2 p2 p1 c3 c1 c2 check +permutation w3 r1 r2 p3 w2 p2 p1 c3 c2 c1 check +permutation w3 r1 r2 p3 w2 p2 c3 p1 c1 c2 check +permutation w3 r1 r2 p3 w2 p2 c3 p1 c2 c1 check +permutation w3 r1 r2 p3 w2 p2 c3 c2 p1 c1 check +permutation w3 r1 r2 p3 w2 c3 p1 p2 c1 c2 check +permutation w3 r1 r2 p3 w2 c3 p1 p2 c2 c1 check +permutation w3 r1 r2 p3 w2 c3 p1 c1 p2 c2 check +permutation w3 r1 r2 p3 w2 c3 p2 p1 c1 c2 check +permutation w3 r1 r2 p3 w2 c3 p2 p1 c2 c1 check +permutation w3 r1 r2 p3 w2 c3 p2 c2 p1 c1 check +permutation w3 r1 r2 p3 p1 w2 p2 c3 c1 c2 check +permutation w3 r1 r2 p3 p1 w2 p2 c3 c2 c1 check +permutation w3 r1 r2 p3 p1 w2 c3 p2 c1 c2 check +permutation w3 r1 r2 p3 p1 w2 c3 p2 c2 c1 check +permutation w3 r1 r2 p3 p1 w2 c3 c1 p2 c2 check +permutation w3 r1 r2 p3 p1 c3 w2 p2 c1 c2 check +permutation w3 r1 r2 p3 p1 c3 w2 p2 c2 c1 check +permutation w3 r1 r2 p3 p1 c3 w2 c1 p2 c2 check +permutation w3 r1 r2 p3 p1 c3 c1 w2 p2 c2 check +permutation w3 r1 r2 p3 c3 w2 p1 p2 c1 c2 check +permutation w3 r1 r2 p3 c3 w2 p1 p2 c2 c1 check +permutation w3 r1 r2 p3 c3 w2 p1 c1 p2 c2 check +permutation w3 r1 r2 p3 c3 w2 p2 p1 c1 c2 check +permutation w3 r1 r2 p3 c3 w2 p2 p1 c2 c1 check +permutation w3 r1 r2 p3 c3 w2 p2 c2 p1 c1 check +permutation w3 r1 r2 p3 c3 p1 w2 p2 c1 c2 check +permutation w3 r1 r2 p3 c3 p1 w2 p2 c2 c1 check +permutation w3 r1 r2 p3 c3 p1 w2 c1 p2 c2 check +permutation w3 r1 r2 p3 c3 p1 c1 w2 p2 c2 check +permutation w3 r1 w2 r2 p1 p2 p3 c3 c1 c2 check +permutation w3 r1 w2 r2 p1 p2 p3 c3 c2 c1 check +permutation w3 r1 w2 r2 p1 p3 p2 c3 c1 c2 check +permutation w3 r1 w2 r2 p1 p3 p2 c3 c2 c1 check +permutation w3 r1 w2 r2 p1 p3 c3 p2 c1 c2 check +permutation w3 r1 w2 r2 p1 p3 c3 p2 c2 c1 check +permutation w3 r1 w2 r2 p1 p3 c3 c1 p2 c2 check +permutation w3 r1 w2 r2 p2 p1 p3 c3 c1 c2 check +permutation w3 r1 w2 r2 p2 p1 p3 c3 c2 c1 check +permutation w3 r1 w2 r2 p2 p3 p1 c3 c1 c2 check +permutation w3 r1 w2 r2 p2 p3 p1 c3 c2 c1 check +permutation w3 r1 w2 r2 p2 p3 c3 p1 c1 c2 check +permutation w3 r1 w2 r2 p2 p3 c3 p1 c2 c1 check +permutation w3 r1 w2 r2 p2 p3 c3 c2 p1 c1 check +permutation w3 r1 w2 r2 p3 p1 p2 c3 c1 c2 check +permutation w3 r1 w2 r2 p3 p1 p2 c3 c2 c1 check +permutation w3 r1 w2 r2 p3 p1 c3 p2 c1 c2 check +permutation w3 r1 w2 r2 p3 p1 c3 p2 c2 c1 check +permutation w3 r1 w2 r2 p3 p1 c3 c1 p2 c2 check +permutation w3 r1 w2 r2 p3 p2 p1 c3 c1 c2 check +permutation w3 r1 w2 r2 p3 p2 p1 c3 c2 c1 check +permutation w3 r1 w2 r2 p3 p2 c3 p1 c1 c2 check +permutation w3 r1 w2 r2 p3 p2 c3 p1 c2 c1 check +permutation w3 r1 w2 r2 p3 p2 c3 c2 p1 c1 check +permutation w3 r1 w2 r2 p3 c3 p1 p2 c1 c2 check +permutation w3 r1 w2 r2 p3 c3 p1 p2 c2 c1 check +permutation w3 r1 w2 r2 p3 c3 p1 c1 p2 c2 check +permutation w3 r1 w2 r2 p3 c3 p2 p1 c1 c2 check +permutation w3 r1 w2 r2 p3 c3 p2 p1 c2 c1 check +permutation w3 r1 w2 r2 p3 c3 p2 c2 p1 c1 check +permutation w3 r1 w2 p1 r2 p2 p3 c3 c1 c2 check +permutation w3 r1 w2 p1 r2 p2 p3 c3 c2 c1 check +permutation w3 r1 w2 p1 r2 p3 p2 c3 c1 c2 check +permutation w3 r1 w2 p1 r2 p3 p2 c3 c2 c1 check +permutation w3 r1 w2 p1 r2 p3 c3 p2 c1 c2 check +permutation w3 r1 w2 p1 r2 p3 c3 p2 c2 c1 check +permutation w3 r1 w2 p1 r2 p3 c3 c1 p2 c2 check +permutation w3 r1 w2 p1 p3 r2 p2 c3 c1 c2 check +permutation w3 r1 w2 p1 p3 r2 p2 c3 c2 c1 check +permutation w3 r1 w2 p1 p3 r2 c3 p2 c1 c2 check +permutation w3 r1 w2 p1 p3 r2 c3 p2 c2 c1 check +permutation w3 r1 w2 p1 p3 r2 c3 c1 p2 c2 check +permutation w3 r1 w2 p1 p3 c3 r2 p2 c1 c2 check +permutation w3 r1 w2 p1 p3 c3 r2 p2 c2 c1 check +permutation w3 r1 w2 p1 p3 c3 r2 c1 p2 c2 check +permutation w3 r1 w2 p1 p3 c3 c1 r2 p2 c2 check +permutation w3 r1 w2 p3 r2 p1 p2 c3 c1 c2 check +permutation w3 r1 w2 p3 r2 p1 p2 c3 c2 c1 check +permutation w3 r1 w2 p3 r2 p1 c3 p2 c1 c2 check +permutation w3 r1 w2 p3 r2 p1 c3 p2 c2 c1 check +permutation w3 r1 w2 p3 r2 p1 c3 c1 p2 c2 check +permutation w3 r1 w2 p3 r2 p2 p1 c3 c1 c2 check +permutation w3 r1 w2 p3 r2 p2 p1 c3 c2 c1 check +permutation w3 r1 w2 p3 r2 p2 c3 p1 c1 c2 check +permutation w3 r1 w2 p3 r2 p2 c3 p1 c2 c1 check +permutation w3 r1 w2 p3 r2 p2 c3 c2 p1 c1 check +permutation w3 r1 w2 p3 r2 c3 p1 p2 c1 c2 check +permutation w3 r1 w2 p3 r2 c3 p1 p2 c2 c1 check +permutation w3 r1 w2 p3 r2 c3 p1 c1 p2 c2 check +permutation w3 r1 w2 p3 r2 c3 p2 p1 c1 c2 check +permutation w3 r1 w2 p3 r2 c3 p2 p1 c2 c1 check +permutation w3 r1 w2 p3 r2 c3 p2 c2 p1 c1 check +permutation w3 r1 w2 p3 p1 r2 p2 c3 c1 c2 check +permutation w3 r1 w2 p3 p1 r2 p2 c3 c2 c1 check +permutation w3 r1 w2 p3 p1 r2 c3 p2 c1 c2 check +permutation w3 r1 w2 p3 p1 r2 c3 p2 c2 c1 check +permutation w3 r1 w2 p3 p1 r2 c3 c1 p2 c2 check +permutation w3 r1 w2 p3 p1 c3 r2 p2 c1 c2 check +permutation w3 r1 w2 p3 p1 c3 r2 p2 c2 c1 check +permutation w3 r1 w2 p3 p1 c3 r2 c1 p2 c2 check +permutation w3 r1 w2 p3 p1 c3 c1 r2 p2 c2 check +permutation w3 r1 w2 p3 c3 r2 p1 p2 c1 c2 check +permutation w3 r1 w2 p3 c3 r2 p1 p2 c2 c1 check +permutation w3 r1 w2 p3 c3 r2 p1 c1 p2 c2 check +permutation w3 r1 w2 p3 c3 r2 p2 p1 c1 c2 check +permutation w3 r1 w2 p3 c3 r2 p2 p1 c2 c1 check +permutation w3 r1 w2 p3 c3 r2 p2 c2 p1 c1 check +permutation w3 r1 w2 p3 c3 p1 r2 p2 c1 c2 check +permutation w3 r1 w2 p3 c3 p1 r2 p2 c2 c1 check +permutation w3 r1 w2 p3 c3 p1 r2 c1 p2 c2 check +permutation w3 r1 w2 p3 c3 p1 c1 r2 p2 c2 check +permutation w3 r1 p1 r2 w2 p2 p3 c3 c1 c2 check +permutation w3 r1 p1 r2 w2 p2 p3 c3 c2 c1 check +permutation w3 r1 p1 r2 w2 p3 p2 c3 c1 c2 check +permutation w3 r1 p1 r2 w2 p3 p2 c3 c2 c1 check +permutation w3 r1 p1 r2 w2 p3 c3 p2 c1 c2 check +permutation w3 r1 p1 r2 w2 p3 c3 p2 c2 c1 check +permutation w3 r1 p1 r2 w2 p3 c3 c1 p2 c2 check +permutation w3 r1 p1 r2 p3 w2 p2 c3 c1 c2 check +permutation w3 r1 p1 r2 p3 w2 p2 c3 c2 c1 check +permutation w3 r1 p1 r2 p3 w2 c3 p2 c1 c2 check +permutation w3 r1 p1 r2 p3 w2 c3 p2 c2 c1 check +permutation w3 r1 p1 r2 p3 w2 c3 c1 p2 c2 check +permutation w3 r1 p1 r2 p3 c3 w2 p2 c1 c2 check +permutation w3 r1 p1 r2 p3 c3 w2 p2 c2 c1 check +permutation w3 r1 p1 r2 p3 c3 w2 c1 p2 c2 check +permutation w3 r1 p1 r2 p3 c3 c1 w2 p2 c2 check +permutation w3 r1 p1 w2 r2 p2 p3 c3 c1 c2 check +permutation w3 r1 p1 w2 r2 p2 p3 c3 c2 c1 check +permutation w3 r1 p1 w2 r2 p3 p2 c3 c1 c2 check +permutation w3 r1 p1 w2 r2 p3 p2 c3 c2 c1 check +permutation w3 r1 p1 w2 r2 p3 c3 p2 c1 c2 check +permutation w3 r1 p1 w2 r2 p3 c3 p2 c2 c1 check +permutation w3 r1 p1 w2 r2 p3 c3 c1 p2 c2 check +permutation w3 r1 p1 w2 p3 r2 p2 c3 c1 c2 check +permutation w3 r1 p1 w2 p3 r2 p2 c3 c2 c1 check +permutation w3 r1 p1 w2 p3 r2 c3 p2 c1 c2 check +permutation w3 r1 p1 w2 p3 r2 c3 p2 c2 c1 check +permutation w3 r1 p1 w2 p3 r2 c3 c1 p2 c2 check +permutation w3 r1 p1 w2 p3 c3 r2 p2 c1 c2 check +permutation w3 r1 p1 w2 p3 c3 r2 p2 c2 c1 check +permutation w3 r1 p1 w2 p3 c3 r2 c1 p2 c2 check +permutation w3 r1 p1 w2 p3 c3 c1 r2 p2 c2 check +permutation w3 r1 p1 p3 r2 w2 p2 c3 c1 c2 check +permutation w3 r1 p1 p3 r2 w2 p2 c3 c2 c1 check +permutation w3 r1 p1 p3 r2 w2 c3 p2 c1 c2 check +permutation w3 r1 p1 p3 r2 w2 c3 p2 c2 c1 check +permutation w3 r1 p1 p3 r2 w2 c3 c1 p2 c2 check +permutation w3 r1 p1 p3 r2 c3 w2 p2 c1 c2 check +permutation w3 r1 p1 p3 r2 c3 w2 p2 c2 c1 check +permutation w3 r1 p1 p3 r2 c3 w2 c1 p2 c2 check +permutation w3 r1 p1 p3 r2 c3 c1 w2 p2 c2 check +permutation w3 r1 p1 p3 w2 r2 p2 c3 c1 c2 check +permutation w3 r1 p1 p3 w2 r2 p2 c3 c2 c1 check +permutation w3 r1 p1 p3 w2 r2 c3 p2 c1 c2 check +permutation w3 r1 p1 p3 w2 r2 c3 p2 c2 c1 check +permutation w3 r1 p1 p3 w2 r2 c3 c1 p2 c2 check +permutation w3 r1 p1 p3 w2 c3 r2 p2 c1 c2 check +permutation w3 r1 p1 p3 w2 c3 r2 p2 c2 c1 check +permutation w3 r1 p1 p3 w2 c3 r2 c1 p2 c2 check +permutation w3 r1 p1 p3 w2 c3 c1 r2 p2 c2 check +permutation w3 r1 p1 p3 c3 r2 w2 p2 c1 c2 check +permutation w3 r1 p1 p3 c3 r2 w2 p2 c2 c1 check +permutation w3 r1 p1 p3 c3 r2 w2 c1 p2 c2 check +permutation w3 r1 p1 p3 c3 r2 c1 w2 p2 c2 check +permutation w3 r1 p1 p3 c3 w2 r2 p2 c1 c2 check +permutation w3 r1 p1 p3 c3 w2 r2 p2 c2 c1 check +permutation w3 r1 p1 p3 c3 w2 r2 c1 p2 c2 check +permutation w3 r1 p1 p3 c3 w2 c1 r2 p2 c2 check +permutation w3 r1 p1 p3 c3 c1 r2 w2 p2 c2 check +permutation w3 r1 p1 p3 c3 c1 w2 r2 p2 c2 check +permutation w3 r1 p3 r2 w2 p1 p2 c3 c1 c2 check +permutation w3 r1 p3 r2 w2 p1 p2 c3 c2 c1 check +permutation w3 r1 p3 r2 w2 p1 c3 p2 c1 c2 check +permutation w3 r1 p3 r2 w2 p1 c3 p2 c2 c1 check +permutation w3 r1 p3 r2 w2 p1 c3 c1 p2 c2 check +permutation w3 r1 p3 r2 w2 p2 p1 c3 c1 c2 check +permutation w3 r1 p3 r2 w2 p2 p1 c3 c2 c1 check +permutation w3 r1 p3 r2 w2 p2 c3 p1 c1 c2 check +permutation w3 r1 p3 r2 w2 p2 c3 p1 c2 c1 check +permutation w3 r1 p3 r2 w2 p2 c3 c2 p1 c1 check +permutation w3 r1 p3 r2 w2 c3 p1 p2 c1 c2 check +permutation w3 r1 p3 r2 w2 c3 p1 p2 c2 c1 check +permutation w3 r1 p3 r2 w2 c3 p1 c1 p2 c2 check +permutation w3 r1 p3 r2 w2 c3 p2 p1 c1 c2 check +permutation w3 r1 p3 r2 w2 c3 p2 p1 c2 c1 check +permutation w3 r1 p3 r2 w2 c3 p2 c2 p1 c1 check +permutation w3 r1 p3 r2 p1 w2 p2 c3 c1 c2 check +permutation w3 r1 p3 r2 p1 w2 p2 c3 c2 c1 check +permutation w3 r1 p3 r2 p1 w2 c3 p2 c1 c2 check +permutation w3 r1 p3 r2 p1 w2 c3 p2 c2 c1 check +permutation w3 r1 p3 r2 p1 w2 c3 c1 p2 c2 check +permutation w3 r1 p3 r2 p1 c3 w2 p2 c1 c2 check +permutation w3 r1 p3 r2 p1 c3 w2 p2 c2 c1 check +permutation w3 r1 p3 r2 p1 c3 w2 c1 p2 c2 check +permutation w3 r1 p3 r2 p1 c3 c1 w2 p2 c2 check +permutation w3 r1 p3 r2 c3 w2 p1 p2 c1 c2 check +permutation w3 r1 p3 r2 c3 w2 p1 p2 c2 c1 check +permutation w3 r1 p3 r2 c3 w2 p1 c1 p2 c2 check +permutation w3 r1 p3 r2 c3 w2 p2 p1 c1 c2 check +permutation w3 r1 p3 r2 c3 w2 p2 p1 c2 c1 check +permutation w3 r1 p3 r2 c3 w2 p2 c2 p1 c1 check +permutation w3 r1 p3 r2 c3 p1 w2 p2 c1 c2 check +permutation w3 r1 p3 r2 c3 p1 w2 p2 c2 c1 check +permutation w3 r1 p3 r2 c3 p1 w2 c1 p2 c2 check +permutation w3 r1 p3 r2 c3 p1 c1 w2 p2 c2 check +permutation w3 r1 p3 w2 r2 p1 p2 c3 c1 c2 check +permutation w3 r1 p3 w2 r2 p1 p2 c3 c2 c1 check +permutation w3 r1 p3 w2 r2 p1 c3 p2 c1 c2 check +permutation w3 r1 p3 w2 r2 p1 c3 p2 c2 c1 check +permutation w3 r1 p3 w2 r2 p1 c3 c1 p2 c2 check +permutation w3 r1 p3 w2 r2 p2 p1 c3 c1 c2 check +permutation w3 r1 p3 w2 r2 p2 p1 c3 c2 c1 check +permutation w3 r1 p3 w2 r2 p2 c3 p1 c1 c2 check +permutation w3 r1 p3 w2 r2 p2 c3 p1 c2 c1 check +permutation w3 r1 p3 w2 r2 p2 c3 c2 p1 c1 check +permutation w3 r1 p3 w2 r2 c3 p1 p2 c1 c2 check +permutation w3 r1 p3 w2 r2 c3 p1 p2 c2 c1 check +permutation w3 r1 p3 w2 r2 c3 p1 c1 p2 c2 check +permutation w3 r1 p3 w2 r2 c3 p2 p1 c1 c2 check +permutation w3 r1 p3 w2 r2 c3 p2 p1 c2 c1 check +permutation w3 r1 p3 w2 r2 c3 p2 c2 p1 c1 check +permutation w3 r1 p3 w2 p1 r2 p2 c3 c1 c2 check +permutation w3 r1 p3 w2 p1 r2 p2 c3 c2 c1 check +permutation w3 r1 p3 w2 p1 r2 c3 p2 c1 c2 check +permutation w3 r1 p3 w2 p1 r2 c3 p2 c2 c1 check +permutation w3 r1 p3 w2 p1 r2 c3 c1 p2 c2 check +permutation w3 r1 p3 w2 p1 c3 r2 p2 c1 c2 check +permutation w3 r1 p3 w2 p1 c3 r2 p2 c2 c1 check +permutation w3 r1 p3 w2 p1 c3 r2 c1 p2 c2 check +permutation w3 r1 p3 w2 p1 c3 c1 r2 p2 c2 check +permutation w3 r1 p3 w2 c3 r2 p1 p2 c1 c2 check +permutation w3 r1 p3 w2 c3 r2 p1 p2 c2 c1 check +permutation w3 r1 p3 w2 c3 r2 p1 c1 p2 c2 check +permutation w3 r1 p3 w2 c3 r2 p2 p1 c1 c2 check +permutation w3 r1 p3 w2 c3 r2 p2 p1 c2 c1 check +permutation w3 r1 p3 w2 c3 r2 p2 c2 p1 c1 check +permutation w3 r1 p3 w2 c3 p1 r2 p2 c1 c2 check +permutation w3 r1 p3 w2 c3 p1 r2 p2 c2 c1 check +permutation w3 r1 p3 w2 c3 p1 r2 c1 p2 c2 check +permutation w3 r1 p3 w2 c3 p1 c1 r2 p2 c2 check +permutation w3 r1 p3 p1 r2 w2 p2 c3 c1 c2 check +permutation w3 r1 p3 p1 r2 w2 p2 c3 c2 c1 check +permutation w3 r1 p3 p1 r2 w2 c3 p2 c1 c2 check +permutation w3 r1 p3 p1 r2 w2 c3 p2 c2 c1 check +permutation w3 r1 p3 p1 r2 w2 c3 c1 p2 c2 check +permutation w3 r1 p3 p1 r2 c3 w2 p2 c1 c2 check +permutation w3 r1 p3 p1 r2 c3 w2 p2 c2 c1 check +permutation w3 r1 p3 p1 r2 c3 w2 c1 p2 c2 check +permutation w3 r1 p3 p1 r2 c3 c1 w2 p2 c2 check +permutation w3 r1 p3 p1 w2 r2 p2 c3 c1 c2 check +permutation w3 r1 p3 p1 w2 r2 p2 c3 c2 c1 check +permutation w3 r1 p3 p1 w2 r2 c3 p2 c1 c2 check +permutation w3 r1 p3 p1 w2 r2 c3 p2 c2 c1 check +permutation w3 r1 p3 p1 w2 r2 c3 c1 p2 c2 check +permutation w3 r1 p3 p1 w2 c3 r2 p2 c1 c2 check +permutation w3 r1 p3 p1 w2 c3 r2 p2 c2 c1 check +permutation w3 r1 p3 p1 w2 c3 r2 c1 p2 c2 check +permutation w3 r1 p3 p1 w2 c3 c1 r2 p2 c2 check +permutation w3 r1 p3 p1 c3 r2 w2 p2 c1 c2 check +permutation w3 r1 p3 p1 c3 r2 w2 p2 c2 c1 check +permutation w3 r1 p3 p1 c3 r2 w2 c1 p2 c2 check +permutation w3 r1 p3 p1 c3 r2 c1 w2 p2 c2 check +permutation w3 r1 p3 p1 c3 w2 r2 p2 c1 c2 check +permutation w3 r1 p3 p1 c3 w2 r2 p2 c2 c1 check +permutation w3 r1 p3 p1 c3 w2 r2 c1 p2 c2 check +permutation w3 r1 p3 p1 c3 w2 c1 r2 p2 c2 check +permutation w3 r1 p3 p1 c3 c1 r2 w2 p2 c2 check +permutation w3 r1 p3 p1 c3 c1 w2 r2 p2 c2 check +permutation w3 r1 p3 c3 r2 w2 p1 p2 c1 c2 check +permutation w3 r1 p3 c3 r2 w2 p1 p2 c2 c1 check +permutation w3 r1 p3 c3 r2 w2 p1 c1 p2 c2 check +permutation w3 r1 p3 c3 r2 w2 p2 p1 c1 c2 check +permutation w3 r1 p3 c3 r2 w2 p2 p1 c2 c1 check +permutation w3 r1 p3 c3 r2 w2 p2 c2 p1 c1 check +permutation w3 r1 p3 c3 r2 p1 w2 p2 c1 c2 check +permutation w3 r1 p3 c3 r2 p1 w2 p2 c2 c1 check +permutation w3 r1 p3 c3 r2 p1 w2 c1 p2 c2 check +permutation w3 r1 p3 c3 r2 p1 c1 w2 p2 c2 check +permutation w3 r1 p3 c3 w2 r2 p1 p2 c1 c2 check +permutation w3 r1 p3 c3 w2 r2 p1 p2 c2 c1 check +permutation w3 r1 p3 c3 w2 r2 p1 c1 p2 c2 check +permutation w3 r1 p3 c3 w2 r2 p2 p1 c1 c2 check +permutation w3 r1 p3 c3 w2 r2 p2 p1 c2 c1 check +permutation w3 r1 p3 c3 w2 r2 p2 c2 p1 c1 check +permutation w3 r1 p3 c3 w2 p1 r2 p2 c1 c2 check +permutation w3 r1 p3 c3 w2 p1 r2 p2 c2 c1 check +permutation w3 r1 p3 c3 w2 p1 r2 c1 p2 c2 check +permutation w3 r1 p3 c3 w2 p1 c1 r2 p2 c2 check +permutation w3 r1 p3 c3 p1 r2 w2 p2 c1 c2 check +permutation w3 r1 p3 c3 p1 r2 w2 p2 c2 c1 check +permutation w3 r1 p3 c3 p1 r2 w2 c1 p2 c2 check +permutation w3 r1 p3 c3 p1 r2 c1 w2 p2 c2 check +permutation w3 r1 p3 c3 p1 w2 r2 p2 c1 c2 check +permutation w3 r1 p3 c3 p1 w2 r2 p2 c2 c1 check +permutation w3 r1 p3 c3 p1 w2 r2 c1 p2 c2 check +permutation w3 r1 p3 c3 p1 w2 c1 r2 p2 c2 check +permutation w3 r1 p3 c3 p1 c1 r2 w2 p2 c2 check +permutation w3 r1 p3 c3 p1 c1 w2 r2 p2 c2 check +permutation w3 r2 r1 w2 p1 p2 p3 c3 c1 c2 check +permutation w3 r2 r1 w2 p1 p2 p3 c3 c2 c1 check +permutation w3 r2 r1 w2 p1 p3 p2 c3 c1 c2 check +permutation w3 r2 r1 w2 p1 p3 p2 c3 c2 c1 check +permutation w3 r2 r1 w2 p1 p3 c3 p2 c1 c2 check +permutation w3 r2 r1 w2 p1 p3 c3 p2 c2 c1 check +permutation w3 r2 r1 w2 p1 p3 c3 c1 p2 c2 check +permutation w3 r2 r1 w2 p2 p1 p3 c3 c1 c2 check +permutation w3 r2 r1 w2 p2 p1 p3 c3 c2 c1 check +permutation w3 r2 r1 w2 p2 p3 p1 c3 c1 c2 check +permutation w3 r2 r1 w2 p2 p3 p1 c3 c2 c1 check +permutation w3 r2 r1 w2 p2 p3 c3 p1 c1 c2 check +permutation w3 r2 r1 w2 p2 p3 c3 p1 c2 c1 check +permutation w3 r2 r1 w2 p2 p3 c3 c2 p1 c1 check +permutation w3 r2 r1 w2 p3 p1 p2 c3 c1 c2 check +permutation w3 r2 r1 w2 p3 p1 p2 c3 c2 c1 check +permutation w3 r2 r1 w2 p3 p1 c3 p2 c1 c2 check +permutation w3 r2 r1 w2 p3 p1 c3 p2 c2 c1 check +permutation w3 r2 r1 w2 p3 p1 c3 c1 p2 c2 check +permutation w3 r2 r1 w2 p3 p2 p1 c3 c1 c2 check +permutation w3 r2 r1 w2 p3 p2 p1 c3 c2 c1 check +permutation w3 r2 r1 w2 p3 p2 c3 p1 c1 c2 check +permutation w3 r2 r1 w2 p3 p2 c3 p1 c2 c1 check +permutation w3 r2 r1 w2 p3 p2 c3 c2 p1 c1 check +permutation w3 r2 r1 w2 p3 c3 p1 p2 c1 c2 check +permutation w3 r2 r1 w2 p3 c3 p1 p2 c2 c1 check +permutation w3 r2 r1 w2 p3 c3 p1 c1 p2 c2 check +permutation w3 r2 r1 w2 p3 c3 p2 p1 c1 c2 check +permutation w3 r2 r1 w2 p3 c3 p2 p1 c2 c1 check +permutation w3 r2 r1 w2 p3 c3 p2 c2 p1 c1 check +permutation w3 r2 r1 p1 w2 p2 p3 c3 c1 c2 check +permutation w3 r2 r1 p1 w2 p2 p3 c3 c2 c1 check +permutation w3 r2 r1 p1 w2 p3 p2 c3 c1 c2 check +permutation w3 r2 r1 p1 w2 p3 p2 c3 c2 c1 check +permutation w3 r2 r1 p1 w2 p3 c3 p2 c1 c2 check +permutation w3 r2 r1 p1 w2 p3 c3 p2 c2 c1 check +permutation w3 r2 r1 p1 w2 p3 c3 c1 p2 c2 check +permutation w3 r2 r1 p1 p3 w2 p2 c3 c1 c2 check +permutation w3 r2 r1 p1 p3 w2 p2 c3 c2 c1 check +permutation w3 r2 r1 p1 p3 w2 c3 p2 c1 c2 check +permutation w3 r2 r1 p1 p3 w2 c3 p2 c2 c1 check +permutation w3 r2 r1 p1 p3 w2 c3 c1 p2 c2 check +permutation w3 r2 r1 p1 p3 c3 w2 p2 c1 c2 check +permutation w3 r2 r1 p1 p3 c3 w2 p2 c2 c1 check +permutation w3 r2 r1 p1 p3 c3 w2 c1 p2 c2 check +permutation w3 r2 r1 p1 p3 c3 c1 w2 p2 c2 check +permutation w3 r2 r1 p3 w2 p1 p2 c3 c1 c2 check +permutation w3 r2 r1 p3 w2 p1 p2 c3 c2 c1 check +permutation w3 r2 r1 p3 w2 p1 c3 p2 c1 c2 check +permutation w3 r2 r1 p3 w2 p1 c3 p2 c2 c1 check +permutation w3 r2 r1 p3 w2 p1 c3 c1 p2 c2 check +permutation w3 r2 r1 p3 w2 p2 p1 c3 c1 c2 check +permutation w3 r2 r1 p3 w2 p2 p1 c3 c2 c1 check +permutation w3 r2 r1 p3 w2 p2 c3 p1 c1 c2 check +permutation w3 r2 r1 p3 w2 p2 c3 p1 c2 c1 check +permutation w3 r2 r1 p3 w2 p2 c3 c2 p1 c1 check +permutation w3 r2 r1 p3 w2 c3 p1 p2 c1 c2 check +permutation w3 r2 r1 p3 w2 c3 p1 p2 c2 c1 check +permutation w3 r2 r1 p3 w2 c3 p1 c1 p2 c2 check +permutation w3 r2 r1 p3 w2 c3 p2 p1 c1 c2 check +permutation w3 r2 r1 p3 w2 c3 p2 p1 c2 c1 check +permutation w3 r2 r1 p3 w2 c3 p2 c2 p1 c1 check +permutation w3 r2 r1 p3 p1 w2 p2 c3 c1 c2 check +permutation w3 r2 r1 p3 p1 w2 p2 c3 c2 c1 check +permutation w3 r2 r1 p3 p1 w2 c3 p2 c1 c2 check +permutation w3 r2 r1 p3 p1 w2 c3 p2 c2 c1 check +permutation w3 r2 r1 p3 p1 w2 c3 c1 p2 c2 check +permutation w3 r2 r1 p3 p1 c3 w2 p2 c1 c2 check +permutation w3 r2 r1 p3 p1 c3 w2 p2 c2 c1 check +permutation w3 r2 r1 p3 p1 c3 w2 c1 p2 c2 check +permutation w3 r2 r1 p3 p1 c3 c1 w2 p2 c2 check +permutation w3 r2 r1 p3 c3 w2 p1 p2 c1 c2 check +permutation w3 r2 r1 p3 c3 w2 p1 p2 c2 c1 check +permutation w3 r2 r1 p3 c3 w2 p1 c1 p2 c2 check +permutation w3 r2 r1 p3 c3 w2 p2 p1 c1 c2 check +permutation w3 r2 r1 p3 c3 w2 p2 p1 c2 c1 check +permutation w3 r2 r1 p3 c3 w2 p2 c2 p1 c1 check +permutation w3 r2 r1 p3 c3 p1 w2 p2 c1 c2 check +permutation w3 r2 r1 p3 c3 p1 w2 p2 c2 c1 check +permutation w3 r2 r1 p3 c3 p1 w2 c1 p2 c2 check +permutation w3 r2 r1 p3 c3 p1 c1 w2 p2 c2 check +permutation w3 r2 p3 r1 w2 p1 p2 c3 c1 c2 check +permutation w3 r2 p3 r1 w2 p1 p2 c3 c2 c1 check +permutation w3 r2 p3 r1 w2 p1 c3 p2 c1 c2 check +permutation w3 r2 p3 r1 w2 p1 c3 p2 c2 c1 check +permutation w3 r2 p3 r1 w2 p1 c3 c1 p2 c2 check +permutation w3 r2 p3 r1 w2 p2 p1 c3 c1 c2 check +permutation w3 r2 p3 r1 w2 p2 p1 c3 c2 c1 check +permutation w3 r2 p3 r1 w2 p2 c3 p1 c1 c2 check +permutation w3 r2 p3 r1 w2 p2 c3 p1 c2 c1 check +permutation w3 r2 p3 r1 w2 p2 c3 c2 p1 c1 check +permutation w3 r2 p3 r1 w2 c3 p1 p2 c1 c2 check +permutation w3 r2 p3 r1 w2 c3 p1 p2 c2 c1 check +permutation w3 r2 p3 r1 w2 c3 p1 c1 p2 c2 check +permutation w3 r2 p3 r1 w2 c3 p2 p1 c1 c2 check +permutation w3 r2 p3 r1 w2 c3 p2 p1 c2 c1 check +permutation w3 r2 p3 r1 w2 c3 p2 c2 p1 c1 check +permutation w3 r2 p3 r1 p1 w2 p2 c3 c1 c2 check +permutation w3 r2 p3 r1 p1 w2 p2 c3 c2 c1 check +permutation w3 r2 p3 r1 p1 w2 c3 p2 c1 c2 check +permutation w3 r2 p3 r1 p1 w2 c3 p2 c2 c1 check +permutation w3 r2 p3 r1 p1 w2 c3 c1 p2 c2 check +permutation w3 r2 p3 r1 p1 c3 w2 p2 c1 c2 check +permutation w3 r2 p3 r1 p1 c3 w2 p2 c2 c1 check +permutation w3 r2 p3 r1 p1 c3 w2 c1 p2 c2 check +permutation w3 r2 p3 r1 p1 c3 c1 w2 p2 c2 check +permutation w3 r2 p3 r1 c3 w2 p1 p2 c1 c2 check +permutation w3 r2 p3 r1 c3 w2 p1 p2 c2 c1 check +permutation w3 r2 p3 r1 c3 w2 p1 c1 p2 c2 check +permutation w3 r2 p3 r1 c3 w2 p2 p1 c1 c2 check +permutation w3 r2 p3 r1 c3 w2 p2 p1 c2 c1 check +permutation w3 r2 p3 r1 c3 w2 p2 c2 p1 c1 check +permutation w3 r2 p3 r1 c3 p1 w2 p2 c1 c2 check +permutation w3 r2 p3 r1 c3 p1 w2 p2 c2 c1 check +permutation w3 r2 p3 r1 c3 p1 w2 c1 p2 c2 check +permutation w3 r2 p3 r1 c3 p1 c1 w2 p2 c2 check +permutation w3 r2 p3 c3 r1 w2 p1 p2 c1 c2 check +permutation w3 r2 p3 c3 r1 w2 p1 p2 c2 c1 check +permutation w3 r2 p3 c3 r1 w2 p1 c1 p2 c2 check +permutation w3 r2 p3 c3 r1 w2 p2 p1 c1 c2 check +permutation w3 r2 p3 c3 r1 w2 p2 p1 c2 c1 check +permutation w3 r2 p3 c3 r1 w2 p2 c2 p1 c1 check +permutation w3 r2 p3 c3 r1 p1 w2 p2 c1 c2 check +permutation w3 r2 p3 c3 r1 p1 w2 p2 c2 c1 check +permutation w3 r2 p3 c3 r1 p1 w2 c1 p2 c2 check +permutation w3 r2 p3 c3 r1 p1 c1 w2 p2 c2 check +permutation w3 p3 r1 r2 w2 p1 p2 c3 c1 c2 check +permutation w3 p3 r1 r2 w2 p1 p2 c3 c2 c1 check +permutation w3 p3 r1 r2 w2 p1 c3 p2 c1 c2 check +permutation w3 p3 r1 r2 w2 p1 c3 p2 c2 c1 check +permutation w3 p3 r1 r2 w2 p1 c3 c1 p2 c2 check +permutation w3 p3 r1 r2 w2 p2 p1 c3 c1 c2 check +permutation w3 p3 r1 r2 w2 p2 p1 c3 c2 c1 check +permutation w3 p3 r1 r2 w2 p2 c3 p1 c1 c2 check +permutation w3 p3 r1 r2 w2 p2 c3 p1 c2 c1 check +permutation w3 p3 r1 r2 w2 p2 c3 c2 p1 c1 check +permutation w3 p3 r1 r2 w2 c3 p1 p2 c1 c2 check +permutation w3 p3 r1 r2 w2 c3 p1 p2 c2 c1 check +permutation w3 p3 r1 r2 w2 c3 p1 c1 p2 c2 check +permutation w3 p3 r1 r2 w2 c3 p2 p1 c1 c2 check +permutation w3 p3 r1 r2 w2 c3 p2 p1 c2 c1 check +permutation w3 p3 r1 r2 w2 c3 p2 c2 p1 c1 check +permutation w3 p3 r1 r2 p1 w2 p2 c3 c1 c2 check +permutation w3 p3 r1 r2 p1 w2 p2 c3 c2 c1 check +permutation w3 p3 r1 r2 p1 w2 c3 p2 c1 c2 check +permutation w3 p3 r1 r2 p1 w2 c3 p2 c2 c1 check +permutation w3 p3 r1 r2 p1 w2 c3 c1 p2 c2 check +permutation w3 p3 r1 r2 p1 c3 w2 p2 c1 c2 check +permutation w3 p3 r1 r2 p1 c3 w2 p2 c2 c1 check +permutation w3 p3 r1 r2 p1 c3 w2 c1 p2 c2 check +permutation w3 p3 r1 r2 p1 c3 c1 w2 p2 c2 check +permutation w3 p3 r1 r2 c3 w2 p1 p2 c1 c2 check +permutation w3 p3 r1 r2 c3 w2 p1 p2 c2 c1 check +permutation w3 p3 r1 r2 c3 w2 p1 c1 p2 c2 check +permutation w3 p3 r1 r2 c3 w2 p2 p1 c1 c2 check +permutation w3 p3 r1 r2 c3 w2 p2 p1 c2 c1 check +permutation w3 p3 r1 r2 c3 w2 p2 c2 p1 c1 check +permutation w3 p3 r1 r2 c3 p1 w2 p2 c1 c2 check +permutation w3 p3 r1 r2 c3 p1 w2 p2 c2 c1 check +permutation w3 p3 r1 r2 c3 p1 w2 c1 p2 c2 check +permutation w3 p3 r1 r2 c3 p1 c1 w2 p2 c2 check +permutation w3 p3 r1 w2 r2 p1 p2 c3 c1 c2 check +permutation w3 p3 r1 w2 r2 p1 p2 c3 c2 c1 check +permutation w3 p3 r1 w2 r2 p1 c3 p2 c1 c2 check +permutation w3 p3 r1 w2 r2 p1 c3 p2 c2 c1 check +permutation w3 p3 r1 w2 r2 p1 c3 c1 p2 c2 check +permutation w3 p3 r1 w2 r2 p2 p1 c3 c1 c2 check +permutation w3 p3 r1 w2 r2 p2 p1 c3 c2 c1 check +permutation w3 p3 r1 w2 r2 p2 c3 p1 c1 c2 check +permutation w3 p3 r1 w2 r2 p2 c3 p1 c2 c1 check +permutation w3 p3 r1 w2 r2 p2 c3 c2 p1 c1 check +permutation w3 p3 r1 w2 r2 c3 p1 p2 c1 c2 check +permutation w3 p3 r1 w2 r2 c3 p1 p2 c2 c1 check +permutation w3 p3 r1 w2 r2 c3 p1 c1 p2 c2 check +permutation w3 p3 r1 w2 r2 c3 p2 p1 c1 c2 check +permutation w3 p3 r1 w2 r2 c3 p2 p1 c2 c1 check +permutation w3 p3 r1 w2 r2 c3 p2 c2 p1 c1 check +permutation w3 p3 r1 w2 p1 r2 p2 c3 c1 c2 check +permutation w3 p3 r1 w2 p1 r2 p2 c3 c2 c1 check +permutation w3 p3 r1 w2 p1 r2 c3 p2 c1 c2 check +permutation w3 p3 r1 w2 p1 r2 c3 p2 c2 c1 check +permutation w3 p3 r1 w2 p1 r2 c3 c1 p2 c2 check +permutation w3 p3 r1 w2 p1 c3 r2 p2 c1 c2 check +permutation w3 p3 r1 w2 p1 c3 r2 p2 c2 c1 check +permutation w3 p3 r1 w2 p1 c3 r2 c1 p2 c2 check +permutation w3 p3 r1 w2 p1 c3 c1 r2 p2 c2 check +permutation w3 p3 r1 w2 c3 r2 p1 p2 c1 c2 check +permutation w3 p3 r1 w2 c3 r2 p1 p2 c2 c1 check +permutation w3 p3 r1 w2 c3 r2 p1 c1 p2 c2 check +permutation w3 p3 r1 w2 c3 r2 p2 p1 c1 c2 check +permutation w3 p3 r1 w2 c3 r2 p2 p1 c2 c1 check +permutation w3 p3 r1 w2 c3 r2 p2 c2 p1 c1 check +permutation w3 p3 r1 w2 c3 p1 r2 p2 c1 c2 check +permutation w3 p3 r1 w2 c3 p1 r2 p2 c2 c1 check +permutation w3 p3 r1 w2 c3 p1 r2 c1 p2 c2 check +permutation w3 p3 r1 w2 c3 p1 c1 r2 p2 c2 check +permutation w3 p3 r1 p1 r2 w2 p2 c3 c1 c2 check +permutation w3 p3 r1 p1 r2 w2 p2 c3 c2 c1 check +permutation w3 p3 r1 p1 r2 w2 c3 p2 c1 c2 check +permutation w3 p3 r1 p1 r2 w2 c3 p2 c2 c1 check +permutation w3 p3 r1 p1 r2 w2 c3 c1 p2 c2 check +permutation w3 p3 r1 p1 r2 c3 w2 p2 c1 c2 check +permutation w3 p3 r1 p1 r2 c3 w2 p2 c2 c1 check +permutation w3 p3 r1 p1 r2 c3 w2 c1 p2 c2 check +permutation w3 p3 r1 p1 r2 c3 c1 w2 p2 c2 check +permutation w3 p3 r1 p1 w2 r2 p2 c3 c1 c2 check +permutation w3 p3 r1 p1 w2 r2 p2 c3 c2 c1 check +permutation w3 p3 r1 p1 w2 r2 c3 p2 c1 c2 check +permutation w3 p3 r1 p1 w2 r2 c3 p2 c2 c1 check +permutation w3 p3 r1 p1 w2 r2 c3 c1 p2 c2 check +permutation w3 p3 r1 p1 w2 c3 r2 p2 c1 c2 check +permutation w3 p3 r1 p1 w2 c3 r2 p2 c2 c1 check +permutation w3 p3 r1 p1 w2 c3 r2 c1 p2 c2 check +permutation w3 p3 r1 p1 w2 c3 c1 r2 p2 c2 check +permutation w3 p3 r1 p1 c3 r2 w2 p2 c1 c2 check +permutation w3 p3 r1 p1 c3 r2 w2 p2 c2 c1 check +permutation w3 p3 r1 p1 c3 r2 w2 c1 p2 c2 check +permutation w3 p3 r1 p1 c3 r2 c1 w2 p2 c2 check +permutation w3 p3 r1 p1 c3 w2 r2 p2 c1 c2 check +permutation w3 p3 r1 p1 c3 w2 r2 p2 c2 c1 check +permutation w3 p3 r1 p1 c3 w2 r2 c1 p2 c2 check +permutation w3 p3 r1 p1 c3 w2 c1 r2 p2 c2 check +permutation w3 p3 r1 p1 c3 c1 r2 w2 p2 c2 check +permutation w3 p3 r1 p1 c3 c1 w2 r2 p2 c2 check +permutation w3 p3 r1 c3 r2 w2 p1 p2 c1 c2 check +permutation w3 p3 r1 c3 r2 w2 p1 p2 c2 c1 check +permutation w3 p3 r1 c3 r2 w2 p1 c1 p2 c2 check +permutation w3 p3 r1 c3 r2 w2 p2 p1 c1 c2 check +permutation w3 p3 r1 c3 r2 w2 p2 p1 c2 c1 check +permutation w3 p3 r1 c3 r2 w2 p2 c2 p1 c1 check +permutation w3 p3 r1 c3 r2 p1 w2 p2 c1 c2 check +permutation w3 p3 r1 c3 r2 p1 w2 p2 c2 c1 check +permutation w3 p3 r1 c3 r2 p1 w2 c1 p2 c2 check +permutation w3 p3 r1 c3 r2 p1 c1 w2 p2 c2 check +permutation w3 p3 r1 c3 w2 r2 p1 p2 c1 c2 check +permutation w3 p3 r1 c3 w2 r2 p1 p2 c2 c1 check +permutation w3 p3 r1 c3 w2 r2 p1 c1 p2 c2 check +permutation w3 p3 r1 c3 w2 r2 p2 p1 c1 c2 check +permutation w3 p3 r1 c3 w2 r2 p2 p1 c2 c1 check +permutation w3 p3 r1 c3 w2 r2 p2 c2 p1 c1 check +permutation w3 p3 r1 c3 w2 p1 r2 p2 c1 c2 check +permutation w3 p3 r1 c3 w2 p1 r2 p2 c2 c1 check +permutation w3 p3 r1 c3 w2 p1 r2 c1 p2 c2 check +permutation w3 p3 r1 c3 w2 p1 c1 r2 p2 c2 check +permutation w3 p3 r1 c3 p1 r2 w2 p2 c1 c2 check +permutation w3 p3 r1 c3 p1 r2 w2 p2 c2 c1 check +permutation w3 p3 r1 c3 p1 r2 w2 c1 p2 c2 check +permutation w3 p3 r1 c3 p1 r2 c1 w2 p2 c2 check +permutation w3 p3 r1 c3 p1 w2 r2 p2 c1 c2 check +permutation w3 p3 r1 c3 p1 w2 r2 p2 c2 c1 check +permutation w3 p3 r1 c3 p1 w2 r2 c1 p2 c2 check +permutation w3 p3 r1 c3 p1 w2 c1 r2 p2 c2 check +permutation w3 p3 r1 c3 p1 c1 r2 w2 p2 c2 check +permutation w3 p3 r1 c3 p1 c1 w2 r2 p2 c2 check +permutation w3 p3 r2 r1 w2 p1 p2 c3 c1 c2 check +permutation w3 p3 r2 r1 w2 p1 p2 c3 c2 c1 check +permutation w3 p3 r2 r1 w2 p1 c3 p2 c1 c2 check +permutation w3 p3 r2 r1 w2 p1 c3 p2 c2 c1 check +permutation w3 p3 r2 r1 w2 p1 c3 c1 p2 c2 check +permutation w3 p3 r2 r1 w2 p2 p1 c3 c1 c2 check +permutation w3 p3 r2 r1 w2 p2 p1 c3 c2 c1 check +permutation w3 p3 r2 r1 w2 p2 c3 p1 c1 c2 check +permutation w3 p3 r2 r1 w2 p2 c3 p1 c2 c1 check +permutation w3 p3 r2 r1 w2 p2 c3 c2 p1 c1 check +permutation w3 p3 r2 r1 w2 c3 p1 p2 c1 c2 check +permutation w3 p3 r2 r1 w2 c3 p1 p2 c2 c1 check +permutation w3 p3 r2 r1 w2 c3 p1 c1 p2 c2 check +permutation w3 p3 r2 r1 w2 c3 p2 p1 c1 c2 check +permutation w3 p3 r2 r1 w2 c3 p2 p1 c2 c1 check +permutation w3 p3 r2 r1 w2 c3 p2 c2 p1 c1 check +permutation w3 p3 r2 r1 p1 w2 p2 c3 c1 c2 check +permutation w3 p3 r2 r1 p1 w2 p2 c3 c2 c1 check +permutation w3 p3 r2 r1 p1 w2 c3 p2 c1 c2 check +permutation w3 p3 r2 r1 p1 w2 c3 p2 c2 c1 check +permutation w3 p3 r2 r1 p1 w2 c3 c1 p2 c2 check +permutation w3 p3 r2 r1 p1 c3 w2 p2 c1 c2 check +permutation w3 p3 r2 r1 p1 c3 w2 p2 c2 c1 check +permutation w3 p3 r2 r1 p1 c3 w2 c1 p2 c2 check +permutation w3 p3 r2 r1 p1 c3 c1 w2 p2 c2 check +permutation w3 p3 r2 r1 c3 w2 p1 p2 c1 c2 check +permutation w3 p3 r2 r1 c3 w2 p1 p2 c2 c1 check +permutation w3 p3 r2 r1 c3 w2 p1 c1 p2 c2 check +permutation w3 p3 r2 r1 c3 w2 p2 p1 c1 c2 check +permutation w3 p3 r2 r1 c3 w2 p2 p1 c2 c1 check +permutation w3 p3 r2 r1 c3 w2 p2 c2 p1 c1 check +permutation w3 p3 r2 r1 c3 p1 w2 p2 c1 c2 check +permutation w3 p3 r2 r1 c3 p1 w2 p2 c2 c1 check +permutation w3 p3 r2 r1 c3 p1 w2 c1 p2 c2 check +permutation w3 p3 r2 r1 c3 p1 c1 w2 p2 c2 check +permutation w3 p3 r2 c3 r1 w2 p1 p2 c1 c2 check +permutation w3 p3 r2 c3 r1 w2 p1 p2 c2 c1 check +permutation w3 p3 r2 c3 r1 w2 p1 c1 p2 c2 check +permutation w3 p3 r2 c3 r1 w2 p2 p1 c1 c2 check +permutation w3 p3 r2 c3 r1 w2 p2 p1 c2 c1 check +permutation w3 p3 r2 c3 r1 w2 p2 c2 p1 c1 check +permutation w3 p3 r2 c3 r1 p1 w2 p2 c1 c2 check +permutation w3 p3 r2 c3 r1 p1 w2 p2 c2 c1 check +permutation w3 p3 r2 c3 r1 p1 w2 c1 p2 c2 check +permutation w3 p3 r2 c3 r1 p1 c1 w2 p2 c2 check +permutation w3 p3 c3 r1 r2 w2 p1 p2 c1 c2 check +permutation w3 p3 c3 r1 r2 w2 p1 p2 c2 c1 check +permutation w3 p3 c3 r1 r2 w2 p1 c1 p2 c2 check +permutation w3 p3 c3 r1 r2 w2 p2 p1 c1 c2 check +permutation w3 p3 c3 r1 r2 w2 p2 p1 c2 c1 check +permutation w3 p3 c3 r1 r2 w2 p2 c2 p1 c1 check +permutation w3 p3 c3 r1 r2 p1 w2 p2 c1 c2 check +permutation w3 p3 c3 r1 r2 p1 w2 p2 c2 c1 check +permutation w3 p3 c3 r1 r2 p1 w2 c1 p2 c2 check +permutation w3 p3 c3 r1 r2 p1 c1 w2 p2 c2 check +permutation w3 p3 c3 r1 w2 r2 p1 p2 c1 c2 check +permutation w3 p3 c3 r1 w2 r2 p1 p2 c2 c1 check +permutation w3 p3 c3 r1 w2 r2 p1 c1 p2 c2 check +permutation w3 p3 c3 r1 w2 r2 p2 p1 c1 c2 check +permutation w3 p3 c3 r1 w2 r2 p2 p1 c2 c1 check +permutation w3 p3 c3 r1 w2 r2 p2 c2 p1 c1 check +permutation w3 p3 c3 r1 w2 p1 r2 p2 c1 c2 check +permutation w3 p3 c3 r1 w2 p1 r2 p2 c2 c1 check +permutation w3 p3 c3 r1 w2 p1 r2 c1 p2 c2 check +permutation w3 p3 c3 r1 w2 p1 c1 r2 p2 c2 check +permutation w3 p3 c3 r1 p1 r2 w2 p2 c1 c2 check +permutation w3 p3 c3 r1 p1 r2 w2 p2 c2 c1 check +permutation w3 p3 c3 r1 p1 r2 w2 c1 p2 c2 check +permutation w3 p3 c3 r1 p1 r2 c1 w2 p2 c2 check +permutation w3 p3 c3 r1 p1 w2 r2 p2 c1 c2 check +permutation w3 p3 c3 r1 p1 w2 r2 p2 c2 c1 check +permutation w3 p3 c3 r1 p1 w2 r2 c1 p2 c2 check +permutation w3 p3 c3 r1 p1 w2 c1 r2 p2 c2 check +permutation w3 p3 c3 r1 p1 c1 r2 w2 p2 c2 check +permutation w3 p3 c3 r1 p1 c1 w2 r2 p2 c2 check +permutation w3 p3 c3 r2 r1 w2 p1 p2 c1 c2 check +permutation w3 p3 c3 r2 r1 w2 p1 p2 c2 c1 check +permutation w3 p3 c3 r2 r1 w2 p1 c1 p2 c2 check +permutation w3 p3 c3 r2 r1 w2 p2 p1 c1 c2 check +permutation w3 p3 c3 r2 r1 w2 p2 p1 c2 c1 check +permutation w3 p3 c3 r2 r1 w2 p2 c2 p1 c1 check +permutation w3 p3 c3 r2 r1 p1 w2 p2 c1 c2 check +permutation w3 p3 c3 r2 r1 p1 w2 p2 c2 c1 check +permutation w3 p3 c3 r2 r1 p1 w2 c1 p2 c2 check +permutation w3 p3 c3 r2 r1 p1 c1 w2 p2 c2 check diff --git a/src/test/isolation/specs/project-manager.spec b/src/test/isolation/specs/project-manager.spec index 884012dd89c..42e5fc53a2e 100644 --- a/src/test/isolation/specs/project-manager.spec +++ b/src/test/isolation/specs/project-manager.spec @@ -17,14 +17,14 @@ teardown DROP TABLE person, project; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rx1" { SELECT count(*) FROM person WHERE person_id = 1 AND is_project_manager; } -step "wy1" { INSERT INTO project VALUES (101, 'Build Great Wall', 1); } -step "c1" { COMMIT; } +step rx1 { SELECT count(*) FROM person WHERE person_id = 1 AND is_project_manager; } +step wy1 { INSERT INTO project VALUES (101, 'Build Great Wall', 1); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "ry2" { SELECT count(*) FROM project WHERE project_manager = 1; } -step "wx2" { UPDATE person SET is_project_manager = false WHERE person_id = 1; } -step "c2" { COMMIT; } +step ry2 { SELECT count(*) FROM project WHERE project_manager = 1; } +step wx2 { UPDATE person SET is_project_manager = false WHERE person_id = 1; } +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/propagate-lock-delete.spec b/src/test/isolation/specs/propagate-lock-delete.spec index 857c36b3dbb..641fb842833 100644 --- a/src/test/isolation/specs/propagate-lock-delete.spec +++ b/src/test/isolation/specs/propagate-lock-delete.spec @@ -14,29 +14,29 @@ teardown drop table child, parent; } -session "s1" -step "s1b" { BEGIN; } -step "s1l" { INSERT INTO child VALUES (1); } -step "s1c" { COMMIT; } +session s1 +step s1b { BEGIN; } +step s1l { INSERT INTO child VALUES (1); } +step s1c { COMMIT; } -session "s2" -step "s2b" { BEGIN; } -step "s2l" { INSERT INTO child VALUES (1); } -step "s2c" { COMMIT; } +session s2 +step s2b { BEGIN; } +step s2l { INSERT INTO child VALUES (1); } +step s2c { COMMIT; } -session "s3" -step "s3b" { BEGIN; } -step "s3u" { UPDATE parent SET c=lower(c); } # no key update -step "s3u2" { UPDATE parent SET i = i; } # key update -step "s3svu" { SAVEPOINT f; UPDATE parent SET c = 'bbb'; ROLLBACK TO f; } -step "s3d" { DELETE FROM parent; } -step "s3c" { COMMIT; } +session s3 +step s3b { BEGIN; } +step s3u { UPDATE parent SET c=lower(c); } # no key update +step s3u2 { UPDATE parent SET i = i; } # key update +step s3svu { SAVEPOINT f; UPDATE parent SET c = 'bbb'; ROLLBACK TO f; } +step s3d { DELETE FROM parent; } +step s3c { COMMIT; } -permutation "s1b" "s1l" "s2b" "s2l" "s3b" "s3u" "s3d" "s1c" "s2c" "s3c" -permutation "s1b" "s1l" "s2b" "s2l" "s3b" "s3u" "s3svu" "s3d" "s1c" "s2c" "s3c" -permutation "s1b" "s1l" "s2b" "s2l" "s3b" "s3u2" "s3d" "s1c" "s2c" "s3c" -permutation "s1b" "s1l" "s2b" "s2l" "s3b" "s3u2" "s3svu" "s3d" "s1c" "s2c" "s3c" -permutation "s1b" "s1l" "s3b" "s3u" "s3d" "s1c" "s3c" -permutation "s1b" "s1l" "s3b" "s3u" "s3svu" "s3d" "s1c" "s3c" -permutation "s1b" "s1l" "s3b" "s3u2" "s3d" "s1c" "s3c" -permutation "s1b" "s1l" "s3b" "s3u2" "s3svu" "s3d" "s1c" "s3c" +permutation s1b s1l s2b s2l s3b s3u s3d s1c s2c s3c +permutation s1b s1l s2b s2l s3b s3u s3svu s3d s1c s2c s3c +permutation s1b s1l s2b s2l s3b s3u2 s3d s1c s2c s3c +permutation s1b s1l s2b s2l s3b s3u2 s3svu s3d s1c s2c s3c +permutation s1b s1l s3b s3u s3d s1c s3c +permutation s1b s1l s3b s3u s3svu s3d s1c s3c +permutation s1b s1l s3b s3u2 s3d s1c s3c +permutation s1b s1l s3b s3u2 s3svu s3d s1c s3c diff --git a/src/test/isolation/specs/read-write-unique-2.spec b/src/test/isolation/specs/read-write-unique-2.spec index 5e7cbf2cf54..16c73e19c43 100644 --- a/src/test/isolation/specs/read-write-unique-2.spec +++ b/src/test/isolation/specs/read-write-unique-2.spec @@ -10,27 +10,27 @@ teardown DROP TABLE test; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r1" { SELECT * FROM test WHERE i = 42; } -step "w1" { INSERT INTO test VALUES (42); } -step "c1" { COMMIT; } +step r1 { SELECT * FROM test WHERE i = 42; } +step w1 { INSERT INTO test VALUES (42); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r2" { SELECT * FROM test WHERE i = 42; } -step "w2" { INSERT INTO test VALUES (42); } -step "c2" { COMMIT; } +step r2 { SELECT * FROM test WHERE i = 42; } +step w2 { INSERT INTO test VALUES (42); } +step c2 { COMMIT; } # Two SSI transactions see that there is no row with value 42 # in the table, then try to insert that value; T1 inserts, # and then T2 blocks waiting for T1 to commit. Finally, # T2 reports a serialization failure. -permutation "r1" "r2" "w1" "w2" "c1" "c2" +permutation r1 r2 w1 w2 c1 c2 # If the value is already visible before T2 begins, then a # regular unique constraint violation should still be raised # by T2. -permutation "r1" "w1" "c1" "r2" "w2" "c2" +permutation r1 w1 c1 r2 w2 c2 diff --git a/src/test/isolation/specs/read-write-unique-3.spec b/src/test/isolation/specs/read-write-unique-3.spec index 52d287721b1..cba2c4c0bc0 100644 --- a/src/test/isolation/specs/read-write-unique-3.spec +++ b/src/test/isolation/specs/read-write-unique-3.spec @@ -20,14 +20,14 @@ teardown DROP TABLE test; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rw1" { SELECT insert_unique(1, '1'); } -step "c1" { COMMIT; } +step rw1 { SELECT insert_unique(1, '1'); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rw2" { SELECT insert_unique(1, '2'); } -step "c2" { COMMIT; } +step rw2 { SELECT insert_unique(1, '2'); } +step c2 { COMMIT; } -permutation "rw1" "rw2" "c1" "c2" +permutation rw1 rw2 c1 c2 diff --git a/src/test/isolation/specs/read-write-unique-4.spec b/src/test/isolation/specs/read-write-unique-4.spec index ec447823484..90022488113 100644 --- a/src/test/isolation/specs/read-write-unique-4.spec +++ b/src/test/isolation/specs/read-write-unique-4.spec @@ -17,27 +17,27 @@ teardown DROP TABLE invoice; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r1" { SELECT COALESCE(MAX(invoice_number) + 1, 1) FROM invoice WHERE year = 2016; } -step "w1" { INSERT INTO invoice VALUES (2016, 3); } -step "c1" { COMMIT; } +step r1 { SELECT COALESCE(MAX(invoice_number) + 1, 1) FROM invoice WHERE year = 2016; } +step w1 { INSERT INTO invoice VALUES (2016, 3); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r2" { SELECT COALESCE(MAX(invoice_number) + 1, 1) FROM invoice WHERE year = 2016; } -step "w2" { INSERT INTO invoice VALUES (2016, 3); } -step "c2" { COMMIT; } +step r2 { SELECT COALESCE(MAX(invoice_number) + 1, 1) FROM invoice WHERE year = 2016; } +step w2 { INSERT INTO invoice VALUES (2016, 3); } +step c2 { COMMIT; } # if they both read first then there should be an SSI conflict -permutation "r1" "r2" "w1" "w2" "c1" "c2" +permutation r1 r2 w1 w2 c1 c2 # cases where one session doesn't explicitly read before writing: # if s2 doesn't explicitly read, then trying to insert the value # generates a unique constraint violation after s1 commits, as if s2 # ran after s1 -permutation "r1" "w1" "w2" "c1" "c2" +permutation r1 w1 w2 c1 c2 # if s1 doesn't explicitly read, but s2 does, then s1 inserts and # commits first, should s2 experience an SSI failure instead of a @@ -45,4 +45,4 @@ permutation "r1" "w1" "w2" "c1" "c2" # (s1, s2) or (s2, s1) where s1 succeeds, and s2 doesn't see the row # in an explicit select but then fails to insert due to unique # constraint violation -permutation "r2" "w1" "w2" "c1" "c2" +permutation r2 w1 w2 c1 c2 diff --git a/src/test/isolation/specs/read-write-unique.spec b/src/test/isolation/specs/read-write-unique.spec index c782f10c43e..3ce059f5ceb 100644 --- a/src/test/isolation/specs/read-write-unique.spec +++ b/src/test/isolation/specs/read-write-unique.spec @@ -10,17 +10,17 @@ teardown DROP TABLE test; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r1" { SELECT * FROM test; } -step "w1" { INSERT INTO test VALUES (42); } -step "c1" { COMMIT; } +step r1 { SELECT * FROM test; } +step w1 { INSERT INTO test VALUES (42); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r2" { SELECT * FROM test; } -step "w2" { INSERT INTO test VALUES (42); } -step "c2" { COMMIT; } +step r2 { SELECT * FROM test; } +step w2 { INSERT INTO test VALUES (42); } +step c2 { COMMIT; } # Two SSI transactions see that there is no row with value 42 # in the table, then try to insert that value; T1 inserts, @@ -30,10 +30,10 @@ step "c2" { COMMIT; } # (In an earlier version of Postgres, T2 would report a unique # constraint violation). -permutation "r1" "r2" "w1" "w2" "c1" "c2" +permutation r1 r2 w1 w2 c1 c2 # If the value is already visible before T2 begins, then a # regular unique constraint violation should still be raised # by T2. -permutation "r1" "w1" "c1" "r2" "w2" "c2" +permutation r1 w1 c1 r2 w2 c2 diff --git a/src/test/isolation/specs/receipt-report.spec b/src/test/isolation/specs/receipt-report.spec index 5e1d51d0bd0..85ac60fb9f0 100644 --- a/src/test/isolation/specs/receipt-report.spec +++ b/src/test/isolation/specs/receipt-report.spec @@ -30,18 +30,18 @@ teardown DROP TABLE ctl, receipt; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rxwy1" { INSERT INTO receipt VALUES (3, (SELECT deposit_date FROM ctl WHERE k = 'receipt'), 4.00); } -step "c1" { COMMIT; } +step rxwy1 { INSERT INTO receipt VALUES (3, (SELECT deposit_date FROM ctl WHERE k = 'receipt'), 4.00); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wx2" { UPDATE ctl SET deposit_date = DATE '2008-12-23' WHERE k = 'receipt'; } -step "c2" { COMMIT; } +step wx2 { UPDATE ctl SET deposit_date = DATE '2008-12-23' WHERE k = 'receipt'; } +step c2 { COMMIT; } -session "s3" +session s3 setup { BEGIN ISOLATION LEVEL SERIALIZABLE, READ ONLY; } -step "rx3" { SELECT * FROM ctl WHERE k = 'receipt'; } -step "ry3" { SELECT * FROM receipt WHERE deposit_date = DATE '2008-12-22'; } -step "c3" { COMMIT; } +step rx3 { SELECT * FROM ctl WHERE k = 'receipt'; } +step ry3 { SELECT * FROM receipt WHERE deposit_date = DATE '2008-12-22'; } +step c3 { COMMIT; } diff --git a/src/test/isolation/specs/referential-integrity.spec b/src/test/isolation/specs/referential-integrity.spec index 0bea3eab973..ecaa9bba023 100644 --- a/src/test/isolation/specs/referential-integrity.spec +++ b/src/test/isolation/specs/referential-integrity.spec @@ -18,15 +18,15 @@ teardown DROP TABLE a, b; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rx1" { SELECT i FROM a WHERE i = 1; } -step "wy1" { INSERT INTO b VALUES (1); } -step "c1" { COMMIT; } +step rx1 { SELECT i FROM a WHERE i = 1; } +step wy1 { INSERT INTO b VALUES (1); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rx2" { SELECT i FROM a WHERE i = 1; } -step "ry2" { SELECT a_id FROM b WHERE a_id = 1; } -step "wx2" { DELETE FROM a WHERE i = 1; } -step "c2" { COMMIT; } +step rx2 { SELECT i FROM a WHERE i = 1; } +step ry2 { SELECT a_id FROM b WHERE a_id = 1; } +step wx2 { DELETE FROM a WHERE i = 1; } +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/ri-trigger.spec b/src/test/isolation/specs/ri-trigger.spec index 78d1f2f226d..00fcdff414f 100644 --- a/src/test/isolation/specs/ri-trigger.spec +++ b/src/test/isolation/specs/ri-trigger.spec @@ -41,13 +41,13 @@ teardown DROP FUNCTION ri_child(); } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wxry1" { INSERT INTO child (parent_id) VALUES (0); } -step "c1" { COMMIT; } +step wxry1 { INSERT INTO child (parent_id) VALUES (0); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "r2" { SELECT TRUE; } -step "wyrx2" { DELETE FROM parent WHERE parent_id = 0; } -step "c2" { COMMIT; } +step r2 { SELECT TRUE; } +step wyrx2 { DELETE FROM parent WHERE parent_id = 0; } +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/simple-write-skew.spec b/src/test/isolation/specs/simple-write-skew.spec index 0aee43f38ed..ecabbf1ded4 100644 --- a/src/test/isolation/specs/simple-write-skew.spec +++ b/src/test/isolation/specs/simple-write-skew.spec @@ -19,12 +19,12 @@ teardown DROP TABLE test; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rwx1" { UPDATE test SET t = 'apple' WHERE t = 'pear'; } -step "c1" { COMMIT; } +step rwx1 { UPDATE test SET t = 'apple' WHERE t = 'pear'; } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rwx2" { UPDATE test SET t = 'pear' WHERE t = 'apple'} -step "c2" { COMMIT; } +step rwx2 { UPDATE test SET t = 'pear' WHERE t = 'apple'} +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/skip-locked-2.spec b/src/test/isolation/specs/skip-locked-2.spec index a179d343534..cfdaa938786 100644 --- a/src/test/isolation/specs/skip-locked-2.spec +++ b/src/test/isolation/specs/skip-locked-2.spec @@ -15,27 +15,27 @@ teardown DROP TABLE queue; } -session "s1" +session s1 setup { BEGIN; } -step "s1a" { SELECT * FROM queue ORDER BY id FOR SHARE SKIP LOCKED LIMIT 1; } -step "s1b" { COMMIT; } +step s1a { SELECT * FROM queue ORDER BY id FOR SHARE SKIP LOCKED LIMIT 1; } +step s1b { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2a" { SELECT * FROM queue ORDER BY id FOR SHARE SKIP LOCKED LIMIT 1; } -step "s2b" { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } -step "s2c" { COMMIT; } +step s2a { SELECT * FROM queue ORDER BY id FOR SHARE SKIP LOCKED LIMIT 1; } +step s2b { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } +step s2c { COMMIT; } # s1 and s2 both get SHARE lock, creating a multixact lock, then s2 # tries to update to UPDATE but skips the record because it can't # acquire a multixact lock -permutation "s1a" "s2a" "s2b" "s1b" "s2c" +permutation s1a s2a s2b s1b s2c # the same but with the SHARE locks acquired in a different order, so # s2 again skips because it can't acquired a multixact lock -permutation "s2a" "s1a" "s2b" "s1b" "s2c" +permutation s2a s1a s2b s1b s2c # s2 acquires SHARE then UPDATE, then s1 tries to acquire SHARE but # can't so skips the first record because it can't acquire a regular # lock -permutation "s2a" "s2b" "s1a" "s1b" "s2c" +permutation s2a s2b s1a s1b s2c diff --git a/src/test/isolation/specs/skip-locked-3.spec b/src/test/isolation/specs/skip-locked-3.spec index 30bf4c6b1a9..7921425ed87 100644 --- a/src/test/isolation/specs/skip-locked-3.spec +++ b/src/test/isolation/specs/skip-locked-3.spec @@ -15,22 +15,22 @@ teardown DROP TABLE queue; } -session "s1" +session s1 setup { BEGIN; } -step "s1a" { SELECT * FROM queue ORDER BY id FOR UPDATE LIMIT 1; } -step "s1b" { COMMIT; } +step s1a { SELECT * FROM queue ORDER BY id FOR UPDATE LIMIT 1; } +step s1b { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2a" { SELECT * FROM queue ORDER BY id FOR UPDATE LIMIT 1; } -step "s2b" { COMMIT; } +step s2a { SELECT * FROM queue ORDER BY id FOR UPDATE LIMIT 1; } +step s2b { COMMIT; } -session "s3" +session s3 setup { BEGIN; } -step "s3a" { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } -step "s3b" { COMMIT; } +step s3a { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } +step s3b { COMMIT; } # s3 skips to the second record because it can't obtain the tuple lock # (s2 holds the tuple lock because it is next in line to obtain the # row lock, and s1 holds the row lock) -permutation "s1a" "s2a" "s3a" "s1b" "s2b" "s3b" +permutation s1a s2a s3a s1b s2b s3b diff --git a/src/test/isolation/specs/skip-locked-4.spec b/src/test/isolation/specs/skip-locked-4.spec index ef182348801..02994a37bcd 100644 --- a/src/test/isolation/specs/skip-locked-4.spec +++ b/src/test/isolation/specs/skip-locked-4.spec @@ -14,18 +14,18 @@ teardown DROP TABLE foo; } -session "s1" +session s1 setup { BEGIN; } -step "s1a" { SELECT * FROM foo WHERE pg_advisory_lock(0) IS NOT NULL ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED; } -step "s1b" { COMMIT; } +step s1a { SELECT * FROM foo WHERE pg_advisory_lock(0) IS NOT NULL ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED; } +step s1b { COMMIT; } -session "s2" -step "s2a" { SELECT pg_advisory_lock(0); } -step "s2b" { UPDATE foo SET data = data WHERE id = 1; } -step "s2c" { BEGIN; } -step "s2d" { UPDATE foo SET data = data WHERE id = 1; } -step "s2e" { SELECT pg_advisory_unlock(0); } -step "s2f" { COMMIT; } +session s2 +step s2a { SELECT pg_advisory_lock(0); } +step s2b { UPDATE foo SET data = data WHERE id = 1; } +step s2c { BEGIN; } +step s2d { UPDATE foo SET data = data WHERE id = 1; } +step s2e { SELECT pg_advisory_unlock(0); } +step s2f { COMMIT; } # s1 takes a snapshot but then waits on an advisory lock, then s2 # updates the row in one transaction, then again in another without @@ -33,4 +33,4 @@ step "s2f" { COMMIT; } # because it has a snapshot that sees the older version, we reach the # waiting code in EvalPlanQualFetch which skips rows when in SKIP # LOCKED mode, so s1 sees the second row -permutation "s2a" "s1a" "s2b" "s2c" "s2d" "s2e" "s1b" "s2f" +permutation s2a s1a s2b s2c s2d s2e s1b s2f diff --git a/src/test/isolation/specs/skip-locked.spec b/src/test/isolation/specs/skip-locked.spec index 3565963c455..12168f8f8a9 100644 --- a/src/test/isolation/specs/skip-locked.spec +++ b/src/test/isolation/specs/skip-locked.spec @@ -15,14 +15,14 @@ teardown DROP TABLE queue; } -session "s1" +session s1 setup { BEGIN; } -step "s1a" { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } -step "s1b" { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } -step "s1c" { COMMIT; } +step s1a { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } +step s1b { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } +step s1c { COMMIT; } -session "s2" +session s2 setup { BEGIN; } -step "s2a" { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } -step "s2b" { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } -step "s2c" { COMMIT; } +step s2a { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } +step s2b { SELECT * FROM queue ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1; } +step s2c { COMMIT; } diff --git a/src/test/isolation/specs/temporal-range-integrity.spec b/src/test/isolation/specs/temporal-range-integrity.spec index 63784ce0a78..2d4c59c21b1 100644 --- a/src/test/isolation/specs/temporal-range-integrity.spec +++ b/src/test/isolation/specs/temporal-range-integrity.spec @@ -25,14 +25,14 @@ teardown DROP TABLE statute, offense; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rx1" { SELECT count(*) FROM statute WHERE statute_cite = '123.45(1)a' AND eff_date <= DATE '2009-05-15' AND (exp_date IS NULL OR exp_date > DATE '2009-05-15'); } -step "wy1" { INSERT INTO offense VALUES (1, '123.45(1)a', DATE '2009-05-15'); } -step "c1" { COMMIT; } +step rx1 { SELECT count(*) FROM statute WHERE statute_cite = '123.45(1)a' AND eff_date <= DATE '2009-05-15' AND (exp_date IS NULL OR exp_date > DATE '2009-05-15'); } +step wy1 { INSERT INTO offense VALUES (1, '123.45(1)a', DATE '2009-05-15'); } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "ry2" { SELECT count(*) FROM offense WHERE statute_cite = '123.45(1)a' AND offense_date >= DATE '2008-01-01'; } -step "wx2" { DELETE FROM statute WHERE statute_cite = '123.45(1)a' AND eff_date = DATE '2008-01-01'; } -step "c2" { COMMIT; } +step ry2 { SELECT count(*) FROM offense WHERE statute_cite = '123.45(1)a' AND offense_date >= DATE '2008-01-01'; } +step wx2 { DELETE FROM statute WHERE statute_cite = '123.45(1)a' AND eff_date = DATE '2008-01-01'; } +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/timeouts.spec b/src/test/isolation/specs/timeouts.spec index e167e1885af..c747b4ae28d 100644 --- a/src/test/isolation/specs/timeouts.spec +++ b/src/test/isolation/specs/timeouts.spec @@ -11,20 +11,20 @@ teardown DROP TABLE accounts; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "rdtbl" { SELECT * FROM accounts; } -step "wrtbl" { UPDATE accounts SET balance = balance + 100; } +step rdtbl { SELECT * FROM accounts; } +step wrtbl { UPDATE accounts SET balance = balance + 100; } teardown { ABORT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } -step "sto" { SET statement_timeout = '10ms'; } -step "lto" { SET lock_timeout = '10ms'; } -step "lsto" { SET lock_timeout = '10ms'; SET statement_timeout = '10s'; } -step "slto" { SET lock_timeout = '10s'; SET statement_timeout = '10ms'; } -step "locktbl" { LOCK TABLE accounts; } -step "update" { DELETE FROM accounts WHERE accountid = 'checking'; } +step sto { SET statement_timeout = '10ms'; } +step lto { SET lock_timeout = '10ms'; } +step lsto { SET lock_timeout = '10ms'; SET statement_timeout = '10s'; } +step slto { SET lock_timeout = '10s'; SET statement_timeout = '10ms'; } +step locktbl { LOCK TABLE accounts; } +step update { DELETE FROM accounts WHERE accountid = 'checking'; } teardown { ABORT; } # It's possible that the isolation tester will not observe the final @@ -32,18 +32,18 @@ teardown { ABORT; } # We can ensure consistent test output by marking those steps with (*). # statement timeout, table-level lock -permutation "rdtbl" "sto" "locktbl"(*) +permutation rdtbl sto locktbl(*) # lock timeout, table-level lock -permutation "rdtbl" "lto" "locktbl"(*) +permutation rdtbl lto locktbl(*) # lock timeout expires first, table-level lock -permutation "rdtbl" "lsto" "locktbl"(*) +permutation rdtbl lsto locktbl(*) # statement timeout expires first, table-level lock -permutation "rdtbl" "slto" "locktbl"(*) +permutation rdtbl slto locktbl(*) # statement timeout, row-level lock -permutation "wrtbl" "sto" "update"(*) +permutation wrtbl sto update(*) # lock timeout, row-level lock -permutation "wrtbl" "lto" "update"(*) +permutation wrtbl lto update(*) # lock timeout expires first, row-level lock -permutation "wrtbl" "lsto" "update"(*) +permutation wrtbl lsto update(*) # statement timeout expires first, row-level lock -permutation "wrtbl" "slto" "update"(*) +permutation wrtbl slto update(*) diff --git a/src/test/isolation/specs/total-cash.spec b/src/test/isolation/specs/total-cash.spec index 843f41c77f2..d98121a5f8a 100644 --- a/src/test/isolation/specs/total-cash.spec +++ b/src/test/isolation/specs/total-cash.spec @@ -15,14 +15,14 @@ teardown DROP TABLE accounts; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wx1" { UPDATE accounts SET balance = balance - 200 WHERE accountid = 'checking'; } -step "rxy1" { SELECT SUM(balance) FROM accounts; } -step "c1" { COMMIT; } +step wx1 { UPDATE accounts SET balance = balance - 200 WHERE accountid = 'checking'; } +step rxy1 { SELECT SUM(balance) FROM accounts; } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wy2" { UPDATE accounts SET balance = balance - 200 WHERE accountid = 'savings'; } -step "rxy2" { SELECT SUM(balance) FROM accounts; } -step "c2" { COMMIT; } +step wy2 { UPDATE accounts SET balance = balance - 200 WHERE accountid = 'savings'; } +step rxy2 { SELECT SUM(balance) FROM accounts; } +step c2 { COMMIT; } diff --git a/src/test/isolation/specs/tuplelock-conflict.spec b/src/test/isolation/specs/tuplelock-conflict.spec index 922b572f2d7..85582306c41 100644 --- a/src/test/isolation/specs/tuplelock-conflict.spec +++ b/src/test/isolation/specs/tuplelock-conflict.spec @@ -11,53 +11,53 @@ teardown { DROP TABLE multixact_conflict; } -session "s1" -step "s1_begin" { BEGIN; } -step "s1_lcksvpt" { SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; } -step "s1_tuplock1" { SELECT * FROM multixact_conflict FOR KEY SHARE; } -step "s1_tuplock2" { SELECT * FROM multixact_conflict FOR SHARE; } -step "s1_tuplock3" { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; } -step "s1_tuplock4" { SELECT * FROM multixact_conflict FOR UPDATE; } -step "s1_commit" { COMMIT; } +session s1 +step s1_begin { BEGIN; } +step s1_lcksvpt { SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; } +step s1_tuplock1 { SELECT * FROM multixact_conflict FOR KEY SHARE; } +step s1_tuplock2 { SELECT * FROM multixact_conflict FOR SHARE; } +step s1_tuplock3 { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; } +step s1_tuplock4 { SELECT * FROM multixact_conflict FOR UPDATE; } +step s1_commit { COMMIT; } -session "s2" -step "s2_tuplock1" { SELECT * FROM multixact_conflict FOR KEY SHARE; } -step "s2_tuplock2" { SELECT * FROM multixact_conflict FOR SHARE; } -step "s2_tuplock3" { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; } -step "s2_tuplock4" { SELECT * FROM multixact_conflict FOR UPDATE; } +session s2 +step s2_tuplock1 { SELECT * FROM multixact_conflict FOR KEY SHARE; } +step s2_tuplock2 { SELECT * FROM multixact_conflict FOR SHARE; } +step s2_tuplock3 { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; } +step s2_tuplock4 { SELECT * FROM multixact_conflict FOR UPDATE; } # The version with savepoints test the multixact cases -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock1" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock2" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock3" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock4" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock1" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock2" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock3" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock4" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock1" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock2" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock3" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock4" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock1" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock2" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock3" "s1_commit" -permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock4" "s1_commit" +permutation s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock1 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock2 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock3 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock4 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock1 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock2 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock3 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock4 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock1 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock2 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock3 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock4 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock1 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock2 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock3 s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock4 s1_commit # no multixacts here -permutation "s1_begin" "s1_tuplock1" "s2_tuplock1" "s1_commit" -permutation "s1_begin" "s1_tuplock1" "s2_tuplock2" "s1_commit" -permutation "s1_begin" "s1_tuplock1" "s2_tuplock3" "s1_commit" -permutation "s1_begin" "s1_tuplock1" "s2_tuplock4" "s1_commit" -permutation "s1_begin" "s1_tuplock2" "s2_tuplock1" "s1_commit" -permutation "s1_begin" "s1_tuplock2" "s2_tuplock2" "s1_commit" -permutation "s1_begin" "s1_tuplock2" "s2_tuplock3" "s1_commit" -permutation "s1_begin" "s1_tuplock2" "s2_tuplock4" "s1_commit" -permutation "s1_begin" "s1_tuplock3" "s2_tuplock1" "s1_commit" -permutation "s1_begin" "s1_tuplock3" "s2_tuplock2" "s1_commit" -permutation "s1_begin" "s1_tuplock3" "s2_tuplock3" "s1_commit" -permutation "s1_begin" "s1_tuplock3" "s2_tuplock4" "s1_commit" -permutation "s1_begin" "s1_tuplock4" "s2_tuplock1" "s1_commit" -permutation "s1_begin" "s1_tuplock4" "s2_tuplock2" "s1_commit" -permutation "s1_begin" "s1_tuplock4" "s2_tuplock3" "s1_commit" -permutation "s1_begin" "s1_tuplock4" "s2_tuplock4" "s1_commit" +permutation s1_begin s1_tuplock1 s2_tuplock1 s1_commit +permutation s1_begin s1_tuplock1 s2_tuplock2 s1_commit +permutation s1_begin s1_tuplock1 s2_tuplock3 s1_commit +permutation s1_begin s1_tuplock1 s2_tuplock4 s1_commit +permutation s1_begin s1_tuplock2 s2_tuplock1 s1_commit +permutation s1_begin s1_tuplock2 s2_tuplock2 s1_commit +permutation s1_begin s1_tuplock2 s2_tuplock3 s1_commit +permutation s1_begin s1_tuplock2 s2_tuplock4 s1_commit +permutation s1_begin s1_tuplock3 s2_tuplock1 s1_commit +permutation s1_begin s1_tuplock3 s2_tuplock2 s1_commit +permutation s1_begin s1_tuplock3 s2_tuplock3 s1_commit +permutation s1_begin s1_tuplock3 s2_tuplock4 s1_commit +permutation s1_begin s1_tuplock4 s2_tuplock1 s1_commit +permutation s1_begin s1_tuplock4 s2_tuplock2 s1_commit +permutation s1_begin s1_tuplock4 s2_tuplock3 s1_commit +permutation s1_begin s1_tuplock4 s2_tuplock4 s1_commit diff --git a/src/test/isolation/specs/tuplelock-update.spec b/src/test/isolation/specs/tuplelock-update.spec index d3de0bcbc78..4b940bcb124 100644 --- a/src/test/isolation/specs/tuplelock-update.spec +++ b/src/test/isolation/specs/tuplelock-update.spec @@ -8,30 +8,30 @@ teardown { DROP TABLE pktab; } -session "s1" -step "s1_advlock" { +session s1 +step s1_advlock { SELECT pg_advisory_lock(142857), pg_advisory_lock(285714), pg_advisory_lock(571428); } -step "s1_chain" { UPDATE pktab SET data = DEFAULT; } -step "s1_begin" { BEGIN; } -step "s1_grablock" { SELECT * FROM pktab FOR KEY SHARE; } -step "s1_advunlock1" { SELECT pg_advisory_unlock(142857); } -step "s1_advunlock2" { SELECT pg_advisory_unlock(285714); } -step "s1_advunlock3" { SELECT pg_advisory_unlock(571428); } -step "s1_commit" { COMMIT; } +step s1_chain { UPDATE pktab SET data = DEFAULT; } +step s1_begin { BEGIN; } +step s1_grablock { SELECT * FROM pktab FOR KEY SHARE; } +step s1_advunlock1 { SELECT pg_advisory_unlock(142857); } +step s1_advunlock2 { SELECT pg_advisory_unlock(285714); } +step s1_advunlock3 { SELECT pg_advisory_unlock(571428); } +step s1_commit { COMMIT; } -session "s2" -step "s2_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; } +session s2 +step s2_update { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; } -session "s3" -step "s3_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(285714) IS NOT NULL; } +session s3 +step s3_update { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(285714) IS NOT NULL; } -session "s4" -step "s4_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(571428) IS NOT NULL; } +session s4 +step s4_update { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(571428) IS NOT NULL; } # We use blocker annotations on the s1_advunlockN steps so that we will not # move on to the next step until the other session's released step finishes. # This ensures stable ordering of the test output. -permutation "s1_advlock" "s2_update" "s3_update" "s4_update" "s1_chain" "s1_begin" "s1_grablock" "s1_advunlock1"("s2_update") "s1_advunlock2"("s3_update") "s1_advunlock3"("s4_update") "s1_commit" +permutation s1_advlock s2_update s3_update s4_update s1_chain s1_begin s1_grablock s1_advunlock1(s2_update) s1_advunlock2(s3_update) s1_advunlock3(s4_update) s1_commit diff --git a/src/test/isolation/specs/tuplelock-upgrade-no-deadlock.spec b/src/test/isolation/specs/tuplelock-upgrade-no-deadlock.spec index 106c2465c0a..6221a27f4b0 100644 --- a/src/test/isolation/specs/tuplelock-upgrade-no-deadlock.spec +++ b/src/test/isolation/specs/tuplelock-upgrade-no-deadlock.spec @@ -16,54 +16,54 @@ teardown drop table tlu_job; } -session "s0" -step "s0_begin" { begin; } -step "s0_keyshare" { select id from tlu_job where id = 1 for key share;} -step "s0_rollback" { rollback; } +session s0 +step s0_begin { begin; } +step s0_keyshare { select id from tlu_job where id = 1 for key share;} +step s0_rollback { rollback; } -session "s1" +session s1 setup { begin; } -step "s1_keyshare" { select id from tlu_job where id = 1 for key share;} -step "s1_share" { select id from tlu_job where id = 1 for share; } -step "s1_fornokeyupd" { select id from tlu_job where id = 1 for no key update; } -step "s1_update" { update tlu_job set name = 'b' where id = 1; } -step "s1_savept_e" { savepoint s1_e; } -step "s1_savept_f" { savepoint s1_f; } -step "s1_rollback_e" { rollback to s1_e; } -step "s1_rollback_f" { rollback to s1_f; } -step "s1_rollback" { rollback; } -step "s1_commit" { commit; } +step s1_keyshare { select id from tlu_job where id = 1 for key share;} +step s1_share { select id from tlu_job where id = 1 for share; } +step s1_fornokeyupd { select id from tlu_job where id = 1 for no key update; } +step s1_update { update tlu_job set name = 'b' where id = 1; } +step s1_savept_e { savepoint s1_e; } +step s1_savept_f { savepoint s1_f; } +step s1_rollback_e { rollback to s1_e; } +step s1_rollback_f { rollback to s1_f; } +step s1_rollback { rollback; } +step s1_commit { commit; } -session "s2" +session s2 setup { begin; } -step "s2_for_keyshare" { select id from tlu_job where id = 1 for key share; } -step "s2_fornokeyupd" { select id from tlu_job where id = 1 for no key update; } -step "s2_for_update" { select id from tlu_job where id = 1 for update; } -step "s2_update" { update tlu_job set name = 'b' where id = 1; } -step "s2_delete" { delete from tlu_job where id = 1; } -step "s2_rollback" { rollback; } +step s2_for_keyshare { select id from tlu_job where id = 1 for key share; } +step s2_fornokeyupd { select id from tlu_job where id = 1 for no key update; } +step s2_for_update { select id from tlu_job where id = 1 for update; } +step s2_update { update tlu_job set name = 'b' where id = 1; } +step s2_delete { delete from tlu_job where id = 1; } +step s2_rollback { rollback; } -session "s3" +session s3 setup { begin; } -step "s3_keyshare" { select id from tlu_job where id = 1 for key share; } -step "s3_share" { select id from tlu_job where id = 1 for share; } -step "s3_for_update" { select id from tlu_job where id = 1 for update; } -step "s3_update" { update tlu_job set name = 'c' where id = 1; } -step "s3_delete" { delete from tlu_job where id = 1; } -step "s3_rollback" { rollback; } -step "s3_commit" { commit; } +step s3_keyshare { select id from tlu_job where id = 1 for key share; } +step s3_share { select id from tlu_job where id = 1 for share; } +step s3_for_update { select id from tlu_job where id = 1 for update; } +step s3_update { update tlu_job set name = 'c' where id = 1; } +step s3_delete { delete from tlu_job where id = 1; } +step s3_rollback { rollback; } +step s3_commit { commit; } # test that s2 will not deadlock with s3 when s1 is rolled back -permutation "s1_share" "s2_for_update" "s3_share" "s3_for_update" "s1_rollback" "s3_rollback" "s2_rollback" +permutation s1_share s2_for_update s3_share s3_for_update s1_rollback s3_rollback s2_rollback # test that update does not cause deadlocks if it can proceed -permutation "s1_keyshare" "s2_for_update" "s3_keyshare" "s1_update" "s3_update" "s1_rollback" "s3_rollback" "s2_rollback" -permutation "s1_keyshare" "s2_for_update" "s3_keyshare" "s1_update" "s3_update" "s1_commit" "s3_rollback" "s2_rollback" +permutation s1_keyshare s2_for_update s3_keyshare s1_update s3_update s1_rollback s3_rollback s2_rollback +permutation s1_keyshare s2_for_update s3_keyshare s1_update s3_update s1_commit s3_rollback s2_rollback # test that delete does not cause deadlocks if it can proceed -permutation "s1_keyshare" "s2_for_update" "s3_keyshare" "s3_delete" "s1_rollback" "s3_rollback" "s2_rollback" -permutation "s1_keyshare" "s2_for_update" "s3_keyshare" "s3_delete" "s1_rollback" "s3_commit" "s2_rollback" +permutation s1_keyshare s2_for_update s3_keyshare s3_delete s1_rollback s3_rollback s2_rollback +permutation s1_keyshare s2_for_update s3_keyshare s3_delete s1_rollback s3_commit s2_rollback # test that sessions that don't upgrade locks acquire them in order -permutation "s1_share" "s2_for_update" "s3_for_update" "s1_rollback" "s2_rollback" "s3_rollback" -permutation "s1_share" "s2_update" "s3_update" "s1_rollback" "s2_rollback" "s3_rollback" -permutation "s1_share" "s2_delete" "s3_delete" "s1_rollback" "s2_rollback" "s3_rollback" +permutation s1_share s2_for_update s3_for_update s1_rollback s2_rollback s3_rollback +permutation s1_share s2_update s3_update s1_rollback s2_rollback s3_rollback +permutation s1_share s2_delete s3_delete s1_rollback s2_rollback s3_rollback # test s2 retrying the overall tuple lock algorithm after initially avoiding deadlock -permutation "s1_keyshare" "s3_for_update" "s2_for_keyshare" "s1_savept_e" "s1_share" "s1_savept_f" "s1_fornokeyupd" "s2_fornokeyupd" "s0_begin" "s0_keyshare" "s1_rollback_f" "s0_keyshare" "s1_rollback_e" "s1_rollback" "s2_rollback" "s0_rollback" "s3_rollback" +permutation s1_keyshare s3_for_update s2_for_keyshare s1_savept_e s1_share s1_savept_f s1_fornokeyupd s2_fornokeyupd s0_begin s0_keyshare s1_rollback_f s0_keyshare s1_rollback_e s1_rollback s2_rollback s0_rollback s3_rollback diff --git a/src/test/isolation/specs/two-ids.spec b/src/test/isolation/specs/two-ids.spec index 277097125ac..fc0289f236d 100644 --- a/src/test/isolation/specs/two-ids.spec +++ b/src/test/isolation/specs/two-ids.spec @@ -24,17 +24,17 @@ teardown DROP TABLE D1, D2; } -session "s1" +session s1 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "wx1" { update D1 set id = id + 1; } -step "c1" { COMMIT; } +step wx1 { update D1 set id = id + 1; } +step c1 { COMMIT; } -session "s2" +session s2 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "rxwy2" { update D2 set id = (select id+1 from D1); } -step "c2" { COMMIT; } +step rxwy2 { update D2 set id = (select id+1 from D1); } +step c2 { COMMIT; } -session "s3" +session s3 setup { BEGIN ISOLATION LEVEL SERIALIZABLE; } -step "ry3" { select id from D2; } -step "c3" { COMMIT; } +step ry3 { select id from D2; } +step c3 { COMMIT; } diff --git a/src/test/isolation/specs/update-conflict-out.spec b/src/test/isolation/specs/update-conflict-out.spec index 25c27d4ca65..8aad6aa6619 100644 --- a/src/test/isolation/specs/update-conflict-out.spec +++ b/src/test/isolation/specs/update-conflict-out.spec @@ -16,39 +16,39 @@ teardown DROP TABLE txn1; } -session "foo" +session foo setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } -step "foo_select" { SELECT * FROM txn0 WHERE id = 42; } -step "foo_insert" { INSERT INTO txn1 SELECT 7, 'foo_insert'; } -step "foo_commit" { COMMIT; } +step foo_select { SELECT * FROM txn0 WHERE id = 42; } +step foo_insert { INSERT INTO txn1 SELECT 7, 'foo_insert'; } +step foo_commit { COMMIT; } -session "bar" +session bar setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } -step "bar_select" { SELECT * FROM txn1 WHERE id = 7; } -step "bar_insert" { INSERT INTO txn0 SELECT 42, 'bar_insert'; } -step "bar_commit" { COMMIT; } +step bar_select { SELECT * FROM txn1 WHERE id = 7; } +step bar_insert { INSERT INTO txn0 SELECT 42, 'bar_insert'; } +step bar_commit { COMMIT; } # This session creates the conditions that confused bar's "conflict out" # handling in old releases affected by bug: -session "trouble" +session trouble setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } -step "trouble_update" { UPDATE txn1 SET val = 'add physical version for "bar_select"' WHERE id = 7; } -step "trouble_delete" { DELETE FROM txn1 WHERE id = 7; } -step "trouble_abort" { ABORT; } +step trouble_update { UPDATE txn1 SET val = 'add physical version for "bar_select"' WHERE id = 7; } +step trouble_delete { DELETE FROM txn1 WHERE id = 7; } +step trouble_abort { ABORT; } -permutation "foo_select" - "bar_insert" - "foo_insert" "foo_commit" - "trouble_update" # Updates tuple... - "bar_select" # Should observe one distinct XID per version - "bar_commit" # "bar" should fail here at the latest - "trouble_abort" +permutation foo_select + bar_insert + foo_insert foo_commit + trouble_update # Updates tuple... + bar_select # Should observe one distinct XID per version + bar_commit # "bar" should fail here at the latest + trouble_abort # Same as above, but "trouble" session DELETEs this time around -permutation "foo_select" - "bar_insert" - "foo_insert" "foo_commit" - "trouble_delete" # Deletes tuple... - "bar_select" # Should observe foo's XID - "bar_commit" # "bar" should fail here at the latest - "trouble_abort" +permutation foo_select + bar_insert + foo_insert foo_commit + trouble_delete # Deletes tuple... + bar_select # Should observe foo's XID + bar_commit # "bar" should fail here at the latest + trouble_abort diff --git a/src/test/isolation/specs/update-locked-tuple.spec b/src/test/isolation/specs/update-locked-tuple.spec index 10dd3ef3d23..0dad792e798 100644 --- a/src/test/isolation/specs/update-locked-tuple.spec +++ b/src/test/isolation/specs/update-locked-tuple.spec @@ -19,20 +19,20 @@ teardown DROP TABLE users, orders; } -session "s1" -step "s1b" { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "s1u1" { UPDATE orders SET name = 'order of olivier (2)', user_id = 1 WHERE id = 1; } -step "s1u2" { UPDATE orders SET name = 'order of olivier (3)', user_id = 1 WHERE id = 1; } -step "s1c" { COMMIT; } +session s1 +step s1b { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step s1u1 { UPDATE orders SET name = 'order of olivier (2)', user_id = 1 WHERE id = 1; } +step s1u2 { UPDATE orders SET name = 'order of olivier (3)', user_id = 1 WHERE id = 1; } +step s1c { COMMIT; } -session "s2" -step "s2b" { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "s2u" { UPDATE users SET sometime = '1830-10-04' WHERE id = 1; } -step "s2c" { COMMIT; } +session s2 +step s2b { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step s2u { UPDATE users SET sometime = '1830-10-04' WHERE id = 1; } +step s2c { COMMIT; } -permutation "s1b" "s2b" "s2u" "s2c" "s1u1" "s1u2" "s1c" -permutation "s1b" "s2b" "s2u" "s1u1" "s2c" "s1u2" "s1c" -permutation "s1b" "s2b" "s1u1" "s2u" "s2c" "s1u2" "s1c" -permutation "s1b" "s1u1" "s2b" "s2u" "s2c" "s1u2" "s1c" -permutation "s1b" "s1u1" "s2b" "s1u2" "s2u" "s2c" "s1c" -permutation "s1b" "s1u1" "s1u2" "s2b" "s2u" "s2c" "s1c" +permutation s1b s2b s2u s2c s1u1 s1u2 s1c +permutation s1b s2b s2u s1u1 s2c s1u2 s1c +permutation s1b s2b s1u1 s2u s2c s1u2 s1c +permutation s1b s1u1 s2b s2u s2c s1u2 s1c +permutation s1b s1u1 s2b s1u2 s2u s2c s1c +permutation s1b s1u1 s1u2 s2b s2u s2c s1c diff --git a/src/test/isolation/specs/vacuum-reltuples.spec b/src/test/isolation/specs/vacuum-reltuples.spec index 6d9fa010b3c..ae2f79b8fe8 100644 --- a/src/test/isolation/specs/vacuum-reltuples.spec +++ b/src/test/isolation/specs/vacuum-reltuples.spec @@ -19,30 +19,30 @@ teardown { drop table smalltbl; } -session "worker" -step "open" { +session worker +step open { begin; declare c1 cursor for select 1 as dummy from smalltbl; } -step "fetch1" { +step fetch1 { fetch next from c1; } -step "close" { +step close { commit; } -step "stats" { +step stats { select relpages, reltuples from pg_class where oid='smalltbl'::regclass; } -session "vacuumer" -step "vac" { +session vacuumer +step vac { vacuum smalltbl; } -step "modify" { +step modify { insert into smalltbl select max(id)+1 from smalltbl; } -permutation "modify" "vac" "stats" -permutation "modify" "open" "fetch1" "vac" "close" "stats" -permutation "modify" "vac" "stats" +permutation modify vac stats +permutation modify open fetch1 vac close stats +permutation modify vac stats diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l index 40cdc9f5bee..ebfaacadfac 100644 --- a/src/test/isolation/specscanner.l +++ b/src/test/isolation/specscanner.l @@ -32,17 +32,21 @@ static void addlitchar(char c); %x sql -%x qstr - -digit [0123456789] - -self [,()*] +%x qident non_newline [^\n\r] space [ \t\r\f] comment ("#"{non_newline}*) +digit [0-9] +ident_start [A-Za-z\200-\377_] +ident_cont [A-Za-z\200-\377_0-9\$] + +identifier {ident_start}{ident_cont}* + +self [,()*] + %% %{ @@ -50,6 +54,7 @@ comment ("#"{non_newline}*) litbufsize = LITBUF_INIT; %} + /* Keywords (must appear before the {identifier} rule!) */ notices { return NOTICES; } permutation { return PERMUTATION; } session { return SESSION; } @@ -57,33 +62,35 @@ setup { return SETUP; } step { return STEP; } teardown { return TEARDOWN; } -{digit}+ { - yylval.integer = atoi(yytext); - return INTEGER; - } - -{self} { return yytext[0]; } - + /* Whitespace and comments */ [\n] { yyline++; } {comment} { /* ignore */ } {space} { /* ignore */ } - /* Quoted strings: "foo" */ + /* Plain identifiers */ +{identifier} { + yylval.str = pg_strdup(yytext); + return(identifier); + } + + /* Quoted identifiers: "foo" */ \" { litbufpos = 0; - BEGIN(qstr); + BEGIN(qident); } -\" { +\"\" { addlitchar(yytext[0]); } +\" { litbuf[litbufpos] = '\0'; yylval.str = pg_strdup(litbuf); BEGIN(INITIAL); - return(string_literal); + return(identifier); } -. { addlitchar(yytext[0]); } -\n { yyerror("unexpected newline in quoted string"); } -<> { yyerror("unterminated quoted string"); } +. { addlitchar(yytext[0]); } +\n { yyerror("unexpected newline in quoted identifier"); } +<> { yyerror("unterminated quoted identifier"); } /* SQL blocks: { UPDATE ... } */ + /* We trim leading/trailing whitespace, otherwise they're unprocessed */ "{"{space}* { litbufpos = 0; @@ -106,6 +113,15 @@ teardown { return TEARDOWN; } yyerror("unterminated sql block"); } + /* Numbers and punctuation */ +{digit}+ { + yylval.integer = atoi(yytext); + return INTEGER; + } + +{self} { return yytext[0]; } + + /* Anything else is an error */ . { fprintf(stderr, "syntax error at line %d: unexpected character \"%s\"\n", yyline, yytext); exit(1);