From 2f725cfd98c601c1ccd6285d9db6031ce6f8b7da Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 29 Jul 2026 02:02:48 +0200 Subject: [PATCH 1/8] Fix 4 CI flakes found in a recent-failures sweep - tests/pgautofailover_utils.py: Cluster.communicate()'s final fallback call passed timeout - full_secs straight into subprocess.communicate(). When timeout is a whole number (the common case, e.g. COMMAND_TIMEOUT=60) that remainder is exactly 0 after the per-second retry loop already exhausted the budget, and passing 0 (or an epsilon-negative value, depending on scheduling) lets subprocess's own deadline arithmetic flip a "still not done" into a spurious TimeoutExpired reporting a nonsensical negative timeout (observed: -6.8e-06s during teardown). Clamp to a small positive minimum. - tests/tap/specs/auth.pgaf: test_006_no_password_leak_on_monitor_disconnect used a fixed sleep 5s margin after disconnecting the network, which wasn't always enough under a loaded CI runner. Bump to 15s, matching the same-class fix already applied to has_needed_replication_slots()'s retry_timeout. - src/bin/pg_autoctl/config.c: build_xdg_path()'s pg_mkdir_p() call failed outright on EEXIST when two pg_autoctl processes (a node's own supervisor and a separately-invoked one-shot CLI command) raced to create the same XDG_RUNTIME_DIR fallback ancestor directory. Tolerate losing that race as long as the directory exists afterward. - tests/tap/specs/config_get_set.pgaf: test_002b_config_set_node's config-set call (even the one that's ultimately rejected) signals node1's running supervisor to reload, restarting its sub-services. The very next step immediately queried the monitor for node1's region and could race that restart cascade. Add the same 2s settle sleep test_001_init_primary already uses after its own config-set. --- src/bin/pg_autoctl/config.c | 11 +++++++++-- tests/pgautofailover_utils.py | 13 ++++++++++++- tests/tap/specs/auth.pgaf | 6 +++++- tests/tap/specs/config_get_set.pgaf | 7 +++++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/bin/pg_autoctl/config.c b/src/bin/pg_autoctl/config.c index 898867a53..afbc90ad6 100644 --- a/src/bin/pg_autoctl/config.c +++ b/src/bin/pg_autoctl/config.c @@ -122,8 +122,15 @@ build_xdg_path(char *dst, join_path_components(filename, filename, pgdata); } - /* mkdir -p the target directory */ - if (pg_mkdir_p(filename, 0755) == -1) + /* + * mkdir -p the target directory. Several pg_autoctl processes (e.g. a + * freshly started node's own supervisor and a one-shot CLI command + * invoked against it) can race to create the same XDG_RUNTIME_DIR + * fallback ancestor (typically "/tmp/pg_autoctl") the first time either + * of them runs -- tolerate losing that race rather than failing, as + * long as the directory exists by the time we're done. + */ + if (pg_mkdir_p(filename, 0755) == -1 && !directory_exists(filename)) { log_error("Failed to create state directory \"%s\": %m", filename); return false; diff --git a/tests/pgautofailover_utils.py b/tests/pgautofailover_utils.py index 76acb88c4..0c74f5495 100644 --- a/tests/pgautofailover_utils.py +++ b/tests/pgautofailover_utils.py @@ -252,7 +252,18 @@ def communicate(self, proc, timeout): pass self.flush_output() - return proc.communicate(timeout=timeout - full_secs) + + # When timeout is a whole number (the common case, e.g. the plain + # int COMMAND_TIMEOUT), the loop above already consumed the entire + # budget and this remainder is exactly 0 -- passing that (or an + # epsilon-negative value, depending on float rounding) straight into + # subprocess.communicate() lets its internal deadline arithmetic + # decide whether to wait at all, and it can flip a "still not done" + # into a spurious TimeoutExpired reporting a nonsensical negative + # timeout. Clamp to a small positive value so we always make one + # real last check instead. + remaining = timeout - full_secs + return proc.communicate(timeout=remaining if remaining > 0 else 0.1) def create_root_cert(self, directory, basename="root", CN="root"): self.cert = cert.SSLCert(directory, basename, CN) diff --git a/tests/tap/specs/auth.pgaf b/tests/tap/specs/auth.pgaf index c7e52aa4a..1935ca356 100644 --- a/tests/tap/specs/auth.pgaf +++ b/tests/tap/specs/auth.pgaf @@ -80,8 +80,12 @@ step test_006_no_password_leak_on_monitor_disconnect { # node1 (secondary) cannot reach the monitor while cut off from the # network: its node-active loop keeps retrying node_active() and hitting # the "Failed to connect to monitor database" error path (see #1043). + # + # 5s wasn't always enough margin under a loaded CI runner (same class of + # flake as has_needed_replication_slots()'s retry_timeout bump 5s -> 15s), + # so give it the same headroom here. network disconnect node1 - sleep 5s + sleep 15s logs node1 contains "Failed to connect to monitor database" logs node1 contains "****" logs node1 not contains "pg-auto-failover" diff --git a/tests/tap/specs/config_get_set.pgaf b/tests/tap/specs/config_get_set.pgaf index bb95d8f5d..8082c4b5c 100644 --- a/tests/tap/specs/config_get_set.pgaf +++ b/tests/tap/specs/config_get_set.pgaf @@ -45,6 +45,13 @@ step test_002b_config_set_node { exec-fails node1 pg_autoctl config set postgresql.pg_ctl invalid exec node1 pg_autoctl config get postgresql.pg_ctl expect { /bin/pg_ctl } + + # config set (even one that's ultimately rejected, above) signals node1's + # running supervisor to reload, which restarts its sub-services -- give + # it the same settle time test_001_init_primary already does after its + # own config-set, so the next step's monitor query doesn't race a node + # still re-registering after the restart cascade. + sleep 2s } # region is set at create time (node1 region dc1) and, unlike From 5df9af640dac47d2a362f5820df2cb2beb0f914a Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 29 Jul 2026 03:48:22 +0200 Subject: [PATCH 2/8] pgaftest: add 'wait until replays ' and fix upgrade.pgaf's flaky test_009 A 5th flaky test surfaced in this PR's own CI (pgaftest / upgrade, test_009_write_on_new_primary): it writes to the new primary right after a promotion and immediately reads the write back from a standby, racing the FSM's state transition against actual replication catch-up. Rather than another fixed sleep, add a proper DSL primitive: wait until replays [timeout Ns] Captures 's current WAL LSN (or, if it's itself a standby, its own last-replayed LSN) once, at the moment the command runs, then polls until its last-replayed LSN has caught up. Wired through all four places that dispatch on TestCmdKind (test_cmd_print, runner_exec_cmd, cmd_label in test_runner.c; print_cmd in cli_indent.c) plus the DSL reference docs. upgrade.pgaf's test_009 now waits for both standbys to replay the primary's post-INSERT LSN before reading the row count back. --- docs/ref/pgaftest.rst | 11 + src/bin/pgaftest/cli_indent.c | 7 + src/bin/pgaftest/test_runner.c | 74 ++ src/bin/pgaftest/test_spec.h | 7 + src/bin/pgaftest/test_spec_parse.c | 1169 ++++++++++++------------ src/bin/pgaftest/test_spec_parse.h | 164 ++-- src/bin/pgaftest/test_spec_parse.y | 17 +- src/bin/pgaftest/test_spec_scan.c | 1345 ++++++++++++++-------------- src/bin/pgaftest/test_spec_scan.l | 1 + tests/tap/specs/upgrade.pgaf | 8 + 10 files changed, 1475 insertions(+), 1328 deletions(-) diff --git a/docs/ref/pgaftest.rst b/docs/ref/pgaftest.rst index 7eed400bc..15e39de76 100644 --- a/docs/ref/pgaftest.rst +++ b/docs/ref/pgaftest.rst @@ -488,6 +488,17 @@ Commands inside ``setup``, ``teardown``, and ``step`` blocks wait until state is [timeout s] wait until primary, secondary [timeout s] wait until stopped [timeout s] + wait until replays [timeout s] + +``wait until replays `` captures ````'s current WAL +position (or, if ```` is itself a standby, its own last-replayed +position) once, at the moment the command runs, then polls ```` until +it has replayed at least that far. Use it right after a write on ```` +and before reading that data back from ````, instead of racing a fixed +``sleep`` against replication catch-up -- especially right after a +promotion/failover, when a node's FSM state can flip to +``primary``/``secondary`` a moment before a subsequent write has actually +propagated. **Assertions** diff --git a/src/bin/pgaftest/cli_indent.c b/src/bin/pgaftest/cli_indent.c index e849951fc..8f6552c99 100644 --- a/src/bin/pgaftest/cli_indent.c +++ b/src/bin/pgaftest/cli_indent.c @@ -885,6 +885,13 @@ print_cmd(FILE *out, const TestCmd *cmd, int indent) break; } + case CMD_WAIT_LSN: + { + fformat(out, "%*swait until %s replays %s timeout %ds\n", + indent, "", cmd->service, cmd->state, cmd->timeoutSeconds); + break; + } + case CMD_PROMOTE: { fformat(out, "%*spromote", indent, ""); diff --git a/src/bin/pgaftest/test_runner.c b/src/bin/pgaftest/test_runner.c index 7477949d4..7c69e9483 100644 --- a/src/bin/pgaftest/test_runner.c +++ b/src/bin/pgaftest/test_runner.c @@ -89,6 +89,13 @@ test_cmd_print(FILE *f, const TestCmd *cmd, int indent) break; } + case CMD_WAIT_LSN: + { + fprintf(f, "%swait until %s replays %s timeout %ds\n", /* IGNORE-BANNED */ + pad, cmd->service, cmd->state, cmd->timeoutSeconds); + break; + } + case CMD_ASSERT_STATE: { fprintf(f, "%sassert %s state = %s\n", /* IGNORE-BANNED */ @@ -3813,6 +3820,66 @@ runner_exec_cmd(TestRunner *r, TestCmd *cmd, char *errBuf, int errLen) return false; } + case CMD_WAIT_LSN: + { + const char *targetNode = cmd->service; + const char *sourceNode = cmd->state; + int timeoutSecs = cmd->timeoutSeconds; + + /* + * Capture the source's WAL position now, once, at the moment + * this command runs -- not something re-evaluated on every poll + * iteration, which could chase a moving target forever on a + * busy primary. pg_is_in_recovery() lets this work whichever + * role the source currently has. + */ + char lsn[64] = ""; + if (!exec_sql_on_service( + r, sourceNode, + "SELECT CASE WHEN pg_is_in_recovery() " + "THEN pg_last_wal_replay_lsn() " + "ELSE pg_current_wal_lsn() END;", + lsn, sizeof(lsn))) + { + sformat(errBuf, errLen, + "wait until %s replays %s: failed to capture %s's LSN: %s", + targetNode, sourceNode, sourceNode, lsn); + return false; + } + + int n = strlen(lsn); + while (n > 0 && (lsn[n - 1] == '\n' || lsn[n - 1] == ' ')) + { + lsn[--n] = '\0'; + } + + log_info(" Waiting for %s to replay %s's LSN %s (timeout %ds)", + targetNode, sourceNode, lsn, timeoutSecs); + + char query[256]; + sformat(query, sizeof(query), + "SELECT pg_last_wal_replay_lsn() >= '%s';", lsn); + + time_t deadline = time(NULL) + timeoutSecs; + while (time(NULL) < deadline) + { + char caughtUp[64] = ""; + if (exec_sql_on_service(r, targetNode, query, + caughtUp, sizeof(caughtUp)) && + caughtUp[0] == 't') + { + return true; + } + + usleep(500000); /* 500ms */ + } + + sformat(errBuf, errLen, + "timeout: %s did not replay %s's LSN %s within %ds", + targetNode, sourceNode, lsn, timeoutSecs); + return false; + } + case CMD_STOP_POSTGRES: { /* @@ -4350,6 +4417,13 @@ cmd_label(const TestCmd *cmd, char *buf, int len) break; } + case CMD_WAIT_LSN: + { + sformat(buf, len, "wait until %s replays %s timeout %ds", + cmd->service, cmd->state, cmd->timeoutSeconds); + break; + } + case CMD_WAIT_MULTI: { char parts[512] = ""; diff --git a/src/bin/pgaftest/test_spec.h b/src/bin/pgaftest/test_spec.h index 196a8826b..9f0034d49 100644 --- a/src/bin/pgaftest/test_spec.h +++ b/src/bin/pgaftest/test_spec.h @@ -181,6 +181,13 @@ typedef enum TestCmdKind * node's host-side .ini [settings] entry directly * and asserts it equals . service = node, * state = key, args = expected value. */ + CMD_WAIT_LSN, /* wait until replays [timeout Ns] — + * captures 's current (or, if it's itself a + * standby, last-replayed) WAL LSN at the moment this + * command runs, then polls until its own + * last-replayed LSN has caught up to that captured + * value. service = node to poll, state = source + * node to capture the LSN from. */ } TestCmdKind; typedef struct TestCmd diff --git a/src/bin/pgaftest/test_spec_parse.c b/src/bin/pgaftest/test_spec_parse.c index f03a7f1e8..1a1b355ac 100644 --- a/src/bin/pgaftest/test_spec_parse.c +++ b/src/bin/pgaftest/test_spec_parse.c @@ -141,46 +141,47 @@ T_AND = 330, T_IS = 331, T_WITH = 332, - T_ASSERT = 333, - T_SQL = 334, - T_EXPECT = 335, - T_ERROR = 336, - T_PROMOTE = 337, - T_PERFORM = 338, - T_FAILOVER = 339, - T_NETWORK = 340, - T_DISCONNECT = 341, - T_CONNECT = 342, - T_SLEEP = 343, - T_COMPOSE = 344, - T_DOWN = 345, - T_START = 346, - T_STOP = 347, - T_STOPPED = 348, - T_KILL = 349, - T_INJECT = 350, - T_STATE = 351, - T_ASSIGNED_STATE = 352, - T_IN = 353, - T_GROUP = 354, - T_LBRACE = 355, - T_RBRACE = 356, - T_COMMA = 357, - T_POSTGRES = 358, - T_STAYS = 359, - T_WHILE = 360, - T_THROUGH = 361, - T_SET = 362, - T_GET = 363, - T_LOGS = 364, - T_NOT = 365, - T_CONTAINS = 366, - T_MATCHES = 367, - T_INTEGER = 368, - T_IDENT = 369, - T_STRING = 370, - T_BLOCK = 371, - T_SHELL_ARGS = 372 + T_REPLAYS = 333, + T_ASSERT = 334, + T_SQL = 335, + T_EXPECT = 336, + T_ERROR = 337, + T_PROMOTE = 338, + T_PERFORM = 339, + T_FAILOVER = 340, + T_NETWORK = 341, + T_DISCONNECT = 342, + T_CONNECT = 343, + T_SLEEP = 344, + T_COMPOSE = 345, + T_DOWN = 346, + T_START = 347, + T_STOP = 348, + T_STOPPED = 349, + T_KILL = 350, + T_INJECT = 351, + T_STATE = 352, + T_ASSIGNED_STATE = 353, + T_IN = 354, + T_GROUP = 355, + T_LBRACE = 356, + T_RBRACE = 357, + T_COMMA = 358, + T_POSTGRES = 359, + T_STAYS = 360, + T_WHILE = 361, + T_THROUGH = 362, + T_SET = 363, + T_GET = 364, + T_LOGS = 365, + T_NOT = 366, + T_CONTAINS = 367, + T_MATCHES = 368, + T_INTEGER = 369, + T_IDENT = 370, + T_STRING = 371, + T_BLOCK = 372, + T_SHELL_ARGS = 373 }; #endif /* Tokens. */ @@ -259,46 +260,47 @@ #define T_AND 330 #define T_IS 331 #define T_WITH 332 -#define T_ASSERT 333 -#define T_SQL 334 -#define T_EXPECT 335 -#define T_ERROR 336 -#define T_PROMOTE 337 -#define T_PERFORM 338 -#define T_FAILOVER 339 -#define T_NETWORK 340 -#define T_DISCONNECT 341 -#define T_CONNECT 342 -#define T_SLEEP 343 -#define T_COMPOSE 344 -#define T_DOWN 345 -#define T_START 346 -#define T_STOP 347 -#define T_STOPPED 348 -#define T_KILL 349 -#define T_INJECT 350 -#define T_STATE 351 -#define T_ASSIGNED_STATE 352 -#define T_IN 353 -#define T_GROUP 354 -#define T_LBRACE 355 -#define T_RBRACE 356 -#define T_COMMA 357 -#define T_POSTGRES 358 -#define T_STAYS 359 -#define T_WHILE 360 -#define T_THROUGH 361 -#define T_SET 362 -#define T_GET 363 -#define T_LOGS 364 -#define T_NOT 365 -#define T_CONTAINS 366 -#define T_MATCHES 367 -#define T_INTEGER 368 -#define T_IDENT 369 -#define T_STRING 370 -#define T_BLOCK 371 -#define T_SHELL_ARGS 372 +#define T_REPLAYS 333 +#define T_ASSERT 334 +#define T_SQL 335 +#define T_EXPECT 336 +#define T_ERROR 337 +#define T_PROMOTE 338 +#define T_PERFORM 339 +#define T_FAILOVER 340 +#define T_NETWORK 341 +#define T_DISCONNECT 342 +#define T_CONNECT 343 +#define T_SLEEP 344 +#define T_COMPOSE 345 +#define T_DOWN 346 +#define T_START 347 +#define T_STOP 348 +#define T_STOPPED 349 +#define T_KILL 350 +#define T_INJECT 351 +#define T_STATE 352 +#define T_ASSIGNED_STATE 353 +#define T_IN 354 +#define T_GROUP 355 +#define T_LBRACE 356 +#define T_RBRACE 357 +#define T_COMMA 358 +#define T_POSTGRES 359 +#define T_STAYS 360 +#define T_WHILE 361 +#define T_THROUGH 362 +#define T_SET 363 +#define T_GET 364 +#define T_LOGS 365 +#define T_NOT 366 +#define T_CONTAINS 367 +#define T_MATCHES 368 +#define T_INTEGER 369 +#define T_IDENT 370 +#define T_STRING 371 +#define T_BLOCK 372 +#define T_SHELL_ARGS 373 @@ -477,7 +479,7 @@ typedef union YYSTYPE TestCmd *cmd; } /* Line 193 of yacc.c. */ -#line 481 "test_spec_parse.c" +#line 483 "test_spec_parse.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -490,7 +492,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 494 "test_spec_parse.c" +#line 496 "test_spec_parse.c" #ifdef short # undef short @@ -705,20 +707,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 21 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 609 +#define YYLAST 618 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 118 +#define YYNTOKENS 119 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 64 /* YYNRULES -- Number of rules. */ -#define YYNRULES 210 +#define YYNRULES 211 /* YYNRULES -- Number of states. */ -#define YYNSTATES 347 +#define YYNSTATES 350 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 372 +#define YYMAXUTOK 373 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -763,7 +765,7 @@ static const yytype_uint8 yytranslate[] = 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117 + 115, 116, 117, 118 }; #if YYDEBUG @@ -784,87 +786,87 @@ static const yytype_uint16 yyprhs[] = 271, 273, 275, 277, 279, 281, 283, 285, 287, 291, 294, 298, 301, 305, 308, 312, 315, 317, 319, 321, 326, 331, 333, 337, 338, 341, 343, 345, 349, 353, - 354, 364, 365, 375, 383, 391, 397, 403, 410, 412, - 414, 418, 422, 423, 426, 429, 434, 435, 438, 442, - 449, 456, 463, 470, 474, 477, 480, 484, 488, 491, - 493, 497, 500, 505, 511, 519, 523, 527, 533, 539, - 542, 545, 549, 553, 557, 562, 566, 570, 571, 577, - 583, 587, 592, 598, 603, 609, 612, 613, 616, 618, - 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, - 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, - 660 + 354, 364, 365, 375, 383, 391, 397, 404, 410, 417, + 419, 421, 425, 429, 430, 433, 436, 441, 442, 445, + 449, 456, 463, 470, 477, 481, 484, 487, 491, 495, + 498, 500, 504, 507, 512, 518, 526, 530, 534, 540, + 546, 549, 552, 556, 560, 564, 569, 573, 577, 578, + 584, 590, 594, 599, 605, 610, 616, 619, 620, 623, + 625, 627, 629, 631, 633, 635, 637, 639, 641, 643, + 645, 647, 649, 651, 653, 655, 657, 659, 661, 663, + 665, 667 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 119, 0, -1, 120, -1, 119, 120, -1, 121, -1, - 143, -1, 144, -1, 145, -1, 178, -1, -1, 3, - 100, 122, 123, 101, -1, -1, 123, 124, -1, 125, - -1, 126, -1, 128, -1, 129, -1, 127, -1, 130, - -1, 43, -1, 44, -1, 4, -1, 4, 39, 114, - -1, 4, 14, 114, -1, 4, 35, 113, -1, 4, - 36, 115, -1, 4, 114, 24, 26, -1, 4, 114, - 30, 93, -1, 4, 114, 24, 26, 36, 115, -1, - 13, 115, -1, 13, 114, -1, 42, 114, -1, 42, - 115, -1, 15, 114, -1, 16, 114, -1, 17, 114, - -1, -1, 18, 131, 132, 100, 135, 101, -1, -1, - 132, 134, -1, 114, -1, 115, -1, 16, -1, 4, - -1, 5, -1, 133, -1, 19, 113, -1, 55, 28, - -1, -1, 135, 138, -1, 114, -1, 4, -1, -1, - -1, 136, 137, 139, 141, -1, -1, 5, 114, 137, - 140, 100, 141, 101, -1, -1, 141, 142, -1, 20, + 120, 0, -1, 121, -1, 120, 121, -1, 122, -1, + 144, -1, 145, -1, 146, -1, 179, -1, -1, 3, + 101, 123, 124, 102, -1, -1, 124, 125, -1, 126, + -1, 127, -1, 129, -1, 130, -1, 128, -1, 131, + -1, 43, -1, 44, -1, 4, -1, 4, 39, 115, + -1, 4, 14, 115, -1, 4, 35, 114, -1, 4, + 36, 116, -1, 4, 115, 24, 26, -1, 4, 115, + 30, 94, -1, 4, 115, 24, 26, 36, 116, -1, + 13, 116, -1, 13, 115, -1, 42, 115, -1, 42, + 116, -1, 15, 115, -1, 16, 115, -1, 17, 115, + -1, -1, 18, 132, 133, 101, 136, 102, -1, -1, + 133, 135, -1, 115, -1, 116, -1, 16, -1, 4, + -1, 5, -1, 134, -1, 19, 114, -1, 55, 28, + -1, -1, 136, 139, -1, 115, -1, 4, -1, -1, + -1, 137, 138, 140, 142, -1, -1, 5, 115, 138, + 141, 101, 142, 102, -1, -1, 142, 143, -1, 20, -1, 21, -1, 22, -1, 23, -1, 26, -1, 24, 26, -1, 25, 26, -1, 25, 75, 24, 26, -1, 24, 27, -1, 27, -1, 32, -1, 33, -1, 34, - 113, -1, 45, 114, -1, 45, 115, -1, 99, 113, - -1, 35, 113, -1, 38, 114, -1, 39, 114, -1, - 15, 114, -1, 16, 114, -1, 17, 114, -1, 40, - 29, -1, 40, 28, -1, 41, 115, -1, 37, 115, - -1, 31, 114, 114, -1, 31, 114, 115, -1, 8, - 146, -1, 9, 146, -1, 10, 181, 146, -1, 100, - 147, 101, -1, -1, 147, 148, -1, 149, -1, 155, - -1, 162, -1, 163, -1, 164, -1, 165, -1, 167, - -1, 168, -1, 170, -1, 171, -1, 172, -1, 175, - -1, 176, -1, 177, -1, 169, -1, 68, 114, 117, - -1, 68, 114, -1, 69, 114, 117, -1, 69, 114, - -1, 70, 114, 117, -1, 70, 114, -1, 71, 114, - 117, -1, 71, 114, -1, 71, -1, 12, -1, 76, - -1, 114, 96, 150, 180, -1, 114, 96, 150, 114, - -1, 151, -1, 152, 75, 151, -1, -1, 106, 154, - -1, 180, -1, 114, -1, 154, 102, 180, -1, 154, - 102, 114, -1, -1, 72, 73, 114, 96, 150, 180, - 156, 153, 161, -1, -1, 72, 73, 114, 96, 150, - 114, 157, 153, 161, -1, 72, 73, 114, 97, 150, - 180, 161, -1, 72, 73, 114, 97, 150, 114, 161, - -1, 72, 73, 114, 93, 161, -1, 72, 73, 158, - 159, 161, -1, 72, 73, 151, 75, 152, 161, -1, - 180, -1, 114, -1, 158, 102, 180, -1, 158, 102, - 114, -1, -1, 98, 160, -1, 99, 113, -1, 160, - 102, 99, 113, -1, -1, 74, 113, -1, 77, 74, - 113, -1, 78, 114, 96, 150, 180, 161, -1, 78, - 114, 96, 150, 114, 161, -1, 78, 114, 97, 150, - 180, 161, -1, 78, 114, 97, 150, 114, 161, -1, - 79, 114, 116, -1, 80, 116, -1, 80, 81, -1, - 80, 81, 114, -1, 80, 81, 113, -1, 82, 166, - -1, 114, -1, 166, 102, 114, -1, 83, 84, -1, - 83, 84, 99, 113, -1, 83, 84, 98, 18, 114, - -1, 83, 84, 98, 18, 114, 99, 113, -1, 85, - 86, 114, -1, 85, 87, 114, -1, 46, 107, 114, - 114, 114, -1, 46, 108, 114, 114, 114, -1, 88, - 113, -1, 89, 90, -1, 89, 91, 114, -1, 89, - 92, 114, -1, 89, 94, 114, -1, 89, 95, 114, - 117, -1, 92, 103, 136, -1, 91, 103, 136, -1, - -1, 105, 174, 100, 147, 101, -1, 78, 136, 104, - 180, 173, -1, 107, 114, 114, -1, 109, 114, 111, - 115, -1, 109, 114, 110, 111, 115, -1, 109, 114, - 112, 115, -1, 109, 114, 110, 112, 115, -1, 11, - 179, -1, -1, 179, 181, -1, 47, -1, 48, -1, - 49, -1, 50, -1, 51, -1, 52, -1, 53, -1, - 54, -1, 55, -1, 56, -1, 57, -1, 58, -1, - 59, -1, 60, -1, 61, -1, 62, -1, 63, -1, - 64, -1, 65, -1, 66, -1, 67, -1, 114, -1, - 115, -1 + 114, -1, 45, 115, -1, 45, 116, -1, 100, 114, + -1, 35, 114, -1, 38, 115, -1, 39, 115, -1, + 15, 115, -1, 16, 115, -1, 17, 115, -1, 40, + 29, -1, 40, 28, -1, 41, 116, -1, 37, 116, + -1, 31, 115, 115, -1, 31, 115, 116, -1, 8, + 147, -1, 9, 147, -1, 10, 182, 147, -1, 101, + 148, 102, -1, -1, 148, 149, -1, 150, -1, 156, + -1, 163, -1, 164, -1, 165, -1, 166, -1, 168, + -1, 169, -1, 171, -1, 172, -1, 173, -1, 176, + -1, 177, -1, 178, -1, 170, -1, 68, 115, 118, + -1, 68, 115, -1, 69, 115, 118, -1, 69, 115, + -1, 70, 115, 118, -1, 70, 115, -1, 71, 115, + 118, -1, 71, 115, -1, 71, -1, 12, -1, 76, + -1, 115, 97, 151, 181, -1, 115, 97, 151, 115, + -1, 152, -1, 153, 75, 152, -1, -1, 107, 155, + -1, 181, -1, 115, -1, 155, 103, 181, -1, 155, + 103, 115, -1, -1, 72, 73, 115, 97, 151, 181, + 157, 154, 162, -1, -1, 72, 73, 115, 97, 151, + 115, 158, 154, 162, -1, 72, 73, 115, 98, 151, + 181, 162, -1, 72, 73, 115, 98, 151, 115, 162, + -1, 72, 73, 115, 94, 162, -1, 72, 73, 115, + 78, 115, 162, -1, 72, 73, 159, 160, 162, -1, + 72, 73, 152, 75, 153, 162, -1, 181, -1, 115, + -1, 159, 103, 181, -1, 159, 103, 115, -1, -1, + 99, 161, -1, 100, 114, -1, 161, 103, 100, 114, + -1, -1, 74, 114, -1, 77, 74, 114, -1, 79, + 115, 97, 151, 181, 162, -1, 79, 115, 97, 151, + 115, 162, -1, 79, 115, 98, 151, 181, 162, -1, + 79, 115, 98, 151, 115, 162, -1, 80, 115, 117, + -1, 81, 117, -1, 81, 82, -1, 81, 82, 115, + -1, 81, 82, 114, -1, 83, 167, -1, 115, -1, + 167, 103, 115, -1, 84, 85, -1, 84, 85, 100, + 114, -1, 84, 85, 99, 18, 115, -1, 84, 85, + 99, 18, 115, 100, 114, -1, 86, 87, 115, -1, + 86, 88, 115, -1, 46, 108, 115, 115, 115, -1, + 46, 109, 115, 115, 115, -1, 89, 114, -1, 90, + 91, -1, 90, 92, 115, -1, 90, 93, 115, -1, + 90, 95, 115, -1, 90, 96, 115, 118, -1, 93, + 104, 137, -1, 92, 104, 137, -1, -1, 106, 175, + 101, 148, 102, -1, 79, 137, 105, 181, 174, -1, + 108, 115, 115, -1, 110, 115, 112, 116, -1, 110, + 115, 111, 112, 116, -1, 110, 115, 113, 116, -1, + 110, 115, 111, 113, 116, -1, 11, 180, -1, -1, + 180, 182, -1, 47, -1, 48, -1, 49, -1, 50, + -1, 51, -1, 52, -1, 53, -1, 54, -1, 55, + -1, 56, -1, 57, -1, 58, -1, 59, -1, 60, + -1, 61, -1, 62, -1, 63, -1, 64, -1, 65, + -1, 66, -1, 67, -1, 115, -1, 116, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -883,15 +885,15 @@ static const yytype_uint16 yyrline[] = 733, 734, 735, 736, 737, 738, 739, 740, 754, 761, 767, 774, 780, 787, 793, 801, 807, 834, 834, 845, 860, 878, 879, 894, 896, 900, 908, 916, 923, 935, - 934, 946, 945, 956, 965, 974, 981, 995, 1010, 1016, - 1023, 1029, 1042, 1044, 1048, 1053, 1061, 1062, 1063, 1074, - 1082, 1090, 1098, 1116, 1131, 1138, 1142, 1148, 1161, 1169, - 1177, 1198, 1205, 1212, 1220, 1236, 1242, 1263, 1271, 1286, - 1300, 1304, 1310, 1316, 1342, 1376, 1382, 1399, 1399, 1404, - 1423, 1448, 1457, 1466, 1475, 1491, 1494, 1496, 1518, 1519, - 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, - 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1546, - 1547 + 934, 946, 945, 956, 965, 974, 988, 996, 1010, 1025, + 1031, 1038, 1044, 1057, 1059, 1063, 1068, 1076, 1077, 1078, + 1089, 1097, 1105, 1113, 1131, 1146, 1153, 1157, 1163, 1176, + 1184, 1192, 1213, 1220, 1227, 1235, 1251, 1257, 1278, 1286, + 1301, 1315, 1319, 1325, 1331, 1357, 1391, 1397, 1414, 1414, + 1419, 1438, 1463, 1472, 1481, 1490, 1506, 1509, 1511, 1533, + 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, + 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, + 1561, 1562 }; #endif @@ -918,15 +920,15 @@ static const char *const yytname[] = "T_FS_PREPARE_MAINTENANCE", "T_FS_WAIT_MAINTENANCE", "T_FS_REPORT_LSN", "T_FS_FAST_FORWARD", "T_FS_JOIN_SECONDARY", "T_FS_DROPPED", "T_EXEC", "T_EXEC_FAILS", "T_RUN", "T_PG_AUTOCTL", "T_WAIT", "T_UNTIL", - "T_TIMEOUT", "T_AND", "T_IS", "T_WITH", "T_ASSERT", "T_SQL", "T_EXPECT", - "T_ERROR", "T_PROMOTE", "T_PERFORM", "T_FAILOVER", "T_NETWORK", - "T_DISCONNECT", "T_CONNECT", "T_SLEEP", "T_COMPOSE", "T_DOWN", "T_START", - "T_STOP", "T_STOPPED", "T_KILL", "T_INJECT", "T_STATE", - "T_ASSIGNED_STATE", "T_IN", "T_GROUP", "T_LBRACE", "T_RBRACE", "T_COMMA", - "T_POSTGRES", "T_STAYS", "T_WHILE", "T_THROUGH", "T_SET", "T_GET", - "T_LOGS", "T_NOT", "T_CONTAINS", "T_MATCHES", "T_INTEGER", "T_IDENT", - "T_STRING", "T_BLOCK", "T_SHELL_ARGS", "$accept", "spec", "spec_item", - "cluster_block", "@1", "cluster_item_list", "cluster_item", + "T_TIMEOUT", "T_AND", "T_IS", "T_WITH", "T_REPLAYS", "T_ASSERT", "T_SQL", + "T_EXPECT", "T_ERROR", "T_PROMOTE", "T_PERFORM", "T_FAILOVER", + "T_NETWORK", "T_DISCONNECT", "T_CONNECT", "T_SLEEP", "T_COMPOSE", + "T_DOWN", "T_START", "T_STOP", "T_STOPPED", "T_KILL", "T_INJECT", + "T_STATE", "T_ASSIGNED_STATE", "T_IN", "T_GROUP", "T_LBRACE", "T_RBRACE", + "T_COMMA", "T_POSTGRES", "T_STAYS", "T_WHILE", "T_THROUGH", "T_SET", + "T_GET", "T_LOGS", "T_NOT", "T_CONTAINS", "T_MATCHES", "T_INTEGER", + "T_IDENT", "T_STRING", "T_BLOCK", "T_SHELL_ARGS", "$accept", "spec", + "spec_item", "cluster_block", "@1", "cluster_item_list", "cluster_item", "monitor_line", "image_line", "extension_version_line", "ssl_line", "auth_line", "formation_block", "@2", "formation_opt_list", "bare_name", "formation_opt", "node_list", "node_name", "init_node_slot", "node_line", @@ -959,35 +961,35 @@ static const yytype_uint16 yytoknum[] = 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372 + 365, 366, 367, 368, 369, 370, 371, 372, 373 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 118, 119, 119, 120, 120, 120, 120, 120, 122, - 121, 123, 123, 124, 124, 124, 124, 124, 124, 124, - 124, 125, 125, 125, 125, 125, 125, 125, 125, 126, - 126, 127, 127, 128, 129, 129, 131, 130, 132, 132, - 133, 133, 133, 133, 133, 134, 134, 134, 135, 135, - 136, 136, 137, 139, 138, 140, 138, 141, 141, 142, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 143, 144, 145, - 146, 147, 147, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 150, 150, 151, - 151, 152, 152, 153, 153, 154, 154, 154, 154, 156, - 155, 157, 155, 155, 155, 155, 155, 155, 158, 158, - 158, 158, 159, 159, 160, 160, 161, 161, 161, 162, - 162, 162, 162, 163, 164, 164, 164, 164, 165, 166, - 166, 167, 167, 167, 167, 168, 168, 169, 169, 170, - 171, 171, 171, 171, 171, 172, 172, 174, 173, 175, - 176, 177, 177, 177, 177, 178, 179, 179, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, - 181 + 0, 119, 120, 120, 121, 121, 121, 121, 121, 123, + 122, 124, 124, 125, 125, 125, 125, 125, 125, 125, + 125, 126, 126, 126, 126, 126, 126, 126, 126, 127, + 127, 128, 128, 129, 130, 130, 132, 131, 133, 133, + 134, 134, 134, 134, 134, 135, 135, 135, 136, 136, + 137, 137, 138, 140, 139, 141, 139, 142, 142, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 144, 145, 146, + 147, 148, 148, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 151, 151, 152, + 152, 153, 153, 154, 154, 155, 155, 155, 155, 157, + 156, 158, 156, 156, 156, 156, 156, 156, 156, 159, + 159, 159, 159, 160, 160, 161, 161, 162, 162, 162, + 163, 163, 163, 163, 164, 165, 165, 165, 165, 166, + 167, 167, 168, 168, 168, 168, 169, 169, 170, 170, + 171, 172, 172, 172, 172, 172, 173, 173, 175, 174, + 176, 177, 178, 178, 178, 178, 179, 180, 180, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 182, 182 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -1006,15 +1008,15 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 3, 2, 3, 2, 1, 1, 1, 4, 4, 1, 3, 0, 2, 1, 1, 3, 3, 0, - 9, 0, 9, 7, 7, 5, 5, 6, 1, 1, - 3, 3, 0, 2, 2, 4, 0, 2, 3, 6, - 6, 6, 6, 3, 2, 2, 3, 3, 2, 1, - 3, 2, 4, 5, 7, 3, 3, 5, 5, 2, - 2, 3, 3, 3, 4, 3, 3, 0, 5, 5, - 3, 4, 5, 4, 5, 2, 0, 2, 1, 1, + 9, 0, 9, 7, 7, 5, 6, 5, 6, 1, + 1, 3, 3, 0, 2, 2, 4, 0, 2, 3, + 6, 6, 6, 6, 3, 2, 2, 3, 3, 2, + 1, 3, 2, 4, 5, 7, 3, 3, 5, 5, + 2, 2, 3, 3, 3, 4, 3, 3, 0, 5, + 5, 3, 4, 5, 4, 5, 2, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 + 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -1022,107 +1024,107 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 0, 0, 0, 0, 186, 0, 2, 4, 5, - 6, 7, 8, 9, 91, 87, 88, 209, 210, 0, - 185, 1, 3, 11, 0, 89, 187, 0, 0, 0, + 0, 0, 0, 0, 0, 187, 0, 2, 4, 5, + 6, 7, 8, 9, 91, 87, 88, 210, 211, 0, + 186, 1, 3, 11, 0, 89, 188, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 92, 93, 94, 95, 96, 97, 98, 99, 100, 107, 101, 102, 103, 104, 105, 106, 21, 0, 0, 0, 0, 36, 0, 19, 20, 10, 12, 13, 14, 17, 15, 16, 18, 0, 0, 109, 111, 113, 115, 0, 51, 50, 0, - 0, 155, 154, 159, 158, 161, 0, 0, 169, 170, + 0, 156, 155, 160, 159, 162, 0, 0, 170, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 29, 33, 34, 35, 38, 31, - 32, 0, 0, 108, 110, 112, 114, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 139, 0, - 142, 138, 0, 0, 0, 153, 157, 156, 0, 0, - 0, 165, 166, 171, 172, 173, 0, 50, 176, 175, - 180, 0, 0, 0, 23, 24, 25, 22, 0, 0, - 0, 0, 0, 146, 0, 0, 0, 0, 0, 146, - 117, 118, 0, 0, 0, 160, 0, 162, 174, 0, - 0, 181, 183, 26, 27, 43, 44, 42, 0, 0, - 48, 40, 41, 45, 39, 167, 168, 0, 0, 135, - 0, 0, 0, 121, 146, 0, 143, 141, 140, 136, - 146, 146, 146, 146, 177, 179, 163, 182, 184, 0, - 46, 47, 0, 147, 0, 131, 129, 146, 146, 0, - 0, 137, 144, 0, 150, 149, 152, 151, 0, 0, - 28, 0, 37, 52, 49, 148, 123, 123, 134, 133, - 0, 122, 0, 91, 164, 52, 53, 0, 146, 146, - 120, 119, 145, 0, 55, 57, 126, 124, 125, 132, - 130, 178, 0, 54, 0, 57, 0, 0, 0, 59, - 60, 61, 62, 0, 0, 63, 68, 0, 69, 70, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 128, 127, 0, 78, 79, 80, 64, 67, 65, 0, - 0, 71, 75, 84, 76, 77, 82, 81, 83, 72, - 73, 74, 56, 0, 85, 86, 66 + 32, 0, 0, 108, 110, 112, 114, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 140, 0, + 143, 139, 0, 0, 0, 154, 158, 157, 0, 0, + 0, 166, 167, 172, 173, 174, 0, 50, 177, 176, + 181, 0, 0, 0, 23, 24, 25, 22, 0, 0, + 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, + 147, 117, 118, 0, 0, 0, 161, 0, 163, 175, + 0, 0, 182, 184, 26, 27, 43, 44, 42, 0, + 0, 48, 40, 41, 45, 39, 168, 169, 147, 0, + 0, 135, 0, 0, 0, 121, 147, 0, 144, 142, + 141, 137, 147, 147, 147, 147, 178, 180, 164, 183, + 185, 0, 46, 47, 0, 136, 148, 0, 131, 129, + 147, 147, 0, 0, 138, 145, 0, 151, 150, 153, + 152, 0, 0, 28, 0, 37, 52, 49, 149, 123, + 123, 134, 133, 0, 122, 0, 91, 165, 52, 53, + 0, 147, 147, 120, 119, 146, 0, 55, 57, 126, + 124, 125, 132, 130, 179, 0, 54, 0, 57, 0, + 0, 0, 59, 60, 61, 62, 0, 0, 63, 68, + 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 58, 128, 127, 0, 78, 79, 80, 64, + 67, 65, 0, 0, 71, 75, 84, 76, 77, 82, + 81, 83, 72, 73, 74, 56, 0, 85, 86, 66 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 6, 7, 8, 23, 27, 73, 74, 75, 76, - 77, 78, 79, 118, 180, 213, 214, 242, 89, 276, - 264, 285, 292, 293, 319, 9, 10, 11, 15, 24, - 47, 48, 192, 149, 224, 278, 287, 49, 267, 266, - 150, 189, 226, 219, 50, 51, 52, 53, 94, 54, - 55, 56, 57, 58, 59, 235, 258, 60, 61, 62, + 77, 78, 79, 118, 180, 214, 215, 244, 89, 279, + 267, 288, 295, 296, 322, 9, 10, 11, 15, 24, + 47, 48, 193, 149, 226, 281, 290, 49, 270, 269, + 150, 190, 228, 221, 50, 51, 52, 53, 94, 54, + 55, 56, 57, 58, 59, 237, 261, 60, 61, 62, 12, 20, 151, 19 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -174 +#define YYPACT_NINF -176 static const yytype_int16 yypact[] = { - 80, -81, -72, -72, -52, -174, 71, -174, -174, -174, - -174, -174, -174, -174, -174, -174, -174, -174, -174, -72, - -52, -174, -174, -174, 432, -174, -174, 7, -15, -71, - -59, -57, -50, -40, 3, -27, -69, -16, 25, 8, - 11, -22, 16, 19, -174, 24, 32, -174, -174, -174, - -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, - -174, -174, -174, -4, -18, 42, 53, 59, -174, -14, - -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, - 67, 94, 93, 116, 117, 118, 136, -174, 15, 133, - 122, 52, -174, -174, 138, 5, 125, 127, -174, -174, - 128, 129, 130, 131, 4, 4, 132, -26, 134, 159, - 158, 135, 6, -174, -174, -174, -174, -174, -174, -174, - -174, 160, 161, -174, -174, -174, -174, -174, -174, -174, - -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, - -174, -174, -174, -174, -174, -174, -174, -174, -51, 172, - -54, -174, 2, 2, 542, -174, -174, -174, 162, 259, - 188, -174, -174, -174, -174, -174, 185, -174, -174, -174, - -174, 9, 163, 189, -174, -174, -174, -174, 277, 212, - -1, 192, 193, -21, 2, 2, 194, 210, 165, -21, - -174, -174, 204, 233, 205, -174, 197, -174, -174, 198, - 199, -174, -174, 276, -174, -174, -174, -174, 202, 288, - -174, -174, -174, -174, -174, -174, -174, 227, 243, -174, - 272, 301, 245, -174, -48, 229, 241, -174, -174, -174, - -21, -21, -21, -21, -174, -174, 246, -174, -174, 231, - -174, -174, 1, -174, 256, 269, 295, -21, -21, 2, - 194, -174, -174, 273, -174, -174, -174, -174, 271, 260, - -174, 261, -174, -174, -174, -174, 268, 268, -174, -174, - 340, -174, 263, -174, -174, -174, -174, 369, -21, -21, - -174, -174, -174, 479, -174, -174, -174, 275, -174, -174, - -174, -174, 278, 137, 408, -174, 265, 266, 267, -174, - -174, -174, -174, 102, -10, -174, -174, 270, -174, -174, - 296, 297, 293, 298, 299, 151, 322, 90, 325, -174, - -174, -174, 110, -174, -174, -174, -174, -174, -174, 358, - 92, -174, -174, -174, -174, -174, -174, -174, -174, -174, - -174, -174, -174, 357, -174, -174, -174 + 74, -87, -74, -74, -59, -176, 55, -176, -176, -176, + -176, -176, -176, -176, -176, -176, -176, -176, -176, -74, + -59, -176, -176, -176, 439, -176, -176, 6, -48, -81, + -68, -64, -36, -20, 3, -34, -65, -27, 11, 14, + -24, 2, -5, 7, -176, 27, 34, -176, -176, -176, + -176, -176, -176, -176, -176, -176, -176, -176, -176, -176, + -176, -176, -176, -6, -11, 44, 61, 69, -176, -9, + -176, -176, -176, -176, -176, -176, -176, -176, -176, -176, + 99, 122, 9, 52, 120, 121, 139, -176, 15, 16, + 0, 10, -176, -176, 138, 32, 127, 128, -176, -176, + 129, 130, 131, 132, 5, 5, 133, -41, 134, 136, + 135, 137, 8, -176, -176, -176, -176, -176, -176, -176, + -176, 161, 162, -176, -176, -176, -176, -176, -176, -176, + -176, -176, -176, -176, -176, -176, -176, -176, -176, -176, + -176, -176, -176, -176, -176, -176, -176, -176, -52, 178, + -62, -176, 4, 4, 551, -176, -176, -176, 163, 261, + 166, -176, -176, -176, -176, -176, 164, -176, -176, -176, + -176, 56, 165, 167, -176, -176, -176, -176, 280, 213, + -1, 193, 194, 195, -49, 4, 4, 196, 212, 169, + -49, -176, -176, 208, 238, 207, -176, 199, -176, -176, + 200, 201, -176, -176, 279, -176, -176, -176, -176, 204, + 291, -176, -176, -176, -176, -176, -176, -176, -49, 206, + 247, -176, 277, 307, 225, -176, 12, 231, 243, -176, + -176, -176, -49, -49, -49, -49, -176, -176, 248, -176, + -176, 233, -176, -176, 1, -176, -176, 236, 272, 276, + -49, -49, 4, 196, -176, -176, 252, -176, -176, -176, + -176, 274, 262, -176, 263, -176, -176, -176, -176, 270, + 270, -176, -176, 346, -176, 265, -176, -176, -176, -176, + 376, -49, -49, -176, -176, -176, 487, -176, -176, -176, + 278, -176, -176, -176, -176, 281, 140, 415, -176, 268, + 269, 271, -176, -176, -176, -176, 156, -13, -176, -176, + 273, -176, -176, 266, 275, 298, 300, 301, 179, 302, + 94, 303, -176, -176, -176, 113, -176, -176, -176, -176, + -176, -176, 361, 96, -176, -176, -176, -176, -176, -176, + -176, -176, -176, -176, -176, -176, 364, -176, -176, -176 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -174, -174, 379, -174, -174, -174, -174, -174, -174, -174, - -174, -174, -174, -174, -174, -174, -174, -174, -103, 139, - -174, -174, -174, 144, -174, -174, -174, -174, 18, 167, - -174, -174, -144, -173, -174, 174, -174, -174, -174, -174, - -174, -174, -174, -172, -174, -174, -174, -174, -174, -174, - -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, - -174, -174, -154, 391 + -176, -176, 381, -176, -176, -176, -176, -176, -176, -176, + -176, -176, -176, -176, -176, -176, -176, -176, -103, 141, + -176, -176, -176, 93, -176, -176, -176, -176, 17, 144, + -176, -176, -142, -175, -176, 151, -176, -176, -176, -176, + -176, -176, -176, -159, -176, -176, -176, -176, -176, -176, + -176, -176, -176, -176, -176, -176, -176, -176, -176, -176, + -176, -176, -154, 424 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -1132,173 +1134,175 @@ static const yytype_int16 yypgoto[] = #define YYTABLE_NINF -121 static const yytype_int16 yytable[] = { - 194, 168, 169, 205, 206, 87, 261, 87, 87, 193, - 108, 63, 91, 223, 190, 207, 328, 229, 208, 13, - 64, 16, 65, 66, 67, 68, 217, 250, 14, 218, - 178, 109, 110, 86, 228, 111, 179, 25, 231, 233, - 220, 221, 183, 82, 187, 184, 185, 92, 188, 69, - 70, 71, 251, 217, 209, 83, 218, 84, 254, 255, - 256, 257, 17, 18, 85, 329, 246, 248, 99, 100, - 101, 21, 102, 103, 1, 268, 269, 271, 191, 2, - 3, 4, 5, 1, 171, 172, 173, 90, 2, 3, - 4, 5, 80, 81, 96, 97, 113, 114, 93, 210, - 119, 120, 262, 159, 160, 270, 289, 290, 72, 95, - 112, 152, 153, 211, 212, 167, 281, 88, 167, 104, - 199, 200, 105, 288, 98, 296, 297, 298, 326, 327, - 299, 300, 301, 302, 303, 304, 305, 306, 106, 263, - 321, 307, 308, 309, 310, 311, 107, 312, 313, 314, - 315, 316, 296, 297, 298, 317, 115, 299, 300, 301, - 302, 303, 304, 305, 306, 156, 157, 116, 307, 308, - 309, 310, 311, 117, 312, 313, 314, 315, 316, 336, - 337, 121, 317, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 339, 340, 344, 345, 122, 318, - 123, 342, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 124, 125, 126, 318, 154, 155, 161, - 158, 162, 163, 164, 165, 166, 170, 186, 174, 177, - 148, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 175, 176, 181, 182, 195, 196, 201, 227, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 197, 198, 203, 202, 204, 215, 216, 222, 225, - 234, 236, 239, 237, 238, 240, 241, 244, 230, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 243, 249, 252, 253, -120, 259, 260, 232, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 265, - -119, 273, 272, 274, 277, 275, 282, 294, 295, 323, - 324, 325, 343, 346, 330, 22, 245, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 333, 331, - 332, 26, 334, 335, 284, 247, 127, 128, 129, 130, + 195, 168, 169, 206, 207, 87, 264, 87, 108, 87, + 63, 194, 225, 331, 13, 208, 191, 91, 209, 64, + 16, 65, 66, 67, 68, 219, 183, 14, 220, 109, + 110, 231, 178, 111, 82, 230, 25, 188, 179, 233, + 235, 189, 184, 222, 223, 185, 186, 83, 69, 70, + 71, 84, 92, 86, 210, 21, 17, 18, 1, 245, + 80, 81, 332, 2, 3, 4, 5, 254, 249, 251, + 171, 172, 173, 257, 258, 259, 260, 1, 274, 85, + 192, 90, 2, 3, 4, 5, 219, 253, 93, 220, + 98, 271, 272, 99, 100, 101, 95, 102, 103, 104, + 211, 96, 97, 265, 113, 114, 119, 120, 72, 112, + 273, 105, 152, 153, 212, 213, 167, 155, 88, 284, + 167, 154, 292, 293, 156, 157, 291, 123, 299, 300, + 301, 159, 160, 302, 303, 304, 305, 306, 307, 308, + 309, 266, 106, 324, 310, 311, 312, 313, 314, 107, + 315, 316, 317, 318, 319, 299, 300, 301, 320, 115, + 302, 303, 304, 305, 306, 307, 308, 309, 200, 201, + 124, 310, 311, 312, 313, 314, 116, 315, 316, 317, + 318, 319, 329, 330, 117, 320, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 338, 341, 322, - 283, 279, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 280, 127, 128, 129, 130, 131, + 141, 142, 143, 144, 145, 146, 147, 339, 340, 342, + 343, 347, 348, 321, 121, 345, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 122, 125, 126, + 321, 158, 161, 162, 163, 164, 165, 166, 170, 174, + 175, 176, 177, 187, 148, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 181, 182, 196, 197, + 198, 202, 199, 203, 229, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 0, 0, 28, 0, - 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, + 142, 143, 144, 145, 146, 147, 204, 205, 216, 217, + 218, 224, 227, 236, 238, 241, 239, 240, 242, 243, + 246, 247, 252, 232, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 255, 256, -120, 262, 263, + 268, -119, 275, 234, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 276, 277, 280, 278, 285, + 334, 297, 298, 326, 327, 346, 328, 22, 333, 335, + 349, 325, 248, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 336, 337, 338, 344, 341, 287, + 286, 282, 250, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, - 34, 35, 36, 0, 37, 38, 0, 39, 0, 0, - 40, 41, 320, 42, 43, 28, 0, 0, 0, 0, - 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, - 0, 46, 0, 0, 0, 0, 0, 29, 30, 31, - 32, 33, 0, 0, 0, 0, 0, 34, 35, 36, - 0, 37, 38, 0, 39, 0, 0, 40, 41, 0, - 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, - 291, 0, 0, 0, 0, 0, 45, 0, 46, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147 + 0, 283, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 0, 0, 28, 0, 0, 0, 0, + 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 30, 31, + 32, 33, 0, 0, 0, 0, 0, 0, 34, 35, + 36, 0, 37, 38, 0, 39, 0, 0, 40, 41, + 323, 42, 43, 28, 0, 0, 0, 0, 0, 0, + 0, 44, 0, 0, 0, 0, 0, 45, 0, 46, + 0, 0, 0, 0, 0, 29, 30, 31, 32, 33, + 0, 0, 0, 0, 0, 0, 34, 35, 36, 0, + 37, 38, 0, 39, 0, 0, 40, 41, 0, 42, + 43, 0, 0, 0, 0, 0, 0, 0, 0, 294, + 0, 0, 0, 0, 0, 45, 0, 46, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147 }; static const yytype_int16 yycheck[] = { - 154, 104, 105, 4, 5, 4, 5, 4, 4, 153, - 14, 4, 81, 186, 12, 16, 26, 189, 19, 100, - 13, 3, 15, 16, 17, 18, 74, 75, 100, 77, - 24, 35, 36, 73, 188, 39, 30, 19, 192, 193, - 184, 185, 93, 114, 98, 96, 97, 116, 102, 42, - 43, 44, 224, 74, 55, 114, 77, 114, 230, 231, - 232, 233, 114, 115, 114, 75, 220, 221, 90, 91, - 92, 0, 94, 95, 3, 247, 248, 250, 76, 8, - 9, 10, 11, 3, 110, 111, 112, 114, 8, 9, - 10, 11, 107, 108, 86, 87, 114, 115, 114, 100, - 114, 115, 101, 98, 99, 249, 278, 279, 101, 84, - 114, 96, 97, 114, 115, 114, 270, 114, 114, 103, - 111, 112, 103, 277, 113, 15, 16, 17, 26, 27, - 20, 21, 22, 23, 24, 25, 26, 27, 114, 242, - 294, 31, 32, 33, 34, 35, 114, 37, 38, 39, - 40, 41, 15, 16, 17, 45, 114, 20, 21, 22, - 23, 24, 25, 26, 27, 113, 114, 114, 31, 32, - 33, 34, 35, 114, 37, 38, 39, 40, 41, 28, - 29, 114, 45, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 114, 115, 114, 115, 114, 99, - 117, 101, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 117, 117, 117, 99, 104, 116, 114, - 102, 114, 114, 114, 114, 114, 114, 75, 114, 114, - 114, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 113, 115, 114, 114, 114, 18, 115, 114, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 113, 117, 26, 115, 93, 114, 114, 114, 99, - 105, 114, 36, 115, 115, 113, 28, 74, 114, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 113, 96, 113, 102, 75, 99, 115, 114, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 113, - 75, 100, 99, 113, 106, 114, 113, 102, 100, 114, - 114, 114, 24, 26, 114, 6, 114, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 115, 113, - 113, 20, 114, 114, 275, 114, 47, 48, 49, 50, + 154, 104, 105, 4, 5, 4, 5, 4, 14, 4, + 4, 153, 187, 26, 101, 16, 12, 82, 19, 13, + 3, 15, 16, 17, 18, 74, 78, 101, 77, 35, + 36, 190, 24, 39, 115, 189, 19, 99, 30, 193, + 194, 103, 94, 185, 186, 97, 98, 115, 42, 43, + 44, 115, 117, 73, 55, 0, 115, 116, 3, 218, + 108, 109, 75, 8, 9, 10, 11, 226, 222, 223, + 111, 112, 113, 232, 233, 234, 235, 3, 253, 115, + 76, 115, 8, 9, 10, 11, 74, 75, 115, 77, + 114, 250, 251, 91, 92, 93, 85, 95, 96, 104, + 101, 87, 88, 102, 115, 116, 115, 116, 102, 115, + 252, 104, 97, 98, 115, 116, 115, 117, 115, 273, + 115, 105, 281, 282, 114, 115, 280, 118, 15, 16, + 17, 99, 100, 20, 21, 22, 23, 24, 25, 26, + 27, 244, 115, 297, 31, 32, 33, 34, 35, 115, + 37, 38, 39, 40, 41, 15, 16, 17, 45, 115, + 20, 21, 22, 23, 24, 25, 26, 27, 112, 113, + 118, 31, 32, 33, 34, 35, 115, 37, 38, 39, + 40, 41, 26, 27, 115, 45, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 28, 29, 115, + 116, 115, 116, 100, 115, 102, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 115, 113, 295, - 273, 267, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 114, 47, 48, 49, 50, 51, + 61, 62, 63, 64, 65, 66, 67, 115, 118, 118, + 100, 103, 115, 115, 115, 115, 115, 115, 115, 115, + 114, 116, 115, 75, 115, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 115, 115, 115, 18, + 114, 116, 118, 116, 115, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, -1, -1, 46, -1, - -1, -1, -1, 114, -1, -1, -1, -1, -1, -1, + 62, 63, 64, 65, 66, 67, 26, 94, 115, 115, + 115, 115, 100, 106, 115, 36, 116, 116, 114, 28, + 114, 74, 97, 115, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 114, 103, 75, 100, 116, + 114, 75, 100, 115, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 101, 114, 107, 115, 114, + 114, 103, 101, 115, 115, 24, 115, 6, 115, 114, + 26, 298, 115, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 116, 115, 115, 114, 116, 278, + 276, 270, 115, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 68, 69, 70, 71, 72, -1, -1, -1, -1, -1, - 78, 79, 80, -1, 82, 83, -1, 85, -1, -1, - 88, 89, 114, 91, 92, 46, -1, -1, -1, -1, - -1, -1, -1, 101, -1, -1, -1, -1, -1, 107, - -1, 109, -1, -1, -1, -1, -1, 68, 69, 70, - 71, 72, -1, -1, -1, -1, -1, 78, 79, 80, - -1, 82, 83, -1, 85, -1, -1, 88, 89, -1, - 91, 92, -1, -1, -1, -1, -1, -1, -1, -1, - 101, -1, -1, -1, -1, -1, 107, -1, 109, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67 + -1, 115, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, -1, -1, 46, -1, -1, -1, -1, + -1, 115, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 68, 69, 70, + 71, 72, -1, -1, -1, -1, -1, -1, 79, 80, + 81, -1, 83, 84, -1, 86, -1, -1, 89, 90, + 115, 92, 93, 46, -1, -1, -1, -1, -1, -1, + -1, 102, -1, -1, -1, -1, -1, 108, -1, 110, + -1, -1, -1, -1, -1, 68, 69, 70, 71, 72, + -1, -1, -1, -1, -1, -1, 79, 80, 81, -1, + 83, 84, -1, 86, -1, -1, 89, 90, -1, 92, + 93, -1, -1, -1, -1, -1, -1, -1, -1, 102, + -1, -1, -1, -1, -1, 108, -1, 110, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 3, 8, 9, 10, 11, 119, 120, 121, 143, - 144, 145, 178, 100, 100, 146, 146, 114, 115, 181, - 179, 0, 120, 122, 147, 146, 181, 123, 46, 68, - 69, 70, 71, 72, 78, 79, 80, 82, 83, 85, - 88, 89, 91, 92, 101, 107, 109, 148, 149, 155, - 162, 163, 164, 165, 167, 168, 169, 170, 171, 172, - 175, 176, 177, 4, 13, 15, 16, 17, 18, 42, - 43, 44, 101, 124, 125, 126, 127, 128, 129, 130, - 107, 108, 114, 114, 114, 114, 73, 4, 114, 136, - 114, 81, 116, 114, 166, 84, 86, 87, 113, 90, - 91, 92, 94, 95, 103, 103, 114, 114, 14, 35, - 36, 39, 114, 114, 115, 114, 114, 114, 131, 114, - 115, 114, 114, 117, 117, 117, 117, 47, 48, 49, + 0, 3, 8, 9, 10, 11, 120, 121, 122, 144, + 145, 146, 179, 101, 101, 147, 147, 115, 116, 182, + 180, 0, 121, 123, 148, 147, 182, 124, 46, 68, + 69, 70, 71, 72, 79, 80, 81, 83, 84, 86, + 89, 90, 92, 93, 102, 108, 110, 149, 150, 156, + 163, 164, 165, 166, 168, 169, 170, 171, 172, 173, + 176, 177, 178, 4, 13, 15, 16, 17, 18, 42, + 43, 44, 102, 125, 126, 127, 128, 129, 130, 131, + 108, 109, 115, 115, 115, 115, 73, 4, 115, 137, + 115, 82, 117, 115, 167, 85, 87, 88, 114, 91, + 92, 93, 95, 96, 104, 104, 115, 115, 14, 35, + 36, 39, 115, 115, 116, 115, 115, 115, 132, 115, + 116, 115, 115, 118, 118, 118, 118, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 114, 151, - 158, 180, 96, 97, 104, 116, 113, 114, 102, 98, - 99, 114, 114, 114, 114, 114, 114, 114, 136, 136, - 114, 110, 111, 112, 114, 113, 115, 114, 24, 30, - 132, 114, 114, 93, 96, 97, 75, 98, 102, 159, - 12, 76, 150, 150, 180, 114, 18, 113, 117, 111, - 112, 115, 115, 26, 93, 4, 5, 16, 19, 55, - 100, 114, 115, 133, 134, 114, 114, 74, 77, 161, - 150, 150, 114, 151, 152, 99, 160, 114, 180, 161, - 114, 180, 114, 180, 105, 173, 114, 115, 115, 36, - 113, 28, 135, 113, 74, 114, 180, 114, 180, 96, - 75, 161, 113, 102, 161, 161, 161, 161, 174, 99, - 115, 5, 101, 136, 138, 113, 157, 156, 161, 161, - 150, 151, 99, 100, 113, 114, 137, 106, 153, 153, - 114, 180, 113, 147, 137, 139, 114, 154, 180, 161, - 161, 101, 140, 141, 102, 100, 15, 16, 17, 20, - 21, 22, 23, 24, 25, 26, 27, 31, 32, 33, - 34, 35, 37, 38, 39, 40, 41, 45, 99, 142, - 114, 180, 141, 114, 114, 114, 26, 27, 26, 75, - 114, 113, 113, 115, 114, 114, 28, 29, 115, 114, - 115, 113, 101, 24, 114, 115, 26 + 60, 61, 62, 63, 64, 65, 66, 67, 115, 152, + 159, 181, 97, 98, 105, 117, 114, 115, 103, 99, + 100, 115, 115, 115, 115, 115, 115, 115, 137, 137, + 115, 111, 112, 113, 115, 114, 116, 115, 24, 30, + 133, 115, 115, 78, 94, 97, 98, 75, 99, 103, + 160, 12, 76, 151, 151, 181, 115, 18, 114, 118, + 112, 113, 116, 116, 26, 94, 4, 5, 16, 19, + 55, 101, 115, 116, 134, 135, 115, 115, 115, 74, + 77, 162, 151, 151, 115, 152, 153, 100, 161, 115, + 181, 162, 115, 181, 115, 181, 106, 174, 115, 116, + 116, 36, 114, 28, 136, 162, 114, 74, 115, 181, + 115, 181, 97, 75, 162, 114, 103, 162, 162, 162, + 162, 175, 100, 116, 5, 102, 137, 139, 114, 158, + 157, 162, 162, 151, 152, 100, 101, 114, 115, 138, + 107, 154, 154, 115, 181, 114, 148, 138, 140, 115, + 155, 181, 162, 162, 102, 141, 142, 103, 101, 15, + 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, + 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, + 45, 100, 143, 115, 181, 142, 115, 115, 115, 26, + 27, 26, 75, 115, 114, 114, 116, 115, 115, 28, + 29, 116, 115, 116, 114, 102, 24, 115, 116, 26 }; #define yyerrok (yyerrstatus = 0) @@ -2974,7 +2978,18 @@ yyparse () break; case 136: -#line 982 "test_spec_parse.y" +#line 989 "test_spec_parse.y" + { + (yyval.cmd) = make_cmd(CMD_WAIT_LSN); + strlcpy((yyval.cmd)->service, (yyvsp[(3) - (6)].str), sizeof((yyval.cmd)->service)); + strlcpy((yyval.cmd)->state, (yyvsp[(5) - (6)].str), sizeof((yyval.cmd)->state)); + (yyval.cmd)->timeoutSeconds = (yyvsp[(6) - (6)].ival); + free((yyvsp[(3) - (6)].str)); free((yyvsp[(5) - (6)].str)); + ;} + break; + + case 137: +#line 997 "test_spec_parse.y" { (yyval.cmd) = current_wait_cmd; (yyval.cmd)->timeoutSeconds = (yyvsp[(5) - (5)].ival); @@ -2982,8 +2997,8 @@ yyparse () ;} break; - case 137: -#line 996 "test_spec_parse.y" + case 138: +#line 1011 "test_spec_parse.y" { (yyval.cmd) = current_wait_cmd; (yyval.cmd)->timeoutSeconds = (yyvsp[(6) - (6)].ival); @@ -2991,8 +3006,8 @@ yyparse () ;} break; - case 138: -#line 1011 "test_spec_parse.y" + case 139: +#line 1026 "test_spec_parse.y" { current_wait_cmd = make_cmd(CMD_WAIT_STATES); strlcpy(current_wait_cmd->waitStates[current_wait_cmd->waitStateCount++], @@ -3000,8 +3015,8 @@ yyparse () ;} break; - case 139: -#line 1017 "test_spec_parse.y" + case 140: +#line 1032 "test_spec_parse.y" { current_wait_cmd = make_cmd(CMD_WAIT_STATES); strlcpy(current_wait_cmd->waitStates[current_wait_cmd->waitStateCount++], @@ -3010,8 +3025,8 @@ yyparse () ;} break; - case 140: -#line 1024 "test_spec_parse.y" + case 141: +#line 1039 "test_spec_parse.y" { if (current_wait_cmd->waitStateCount < PGAF_MAX_WAIT_STATES) strlcpy(current_wait_cmd->waitStates[current_wait_cmd->waitStateCount++], @@ -3019,8 +3034,8 @@ yyparse () ;} break; - case 141: -#line 1030 "test_spec_parse.y" + case 142: +#line 1045 "test_spec_parse.y" { if (current_wait_cmd->waitStateCount < PGAF_MAX_WAIT_STATES) strlcpy(current_wait_cmd->waitStates[current_wait_cmd->waitStateCount++], @@ -3029,39 +3044,39 @@ yyparse () ;} break; - case 144: -#line 1049 "test_spec_parse.y" + case 145: +#line 1064 "test_spec_parse.y" { if (current_wait_cmd->waitGroupCount < PGAF_MAX_WAIT_GROUPS) current_wait_cmd->waitGroups[current_wait_cmd->waitGroupCount++] = (yyvsp[(2) - (2)].ival); ;} break; - case 145: -#line 1054 "test_spec_parse.y" + case 146: +#line 1069 "test_spec_parse.y" { if (current_wait_cmd->waitGroupCount < PGAF_MAX_WAIT_GROUPS) current_wait_cmd->waitGroups[current_wait_cmd->waitGroupCount++] = (yyvsp[(4) - (4)].ival); ;} break; - case 146: -#line 1061 "test_spec_parse.y" + case 147: +#line 1076 "test_spec_parse.y" { (yyval.ival) = PGAF_TIMEOUT_DEFAULT; ;} break; - case 147: -#line 1062 "test_spec_parse.y" + case 148: +#line 1077 "test_spec_parse.y" { (yyval.ival) = (yyvsp[(2) - (2)].ival); ;} break; - case 148: -#line 1063 "test_spec_parse.y" + case 149: +#line 1078 "test_spec_parse.y" { (yyval.ival) = (yyvsp[(3) - (3)].ival); ;} break; - case 149: -#line 1075 "test_spec_parse.y" + case 150: +#line 1090 "test_spec_parse.y" { (yyval.cmd) = make_cmd((yyvsp[(6) - (6)].ival) > 0 ? CMD_WAIT_STATE : CMD_ASSERT_STATE); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (6)].str), sizeof((yyval.cmd)->service)); @@ -3071,8 +3086,8 @@ yyparse () ;} break; - case 150: -#line 1083 "test_spec_parse.y" + case 151: +#line 1098 "test_spec_parse.y" { (yyval.cmd) = make_cmd((yyvsp[(6) - (6)].ival) > 0 ? CMD_WAIT_STATE : CMD_ASSERT_STATE); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (6)].str), sizeof((yyval.cmd)->service)); @@ -3082,8 +3097,8 @@ yyparse () ;} break; - case 151: -#line 1091 "test_spec_parse.y" + case 152: +#line 1106 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_ASSERT_ASSIGNED); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (6)].str), sizeof((yyval.cmd)->service)); @@ -3093,8 +3108,8 @@ yyparse () ;} break; - case 152: -#line 1099 "test_spec_parse.y" + case 153: +#line 1114 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_ASSERT_ASSIGNED); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (6)].str), sizeof((yyval.cmd)->service)); @@ -3104,8 +3119,8 @@ yyparse () ;} break; - case 153: -#line 1117 "test_spec_parse.y" + case 154: +#line 1132 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_SQL); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (3)].str), sizeof((yyval.cmd)->service)); @@ -3114,8 +3129,8 @@ yyparse () ;} break; - case 154: -#line 1132 "test_spec_parse.y" + case 155: +#line 1147 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_EXPECT); strlcpy((yyval.cmd)->expected, (yyvsp[(2) - (2)].str), sizeof((yyval.cmd)->expected)); @@ -3124,15 +3139,15 @@ yyparse () ;} break; - case 155: -#line 1139 "test_spec_parse.y" + case 156: +#line 1154 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_EXPECT_ERROR); ;} break; - case 156: -#line 1143 "test_spec_parse.y" + case 157: +#line 1158 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_EXPECT_ERROR); strlcpy((yyval.cmd)->state, (yyvsp[(3) - (3)].str), sizeof((yyval.cmd)->state)); @@ -3140,8 +3155,8 @@ yyparse () ;} break; - case 157: -#line 1149 "test_spec_parse.y" + case 158: +#line 1164 "test_spec_parse.y" { /* SQLSTATE codes like 25006 are all digits, lexed as T_INTEGER */ (yyval.cmd) = make_cmd(CMD_EXPECT_ERROR); @@ -3149,16 +3164,16 @@ yyparse () ;} break; - case 158: -#line 1162 "test_spec_parse.y" + case 159: +#line 1177 "test_spec_parse.y" { (yyval.cmd) = current_promote_cmd; current_promote_cmd = NULL; ;} break; - case 159: -#line 1170 "test_spec_parse.y" + case 160: +#line 1185 "test_spec_parse.y" { current_promote_cmd = make_cmd(CMD_PROMOTE); current_promote_cmd->timeoutSeconds = PGAF_TIMEOUT_DEFAULT; @@ -3168,8 +3183,8 @@ yyparse () ;} break; - case 160: -#line 1178 "test_spec_parse.y" + case 161: +#line 1193 "test_spec_parse.y" { if (current_promote_cmd->promoteCount < PGAF_MAX_PROMOTE_NODES) strlcpy(current_promote_cmd->promoteNodes[current_promote_cmd->promoteCount++], @@ -3178,8 +3193,8 @@ yyparse () ;} break; - case 161: -#line 1199 "test_spec_parse.y" + case 162: +#line 1214 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_FAILOVER); strlcpy((yyval.cmd)->service, "default", sizeof((yyval.cmd)->service)); @@ -3188,8 +3203,8 @@ yyparse () ;} break; - case 162: -#line 1206 "test_spec_parse.y" + case 163: +#line 1221 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_FAILOVER); strlcpy((yyval.cmd)->service, "default", sizeof((yyval.cmd)->service)); @@ -3198,8 +3213,8 @@ yyparse () ;} break; - case 163: -#line 1213 "test_spec_parse.y" + case 164: +#line 1228 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_FAILOVER); strlcpy((yyval.cmd)->service, (yyvsp[(5) - (5)].str), sizeof((yyval.cmd)->service)); @@ -3209,8 +3224,8 @@ yyparse () ;} break; - case 164: -#line 1221 "test_spec_parse.y" + case 165: +#line 1236 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_FAILOVER); strlcpy((yyval.cmd)->service, (yyvsp[(5) - (7)].str), sizeof((yyval.cmd)->service)); @@ -3220,8 +3235,8 @@ yyparse () ;} break; - case 165: -#line 1237 "test_spec_parse.y" + case 166: +#line 1252 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_NETWORK_OFF); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (3)].str), sizeof((yyval.cmd)->service)); @@ -3229,8 +3244,8 @@ yyparse () ;} break; - case 166: -#line 1243 "test_spec_parse.y" + case 167: +#line 1258 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_NETWORK_ON); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (3)].str), sizeof((yyval.cmd)->service)); @@ -3238,8 +3253,8 @@ yyparse () ;} break; - case 167: -#line 1264 "test_spec_parse.y" + case 168: +#line 1279 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_NODEINI_SET); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (5)].str), sizeof((yyval.cmd)->service)); @@ -3249,8 +3264,8 @@ yyparse () ;} break; - case 168: -#line 1272 "test_spec_parse.y" + case 169: +#line 1287 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_NODEINI_GET); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (5)].str), sizeof((yyval.cmd)->service)); @@ -3260,23 +3275,23 @@ yyparse () ;} break; - case 169: -#line 1287 "test_spec_parse.y" + case 170: +#line 1302 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_SLEEP); (yyval.cmd)->timeoutSeconds = (yyvsp[(2) - (2)].ival); ;} break; - case 170: -#line 1301 "test_spec_parse.y" + case 171: +#line 1316 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_COMPOSE_DOWN); ;} break; - case 171: -#line 1305 "test_spec_parse.y" + case 172: +#line 1320 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_COMPOSE_START); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (3)].str), sizeof((yyval.cmd)->service)); @@ -3284,8 +3299,8 @@ yyparse () ;} break; - case 172: -#line 1311 "test_spec_parse.y" + case 173: +#line 1326 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_COMPOSE_STOP); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (3)].str), sizeof((yyval.cmd)->service)); @@ -3293,8 +3308,8 @@ yyparse () ;} break; - case 173: -#line 1317 "test_spec_parse.y" + case 174: +#line 1332 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_COMPOSE_KILL); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (3)].str), sizeof((yyval.cmd)->service)); @@ -3302,8 +3317,8 @@ yyparse () ;} break; - case 174: -#line 1343 "test_spec_parse.y" + case 175: +#line 1358 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_COMPOSE_INJECT); strlcpy((yyval.cmd)->expected, (yyvsp[(3) - (4)].str), sizeof((yyval.cmd)->expected)); /* image */ @@ -3328,8 +3343,8 @@ yyparse () ;} break; - case 175: -#line 1377 "test_spec_parse.y" + case 176: +#line 1392 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_STOP_POSTGRES); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (3)].str), sizeof((yyval.cmd)->service)); @@ -3337,8 +3352,8 @@ yyparse () ;} break; - case 176: -#line 1383 "test_spec_parse.y" + case 177: +#line 1398 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_START_POSTGRES); strlcpy((yyval.cmd)->service, (yyvsp[(3) - (3)].str), sizeof((yyval.cmd)->service)); @@ -3346,18 +3361,18 @@ yyparse () ;} break; - case 177: -#line 1399 "test_spec_parse.y" + case 178: +#line 1414 "test_spec_parse.y" { pgaf_next_brace_is_while = 1; ;} break; - case 178: -#line 1400 "test_spec_parse.y" + case 179: +#line 1415 "test_spec_parse.y" { (yyval.step) = (yyvsp[(4) - (5)].step); ;} break; - case 179: -#line 1405 "test_spec_parse.y" + case 180: +#line 1420 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_STAYS_WHILE); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (5)].str), sizeof((yyval.cmd)->service)); @@ -3367,8 +3382,8 @@ yyparse () ;} break; - case 180: -#line 1424 "test_spec_parse.y" + case 181: +#line 1439 "test_spec_parse.y" { /* only "set monitor " is supported; $2 must be "monitor" */ if (strcmp((yyvsp[(2) - (3)].str), "monitor") != 0) @@ -3383,8 +3398,8 @@ yyparse () ;} break; - case 181: -#line 1449 "test_spec_parse.y" + case 182: +#line 1464 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_LOGS_CHECK); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (4)].str), sizeof((yyval.cmd)->service)); @@ -3395,8 +3410,8 @@ yyparse () ;} break; - case 182: -#line 1458 "test_spec_parse.y" + case 183: +#line 1473 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_LOGS_CHECK); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (5)].str), sizeof((yyval.cmd)->service)); @@ -3407,8 +3422,8 @@ yyparse () ;} break; - case 183: -#line 1467 "test_spec_parse.y" + case 184: +#line 1482 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_LOGS_CHECK); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (4)].str), sizeof((yyval.cmd)->service)); @@ -3419,8 +3434,8 @@ yyparse () ;} break; - case 184: -#line 1476 "test_spec_parse.y" + case 185: +#line 1491 "test_spec_parse.y" { (yyval.cmd) = make_cmd(CMD_LOGS_CHECK); strlcpy((yyval.cmd)->service, (yyvsp[(2) - (5)].str), sizeof((yyval.cmd)->service)); @@ -3431,8 +3446,8 @@ yyparse () ;} break; - case 187: -#line 1497 "test_spec_parse.y" + case 188: +#line 1512 "test_spec_parse.y" { int i = current_spec->sequenceLength; if (i < PGAF_MAX_SEQ) @@ -3446,124 +3461,124 @@ yyparse () ;} break; - case 188: -#line 1518 "test_spec_parse.y" + case 189: +#line 1533 "test_spec_parse.y" { (yyval.str) = "init"; ;} break; - case 189: -#line 1519 "test_spec_parse.y" + case 190: +#line 1534 "test_spec_parse.y" { (yyval.str) = "single"; ;} break; - case 190: -#line 1520 "test_spec_parse.y" + case 191: +#line 1535 "test_spec_parse.y" { (yyval.str) = "primary"; ;} break; - case 191: -#line 1521 "test_spec_parse.y" + case 192: +#line 1536 "test_spec_parse.y" { (yyval.str) = "wait_primary"; ;} break; - case 192: -#line 1522 "test_spec_parse.y" + case 193: +#line 1537 "test_spec_parse.y" { (yyval.str) = "wait_standby"; ;} break; - case 193: -#line 1523 "test_spec_parse.y" + case 194: +#line 1538 "test_spec_parse.y" { (yyval.str) = "demoted"; ;} break; - case 194: -#line 1524 "test_spec_parse.y" + case 195: +#line 1539 "test_spec_parse.y" { (yyval.str) = "demote_timeout"; ;} break; - case 195: -#line 1525 "test_spec_parse.y" + case 196: +#line 1540 "test_spec_parse.y" { (yyval.str) = "draining"; ;} break; - case 196: -#line 1526 "test_spec_parse.y" + case 197: +#line 1541 "test_spec_parse.y" { (yyval.str) = "secondary"; ;} break; - case 197: -#line 1527 "test_spec_parse.y" + case 198: +#line 1542 "test_spec_parse.y" { (yyval.str) = "catchingup"; ;} break; - case 198: -#line 1528 "test_spec_parse.y" + case 199: +#line 1543 "test_spec_parse.y" { (yyval.str) = "prepare_promotion"; ;} break; - case 199: -#line 1529 "test_spec_parse.y" + case 200: +#line 1544 "test_spec_parse.y" { (yyval.str) = "stop_replication"; ;} break; - case 200: -#line 1530 "test_spec_parse.y" + case 201: +#line 1545 "test_spec_parse.y" { (yyval.str) = "maintenance"; ;} break; - case 201: -#line 1531 "test_spec_parse.y" + case 202: +#line 1546 "test_spec_parse.y" { (yyval.str) = "join_primary"; ;} break; - case 202: -#line 1532 "test_spec_parse.y" + case 203: +#line 1547 "test_spec_parse.y" { (yyval.str) = "apply_settings"; ;} break; - case 203: -#line 1533 "test_spec_parse.y" + case 204: +#line 1548 "test_spec_parse.y" { (yyval.str) = "prepare_maintenance"; ;} break; - case 204: -#line 1534 "test_spec_parse.y" + case 205: +#line 1549 "test_spec_parse.y" { (yyval.str) = "wait_maintenance"; ;} break; - case 205: -#line 1535 "test_spec_parse.y" + case 206: +#line 1550 "test_spec_parse.y" { (yyval.str) = "report_lsn"; ;} break; - case 206: -#line 1536 "test_spec_parse.y" + case 207: +#line 1551 "test_spec_parse.y" { (yyval.str) = "fast_forward"; ;} break; - case 207: -#line 1537 "test_spec_parse.y" + case 208: +#line 1552 "test_spec_parse.y" { (yyval.str) = "join_secondary"; ;} break; - case 208: -#line 1538 "test_spec_parse.y" + case 209: +#line 1553 "test_spec_parse.y" { (yyval.str) = "dropped"; ;} break; - case 209: -#line 1546 "test_spec_parse.y" + case 210: +#line 1561 "test_spec_parse.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 210: -#line 1547 "test_spec_parse.y" + case 211: +#line 1562 "test_spec_parse.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; /* Line 1267 of yacc.c. */ -#line 3567 "test_spec_parse.c" +#line 3582 "test_spec_parse.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -3777,7 +3792,7 @@ yyparse () } -#line 1550 "test_spec_parse.y" +#line 1565 "test_spec_parse.y" /* ----------------------------------------------------------------------- diff --git a/src/bin/pgaftest/test_spec_parse.h b/src/bin/pgaftest/test_spec_parse.h index 9a5acacc7..85c01a17b 100644 --- a/src/bin/pgaftest/test_spec_parse.h +++ b/src/bin/pgaftest/test_spec_parse.h @@ -114,46 +114,47 @@ T_AND = 330, T_IS = 331, T_WITH = 332, - T_ASSERT = 333, - T_SQL = 334, - T_EXPECT = 335, - T_ERROR = 336, - T_PROMOTE = 337, - T_PERFORM = 338, - T_FAILOVER = 339, - T_NETWORK = 340, - T_DISCONNECT = 341, - T_CONNECT = 342, - T_SLEEP = 343, - T_COMPOSE = 344, - T_DOWN = 345, - T_START = 346, - T_STOP = 347, - T_STOPPED = 348, - T_KILL = 349, - T_INJECT = 350, - T_STATE = 351, - T_ASSIGNED_STATE = 352, - T_IN = 353, - T_GROUP = 354, - T_LBRACE = 355, - T_RBRACE = 356, - T_COMMA = 357, - T_POSTGRES = 358, - T_STAYS = 359, - T_WHILE = 360, - T_THROUGH = 361, - T_SET = 362, - T_GET = 363, - T_LOGS = 364, - T_NOT = 365, - T_CONTAINS = 366, - T_MATCHES = 367, - T_INTEGER = 368, - T_IDENT = 369, - T_STRING = 370, - T_BLOCK = 371, - T_SHELL_ARGS = 372 + T_REPLAYS = 333, + T_ASSERT = 334, + T_SQL = 335, + T_EXPECT = 336, + T_ERROR = 337, + T_PROMOTE = 338, + T_PERFORM = 339, + T_FAILOVER = 340, + T_NETWORK = 341, + T_DISCONNECT = 342, + T_CONNECT = 343, + T_SLEEP = 344, + T_COMPOSE = 345, + T_DOWN = 346, + T_START = 347, + T_STOP = 348, + T_STOPPED = 349, + T_KILL = 350, + T_INJECT = 351, + T_STATE = 352, + T_ASSIGNED_STATE = 353, + T_IN = 354, + T_GROUP = 355, + T_LBRACE = 356, + T_RBRACE = 357, + T_COMMA = 358, + T_POSTGRES = 359, + T_STAYS = 360, + T_WHILE = 361, + T_THROUGH = 362, + T_SET = 363, + T_GET = 364, + T_LOGS = 365, + T_NOT = 366, + T_CONTAINS = 367, + T_MATCHES = 368, + T_INTEGER = 369, + T_IDENT = 370, + T_STRING = 371, + T_BLOCK = 372, + T_SHELL_ARGS = 373 }; #endif /* Tokens. */ @@ -232,46 +233,47 @@ #define T_AND 330 #define T_IS 331 #define T_WITH 332 -#define T_ASSERT 333 -#define T_SQL 334 -#define T_EXPECT 335 -#define T_ERROR 336 -#define T_PROMOTE 337 -#define T_PERFORM 338 -#define T_FAILOVER 339 -#define T_NETWORK 340 -#define T_DISCONNECT 341 -#define T_CONNECT 342 -#define T_SLEEP 343 -#define T_COMPOSE 344 -#define T_DOWN 345 -#define T_START 346 -#define T_STOP 347 -#define T_STOPPED 348 -#define T_KILL 349 -#define T_INJECT 350 -#define T_STATE 351 -#define T_ASSIGNED_STATE 352 -#define T_IN 353 -#define T_GROUP 354 -#define T_LBRACE 355 -#define T_RBRACE 356 -#define T_COMMA 357 -#define T_POSTGRES 358 -#define T_STAYS 359 -#define T_WHILE 360 -#define T_THROUGH 361 -#define T_SET 362 -#define T_GET 363 -#define T_LOGS 364 -#define T_NOT 365 -#define T_CONTAINS 366 -#define T_MATCHES 367 -#define T_INTEGER 368 -#define T_IDENT 369 -#define T_STRING 370 -#define T_BLOCK 371 -#define T_SHELL_ARGS 372 +#define T_REPLAYS 333 +#define T_ASSERT 334 +#define T_SQL 335 +#define T_EXPECT 336 +#define T_ERROR 337 +#define T_PROMOTE 338 +#define T_PERFORM 339 +#define T_FAILOVER 340 +#define T_NETWORK 341 +#define T_DISCONNECT 342 +#define T_CONNECT 343 +#define T_SLEEP 344 +#define T_COMPOSE 345 +#define T_DOWN 346 +#define T_START 347 +#define T_STOP 348 +#define T_STOPPED 349 +#define T_KILL 350 +#define T_INJECT 351 +#define T_STATE 352 +#define T_ASSIGNED_STATE 353 +#define T_IN 354 +#define T_GROUP 355 +#define T_LBRACE 356 +#define T_RBRACE 357 +#define T_COMMA 358 +#define T_POSTGRES 359 +#define T_STAYS 360 +#define T_WHILE 361 +#define T_THROUGH 362 +#define T_SET 363 +#define T_GET 364 +#define T_LOGS 365 +#define T_NOT 366 +#define T_CONTAINS 367 +#define T_MATCHES 368 +#define T_INTEGER 369 +#define T_IDENT 370 +#define T_STRING 371 +#define T_BLOCK 372 +#define T_SHELL_ARGS 373 @@ -286,7 +288,7 @@ typedef union YYSTYPE TestCmd *cmd; } /* Line 1529 of yacc.c. */ -#line 290 "test_spec_parse.h" +#line 292 "test_spec_parse.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 diff --git a/src/bin/pgaftest/test_spec_parse.y b/src/bin/pgaftest/test_spec_parse.y index 5956f4813..4479a2310 100644 --- a/src/bin/pgaftest/test_spec_parse.y +++ b/src/bin/pgaftest/test_spec_parse.y @@ -176,7 +176,7 @@ static TestNode *current_node = NULL; /* ---- Step-body tokens (used in STEP_BODY lex state) ---- */ %token T_EXEC T_EXEC_FAILS T_RUN T_PG_AUTOCTL -%token T_WAIT T_UNTIL T_TIMEOUT T_AND T_IS T_WITH +%token T_WAIT T_UNTIL T_TIMEOUT T_AND T_IS T_WITH T_REPLAYS %token T_ASSERT %token T_SQL T_EXPECT T_ERROR %token T_PROMOTE @@ -978,6 +978,21 @@ wait_cmd: $$->timeoutSeconds = $5; free($3); } + /* + * wait until node1 replays node2 timeout 90s + * + * Captures node2's current WAL LSN at the moment this command runs, then + * polls node1 until it has replayed at least that far -- avoids racing a + * write against replication catch-up right after a promotion/failover. + */ + | T_WAIT T_UNTIL T_IDENT T_REPLAYS T_IDENT opt_timeout + { + $$ = make_cmd(CMD_WAIT_LSN); + strlcpy($$->service, $3, sizeof($$->service)); + strlcpy($$->state, $5, sizeof($$->state)); + $$->timeoutSeconds = $6; + free($3); free($5); + } | T_WAIT T_UNTIL state_name_list opt_in_group opt_timeout { $$ = current_wait_cmd; diff --git a/src/bin/pgaftest/test_spec_scan.c b/src/bin/pgaftest/test_spec_scan.c index ab48f71a2..1332387f2 100644 --- a/src/bin/pgaftest/test_spec_scan.c +++ b/src/bin/pgaftest/test_spec_scan.c @@ -356,8 +356,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 159 -#define YY_END_OF_BUFFER 160 +#define YY_NUM_RULES 160 +#define YY_END_OF_BUFFER 161 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -365,144 +365,144 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1236] = +static const flex_int16_t yy_accept[1240] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 160, 18, 17, 16, 18, 1, 12, 11, 13, 13, - 13, 13, 13, 13, 15, 159, 21, 20, 159, 19, + 161, 18, 17, 16, 18, 1, 12, 11, 13, 13, + 13, 13, 13, 13, 15, 160, 21, 20, 160, 19, 61, 60, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 63, 64, 101, 100, 159, 99, 136, 149, 135, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 151, - 152, 155, 154, 156, 157, 158, 17, 0, 14, 1, + 98, 63, 64, 101, 100, 160, 99, 137, 150, 136, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 152, + 153, 156, 155, 157, 158, 159, 17, 0, 14, 1, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 21, 0, 62, 19, 61, 61, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 101, 0, 150, 99, 149, 149, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 127, 133, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 155, 154, 157, 13, 13, 13, 13, 13, + 98, 98, 98, 98, 101, 0, 151, 99, 150, 150, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 128, 134, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 156, 155, 158, 13, 13, 13, 13, 13, 13, 13, 13, 43, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 25, 98, 98, 98, 98, 98, 132, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 143, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 146, 153, - 153, 153, 153, 153, 153, 153, 153, 104, 153, 142, - 153, 153, 110, 153, 153, 153, 153, 153, 153, 153, - - 153, 13, 13, 13, 4, 13, 13, 9, 13, 98, + 98, 98, 98, 25, 98, 98, 98, 98, 98, 133, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 144, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 147, 154, + 154, 154, 154, 154, 154, 154, 154, 104, 154, 143, + 154, 154, 111, 154, 154, 154, 154, 154, 154, 154, + + 154, 13, 13, 13, 4, 13, 13, 9, 13, 98, 98, 27, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 65, 98, 98, 98, 98, 98, 98, 98, 30, 98, 98, 52, 98, 98, 98, 98, 98, 98, 98, 98, - 42, 98, 98, 98, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 122, 153, 153, 153, 103, 153, - 153, 153, 153, 153, 65, 153, 153, 126, 145, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 124, 153, 153, - - 153, 106, 153, 134, 13, 13, 13, 13, 7, 13, - 98, 33, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 41, 98, 98, 98, 51, - 24, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 42, 98, 98, 98, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 123, 154, 154, 154, 103, 154, + 154, 154, 154, 154, 65, 154, 154, 127, 146, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 125, 154, + + 154, 154, 106, 154, 135, 13, 13, 13, 13, 7, + 13, 98, 33, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 41, 98, 98, 98, + 51, 24, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 112, - 153, 153, 153, 153, 153, 153, 131, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 119, 123, 128, 138, 153, 153, - - 153, 153, 153, 107, 153, 153, 139, 13, 13, 13, - 13, 13, 98, 98, 98, 98, 98, 98, 98, 98, - 38, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 37, 98, 47, - 98, 98, 98, 98, 98, 98, 98, 50, 98, 98, - 98, 66, 98, 98, 98, 46, 98, 98, 98, 98, - 98, 98, 32, 153, 153, 109, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 111, 153, 153, - 153, 153, 144, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - - 66, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 13, 13, 2, 3, 13, 13, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 113, 154, 154, 154, 154, 154, 154, 132, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 120, 124, 129, 139, + + 154, 154, 154, 154, 154, 107, 154, 154, 140, 13, + 13, 13, 13, 13, 98, 98, 98, 98, 98, 98, + 98, 98, 38, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 37, + 98, 47, 98, 98, 98, 98, 98, 98, 98, 50, + 98, 98, 98, 66, 98, 98, 98, 46, 98, 98, + 98, 98, 98, 98, 32, 154, 154, 110, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 112, + 154, 154, 154, 154, 145, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + + 154, 154, 154, 66, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 13, 13, 2, 3, 13, + 13, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 72, 98, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 72, 98, 97, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 22, 98, 98, - 98, 98, 67, 98, 98, 98, 98, 98, 98, 45, - 98, 98, 98, 98, 98, 98, 153, 153, 153, 153, - 153, 120, 118, 153, 153, 153, 72, 153, 153, 97, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 148, 116, 121, 153, 114, 153, 153, 153, 67, 113, - - 153, 153, 153, 153, 153, 125, 141, 108, 153, 153, - 153, 153, 153, 153, 13, 13, 10, 8, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 39, 98, - 98, 75, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 29, 35, 98, + 22, 98, 98, 98, 98, 67, 98, 98, 98, 98, + 98, 98, 45, 98, 98, 98, 98, 98, 98, 154, + 154, 154, 154, 154, 121, 119, 154, 154, 154, 72, + 154, 154, 97, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 149, 117, 122, 154, 115, 154, 154, + + 154, 67, 114, 108, 154, 154, 154, 154, 154, 126, + 142, 109, 154, 154, 154, 154, 154, 154, 13, 13, + 10, 8, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 39, 98, 98, 75, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 153, 153, 153, 153, 153, 147, 153, - 153, 153, 75, 153, 115, 153, 153, 153, 153, 153, - 153, 153, 153, 0, 153, 137, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 13, + 98, 29, 35, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 154, 154, 154, + 154, 154, 148, 154, 154, 154, 75, 154, 116, 154, + 154, 154, 154, 154, 154, 154, 154, 0, 154, 138, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 13, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 28, 98, 40, 44, + 154, 154, 154, 13, 13, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 76, 98, 98, 98, 98, - 98, 98, 98, 98, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 28, 153, 153, 153, 153, - 153, 0, 153, 153, 153, 153, 153, 153, 153, 76, - 153, 153, 153, 153, 153, 153, 153, 153, 13, 13, - 98, 98, 98, 98, 98, 77, 98, 98, 98, 98, + 28, 98, 40, 44, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 76, + 98, 98, 98, 98, 98, 98, 98, 98, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 28, + 154, 154, 154, 154, 154, 0, 154, 154, 154, 154, + 154, 154, 154, 76, 154, 154, 154, 154, 154, 154, + 154, 154, 13, 13, 98, 98, 98, 98, 98, 77, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 34, 98, 98, 98, 98, 98, 92, - 91, 98, 98, 98, 98, 98, 98, 98, 98, 153, - 153, 153, 153, 77, 153, 153, 117, 102, 153, 153, - 153, 153, 153, 153, 153, 0, 105, 153, 153, 153, - 153, 92, 91, 153, 153, 153, 153, 153, 153, 153, - 153, 13, 13, 98, 98, 26, 58, 98, 98, 98, - 31, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 82, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - - 82, 0, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 13, 6, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 94, 93, 23, 84, 98, - 83, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 69, 71, 98, 68, 70, 153, 153, 153, - 153, 153, 153, 94, 93, 84, 153, 83, 153, 0, - 153, 153, 153, 153, 153, 153, 153, 69, 71, 153, - 68, 70, 13, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 34, 98, 98, + 98, 98, 98, 92, 91, 98, 98, 98, 98, 98, + 98, 98, 98, 154, 154, 154, 154, 77, 154, 154, + 118, 102, 154, 154, 154, 154, 154, 154, 154, 0, + 105, 154, 154, 154, 154, 92, 91, 154, 154, 154, + 154, 154, 154, 154, 154, 13, 13, 98, 98, 26, + 58, 98, 98, 98, 31, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 82, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 153, 153, 153, 153, - - 153, 153, 153, 153, 0, 153, 153, 153, 153, 153, - 153, 153, 153, 13, 86, 85, 98, 98, 98, 54, - 74, 73, 98, 96, 95, 59, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 86, 85, 129, - 153, 74, 73, 96, 95, 0, 153, 153, 153, 153, - 153, 153, 153, 153, 13, 98, 98, 48, 98, 98, + 98, 98, 154, 154, 154, 154, 154, 154, 154, 154, + + 154, 154, 154, 154, 82, 0, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 13, 6, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 94, + 93, 23, 84, 98, 83, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 69, 71, 98, 68, + 70, 154, 154, 154, 154, 154, 154, 94, 93, 84, + 154, 83, 154, 0, 154, 154, 154, 154, 154, 154, + 154, 69, 71, 154, 68, 70, 13, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 153, 140, 153, 153, 153, 153, 153, 153, 153, 153, - 13, 98, 98, 98, 36, 98, 98, 98, 98, 98, - 98, 81, 80, 90, 89, 153, 153, 153, 153, 153, - - 81, 80, 90, 89, 5, 98, 98, 57, 98, 79, - 98, 78, 98, 98, 153, 153, 79, 153, 78, 49, - 53, 98, 98, 98, 55, 130, 153, 153, 88, 87, - 98, 88, 87, 56, 0 + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + + 154, 154, 154, 154, 154, 154, 154, 154, 0, 154, + 154, 154, 154, 154, 154, 154, 154, 13, 86, 85, + 98, 98, 98, 54, 74, 73, 98, 96, 95, 59, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 86, 85, 130, 154, 74, 73, 96, 95, 0, + 154, 154, 154, 154, 154, 154, 154, 154, 13, 98, + 98, 48, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 154, 141, 154, 154, 154, 154, + 154, 154, 154, 154, 13, 98, 98, 98, 36, 98, + 98, 98, 98, 98, 98, 81, 80, 90, 89, 154, + + 154, 154, 154, 154, 81, 80, 90, 89, 5, 98, + 98, 57, 98, 79, 98, 78, 98, 98, 154, 154, + 79, 154, 78, 49, 53, 98, 98, 98, 55, 131, + 154, 154, 88, 87, 98, 88, 87, 56, 0 } ; static const YY_CHAR yy_ec[256] = @@ -545,289 +545,291 @@ static const YY_CHAR yy_meta[41] = 4, 4, 4, 4, 4, 4, 4, 4, 1, 1 } ; -static const flex_int16_t yy_base[1249] = +static const flex_int16_t yy_base[1253] = { 0, - 0, 0, 40, 0, 80, 0, 119, 121, 1328, 1327, - 1329, 1332, 123, 1332, 1323, 0, 117, 1332, 0, 106, - 1299, 1298, 112, 1307, 1332, 1332, 130, 1332, 1319, 0, - 124, 1332, 0, 108, 1301, 124, 123, 1285, 125, 1290, - 117, 1292, 143, 134, 130, 145, 1301, 145, 1287, 1289, - 146, 1332, 1332, 164, 1332, 1311, 0, 1332, 138, 1332, - 0, 152, 155, 164, 154, 161, 162, 167, 1287, 1292, - 1285, 1298, 169, 182, 154, 186, 184, 1284, 193, 1332, - 1332, 0, 1308, 1332, 0, 1332, 199, 1304, 1332, 0, - 200, 1332, 0, 1275, 1273, 1279, 1288, 187, 1286, 1289, - - 219, 1297, 1332, 0, 213, 1332, 0, 1284, 1271, 1261, - 1265, 1270, 191, 1263, 1267, 1276, 211, 213, 1260, 203, - 1261, 1263, 217, 1268, 1267, 1254, 1267, 1254, 1263, 1257, - 221, 1257, 1250, 1250, 218, 213, 1264, 1252, 1253, 1249, - 1242, 1250, 1252, 1242, 242, 1267, 1332, 0, 238, 1332, - 0, 1254, 1241, 1237, 221, 225, 1242, 1235, 1230, 225, - 1234, 231, 233, 1233, 1230, 1234, 234, 0, 1239, 1235, - 1239, 236, 1225, 242, 1225, 1225, 1242, 1222, 244, 1224, - 1225, 245, 1224, 1232, 1224, 249, 1217, 1221, 1213, 1223, - 1222, 1210, 0, 1240, 0, 1207, 1208, 1217, 1220, 1203, - - 1202, 1206, 1203, 0, 1208, 1205, 1210, 1213, 1212, 1212, - 1193, 1195, 1211, 1202, 1205, 1194, 1199, 1191, 1201, 1186, - 1184, 1190, 1181, 1194, 1195, 1179, 1184, 1183, 1195, 1175, - 1180, 1184, 1179, 1186, 1195, 1170, 1168, 1171, 1173, 1176, - 239, 1169, 1176, 0, 1166, 1176, 1159, 1159, 1167, 0, - 1165, 258, 1172, 1172, 1158, 241, 1158, 1169, 1157, 1161, - 1153, 1153, 1164, 1161, 1153, 1144, 1150, 0, 1141, 1141, - 1155, 1145, 1146, 1138, 1142, 1152, 1131, 1148, 0, 1133, - 1145, 1149, 1129, 1132, 1134, 1133, 1130, 0, 1129, 0, - 1136, 1137, 0, 248, 1125, 1125, 1134, 1129, 1117, 1124, - - 1127, 1115, 1113, 1112, 0, 1126, 1114, 0, 1125, 1103, - 1124, 1131, 1130, 1115, 1115, 1103, 1117, 1100, 1118, 1100, - 1097, 1102, 1099, 1100, 1108, 274, 1111, 1095, 1105, 1105, - 1099, 275, 1104, 1103, 1100, 1084, 1083, 1087, 0, 1082, - 1077, 0, 1098, 1097, 1082, 1087, 1077, 1080, 1081, 276, - 0, 1079, 277, 1086, 1065, 1071, 1081, 1078, 1078, 1070, - 1079, 1082, 1062, 1066, 0, 1066, 1063, 1060, 1082, 1073, - 1060, 283, 1073, 1057, 0, 1069, 284, 0, 0, 1051, - 1062, 1054, 1059, 1058, 1051, 1044, 1057, 1062, 1061, 1046, - 1042, 1045, 1046, 1041, 1036, 1050, 1035, 285, 1032, 1037, - - 1039, 286, 1045, 0, 1054, 1043, 1032, 1032, 0, 1030, - 287, 0, 1031, 1024, 1038, 1032, 1045, 1030, 1033, 1023, - 1018, 1030, 1025, 1028, 1013, 0, 1025, 1024, 1009, 0, - 1033, 1018, 1025, 272, 274, 1017, 999, 1009, 1017, 1006, - 1006, 994, 1003, 999, 998, 1001, 1011, 993, 1008, 1006, - 992, 991, 1003, 1002, 281, 283, 988, 303, 985, 990, - 999, 993, 982, 997, 990, 993, 983, 987, 990, 0, - 988, 973, 970, 985, 984, 969, 0, 968, 288, 289, - 982, 981, 967, 970, 969, 964, 961, 962, 961, 960, - 957, 956, 971, 969, 0, 0, 0, 0, 955, 954, - - 966, 963, 948, 0, 293, 297, 0, 135, 950, 949, - 963, 942, 945, 944, 957, 946, 959, 945, 292, 944, - 0, 962, 951, 319, 941, 950, 944, 937, 936, 941, - 929, 947, 935, 928, 940, 926, 938, 0, 947, 0, - 927, 922, 930, 924, 919, 931, 910, 0, 933, 320, - 932, 0, 927, 926, 926, 0, 928, 910, 907, 925, - 907, 904, 0, 904, 903, 0, 916, 919, 905, 913, - 897, 902, 322, 901, 900, 909, 911, 0, 906, 895, - 894, 899, 0, 889, 901, 887, 899, 889, 883, 890, - 891, 892, 885, 882, 891, 890, 869, 888, 329, 891, - - 0, 886, 885, 885, 880, 867, 885, 867, 864, 882, - 864, 861, 865, 864, 0, 0, 873, 863, 871, 870, - 854, 852, 852, 864, 858, 864, 867, 864, 862, 845, - 844, 0, 856, 0, 847, 843, 842, 844, 857, 837, - 844, 846, 851, 844, 849, 832, 849, 854, 828, 844, - 842, 330, 0, 825, 832, 831, 824, 825, 824, 0, - 830, 829, 836, 827, 826, 833, 828, 827, 827, 810, - 822, 0, 0, 809, 807, 806, 0, 820, 817, 0, - 814, 803, 799, 798, 162, 176, 218, 249, 257, 288, - 0, 0, 0, 342, 0, 315, 302, 339, 0, 0, - - 315, 316, 317, 320, 321, 0, 0, 0, 329, 331, - 340, 333, 334, 343, 330, 328, 0, 0, 327, 328, - 341, 332, 346, 331, 332, 351, 335, 344, 0, 348, - 349, 0, 345, 337, 338, 348, 345, 359, 340, 353, - 352, 355, 354, 350, 357, 356, 358, 0, 0, 361, - 362, 367, 360, 361, 356, 370, 371, 370, 372, 372, - 373, 375, 375, 370, 371, 397, 388, 373, 0, 386, - 387, 394, 0, 386, 0, 376, 377, 387, 389, 388, - 391, 390, 392, 418, 390, 0, 398, 399, 394, 397, - 392, 406, 407, 406, 408, 408, 409, 411, 411, 408, - - 416, 408, 409, 415, 428, 437, 417, 415, 420, 421, - 416, 426, 427, 446, 441, 442, 0, 437, 0, 0, - 444, 432, 446, 434, 448, 447, 450, 434, 452, 436, - 454, 438, 442, 444, 445, 0, 451, 452, 442, 462, - 460, 445, 465, 463, 448, 449, 451, 476, 456, 460, - 461, 455, 457, 476, 477, 0, 478, 466, 480, 468, - 480, 476, 473, 485, 469, 487, 471, 476, 477, 0, - 483, 484, 474, 494, 492, 477, 497, 495, 496, 496, - 493, 494, 500, 500, 490, 0, 487, 494, 491, 491, - 506, 507, 491, 496, 497, 511, 499, 514, 501, 516, - - 503, 517, 504, 0, 515, 510, 517, 512, 514, 0, - 0, 526, 527, 526, 514, 531, 529, 517, 534, 528, - 529, 519, 524, 0, 536, 537, 0, 0, 525, 526, - 527, 542, 529, 544, 544, 532, 0, 542, 537, 544, - 539, 0, 0, 552, 553, 552, 540, 557, 555, 543, - 560, 554, 546, 551, 552, 0, 0, 549, 563, 565, - 0, 550, 556, 557, 568, 570, 571, 556, 552, 577, - 554, 579, 561, 0, 563, 569, 571, 571, 573, 592, - 587, 588, 576, 566, 567, 579, 569, 570, 582, 583, - 597, 581, 585, 586, 598, 599, 579, 604, 581, 606, - - 0, 593, 595, 597, 597, 599, 612, 613, 601, 591, - 592, 604, 594, 595, 607, 0, 615, 616, 615, 607, - 625, 622, 607, 608, 612, 0, 0, 0, 0, 613, - 0, 614, 612, 611, 615, 621, 617, 623, 623, 621, - 622, 642, 0, 0, 643, 0, 0, 638, 639, 627, - 639, 628, 629, 0, 0, 0, 633, 0, 634, 632, - 634, 640, 636, 642, 638, 639, 659, 0, 0, 660, - 0, 0, 661, 644, 645, 650, 671, 649, 650, 649, - 650, 652, 647, 648, 658, 660, 671, 657, 673, 659, - 679, 660, 673, 674, 670, 671, 667, 668, 683, 674, - - 670, 671, 667, 668, 687, 690, 676, 692, 678, 690, - 691, 687, 688, 683, 0, 0, 686, 691, 681, 0, - 0, 0, 698, 0, 0, 0, 690, 695, 701, 697, - 703, 694, 699, 700, 701, 714, 715, 0, 0, 0, - 701, 0, 0, 0, 0, 712, 707, 713, 709, 715, - 710, 711, 724, 725, 714, 721, 730, 0, 717, 729, - 733, 720, 735, 722, 719, 721, 726, 727, 737, 738, - 735, 1332, 744, 731, 746, 733, 735, 736, 746, 747, - 735, 734, 742, 742, 0, 743, 744, 745, 746, 738, - 741, 0, 0, 0, 0, 743, 750, 751, 752, 753, - - 0, 0, 0, 0, 0, 743, 764, 0, 767, 0, - 768, 0, 757, 760, 749, 772, 0, 773, 0, 0, - 0, 772, 773, 761, 0, 0, 775, 776, 0, 0, - 778, 0, 0, 0, 1332, 795, 799, 803, 807, 806, - 811, 815, 814, 819, 823, 822, 827, 831 + 0, 0, 40, 0, 80, 0, 119, 121, 1332, 1331, + 1333, 1336, 123, 1336, 1327, 0, 117, 1336, 0, 106, + 1303, 1302, 112, 1311, 1336, 1336, 130, 1336, 1323, 0, + 124, 1336, 0, 108, 1305, 124, 123, 1289, 125, 1294, + 117, 1296, 143, 134, 130, 145, 1305, 145, 1291, 1293, + 146, 1336, 1336, 164, 1336, 1315, 0, 1336, 138, 1336, + 0, 152, 155, 164, 154, 161, 162, 167, 1291, 1296, + 1289, 1302, 169, 182, 154, 186, 184, 1288, 193, 1336, + 1336, 0, 1312, 1336, 0, 1336, 199, 1308, 1336, 0, + 200, 1336, 0, 1279, 1277, 1283, 1292, 187, 1290, 1293, + + 219, 1301, 1336, 0, 213, 1336, 0, 1288, 1275, 1265, + 1269, 1274, 191, 1267, 1271, 1280, 211, 213, 1264, 203, + 1265, 1267, 217, 1272, 1271, 1258, 1271, 1258, 1267, 1261, + 221, 1261, 1254, 1254, 218, 213, 1268, 1256, 1257, 1253, + 1246, 1254, 1256, 1246, 242, 1271, 1336, 0, 238, 1336, + 0, 1258, 1245, 1241, 221, 225, 1246, 1239, 1234, 225, + 1238, 231, 233, 1237, 1234, 1238, 234, 0, 1243, 1239, + 1243, 236, 1229, 242, 1229, 1229, 1246, 1226, 244, 1228, + 1229, 245, 1228, 1236, 1228, 249, 1221, 1225, 1217, 1227, + 1226, 1214, 0, 1244, 0, 1211, 1212, 1221, 1224, 1207, + + 1206, 1210, 1207, 0, 1212, 1209, 1214, 1217, 1216, 1216, + 1197, 1199, 1215, 1206, 1209, 1198, 1203, 1195, 1205, 1190, + 1188, 1194, 1185, 1198, 1199, 1183, 1188, 1187, 1199, 1179, + 1184, 1188, 1183, 1190, 1199, 1174, 1172, 1175, 1177, 1180, + 239, 1173, 1180, 0, 1170, 1180, 1163, 1163, 1171, 0, + 1169, 258, 1176, 1176, 1162, 241, 1162, 1173, 1161, 1165, + 1157, 1157, 1168, 1165, 1157, 1148, 1154, 0, 1145, 1145, + 1159, 1149, 1150, 1142, 1146, 1156, 1135, 1152, 0, 1137, + 1149, 1153, 1133, 1136, 1138, 1137, 254, 0, 1134, 0, + 1141, 1142, 0, 250, 1130, 1130, 1139, 1134, 1122, 1129, + + 1132, 1120, 1118, 1117, 0, 1131, 1119, 0, 1130, 1108, + 1129, 1136, 1135, 1120, 1120, 1108, 1122, 1105, 1123, 1105, + 1102, 1107, 1104, 1105, 1113, 276, 1116, 1100, 1110, 1110, + 1104, 277, 1109, 1108, 1105, 1089, 1088, 1092, 0, 1087, + 1082, 0, 1103, 1102, 1087, 1092, 1082, 1085, 1086, 278, + 0, 1084, 279, 1091, 1070, 1076, 1086, 1083, 1083, 1075, + 1084, 1087, 1067, 1071, 0, 1071, 1068, 1065, 1087, 1078, + 1065, 285, 1078, 1062, 0, 1074, 286, 0, 0, 1056, + 1067, 1059, 1064, 1063, 1056, 1049, 1062, 1067, 1066, 1051, + 1064, 1046, 1049, 1050, 1045, 1040, 1054, 1039, 287, 1036, + + 1041, 1043, 288, 1049, 0, 1058, 1047, 1036, 1036, 0, + 1034, 289, 0, 1035, 1028, 1042, 1036, 1049, 1034, 1037, + 1027, 1022, 1034, 1029, 1032, 1017, 0, 1029, 1028, 1013, + 0, 1037, 1022, 1029, 274, 276, 1021, 1003, 1013, 1021, + 1010, 1010, 998, 1007, 1003, 1002, 1005, 1015, 997, 1012, + 1010, 996, 995, 1007, 1006, 283, 285, 992, 305, 989, + 994, 1003, 997, 986, 1001, 994, 997, 987, 991, 994, + 0, 992, 977, 974, 989, 988, 973, 0, 972, 290, + 291, 986, 985, 971, 974, 973, 968, 965, 966, 965, + 964, 961, 955, 959, 974, 972, 0, 0, 0, 0, + + 958, 957, 969, 966, 951, 0, 295, 299, 0, 135, + 953, 952, 966, 945, 948, 947, 960, 949, 962, 948, + 294, 947, 0, 965, 954, 321, 944, 953, 947, 940, + 939, 944, 932, 950, 938, 931, 943, 929, 941, 0, + 950, 0, 930, 925, 933, 927, 922, 934, 913, 0, + 936, 322, 935, 0, 930, 929, 929, 0, 931, 913, + 910, 928, 910, 907, 0, 907, 906, 0, 919, 922, + 908, 916, 900, 905, 324, 904, 903, 912, 914, 0, + 909, 898, 897, 902, 0, 892, 904, 890, 902, 892, + 886, 893, 894, 895, 888, 885, 894, 893, 872, 891, + + 876, 331, 893, 0, 888, 887, 887, 882, 869, 887, + 869, 866, 884, 866, 863, 867, 866, 0, 0, 875, + 865, 873, 872, 856, 854, 854, 866, 860, 866, 869, + 866, 864, 847, 846, 0, 858, 0, 849, 845, 844, + 846, 859, 839, 846, 848, 853, 846, 851, 834, 851, + 856, 830, 846, 844, 332, 0, 827, 834, 833, 826, + 827, 826, 0, 832, 831, 838, 829, 828, 835, 830, + 829, 829, 812, 824, 0, 0, 811, 809, 808, 0, + 822, 818, 0, 812, 802, 159, 167, 206, 249, 257, + 282, 317, 322, 0, 0, 0, 344, 0, 326, 311, + + 341, 0, 0, 0, 325, 326, 321, 324, 326, 0, + 0, 0, 334, 335, 344, 337, 338, 347, 334, 332, + 0, 0, 331, 332, 345, 336, 350, 335, 336, 355, + 339, 348, 0, 352, 353, 0, 349, 341, 342, 352, + 349, 363, 344, 357, 356, 359, 358, 354, 361, 360, + 362, 0, 0, 365, 366, 371, 364, 365, 360, 374, + 375, 374, 376, 376, 377, 379, 379, 374, 375, 401, + 392, 377, 0, 390, 391, 398, 0, 390, 0, 380, + 381, 391, 393, 392, 395, 394, 396, 422, 394, 0, + 402, 403, 398, 401, 396, 410, 411, 410, 412, 412, + + 413, 415, 415, 412, 420, 412, 413, 419, 432, 441, + 421, 419, 424, 425, 420, 430, 431, 450, 445, 446, + 0, 441, 0, 0, 448, 436, 450, 438, 452, 451, + 454, 438, 456, 440, 458, 442, 446, 448, 449, 0, + 455, 456, 446, 466, 464, 449, 469, 467, 452, 453, + 455, 480, 460, 464, 465, 459, 461, 480, 481, 0, + 482, 470, 484, 472, 484, 480, 477, 489, 473, 491, + 475, 480, 481, 0, 487, 488, 478, 498, 496, 481, + 501, 499, 500, 500, 497, 498, 504, 504, 494, 0, + 491, 498, 495, 495, 510, 511, 495, 500, 501, 515, + + 503, 518, 505, 520, 507, 521, 508, 0, 519, 514, + 521, 516, 518, 0, 0, 530, 531, 530, 518, 535, + 533, 521, 538, 532, 533, 523, 528, 0, 540, 541, + 0, 0, 529, 530, 531, 546, 533, 548, 548, 536, + 0, 546, 541, 548, 543, 0, 0, 556, 557, 556, + 544, 561, 559, 547, 564, 558, 550, 555, 556, 0, + 0, 553, 567, 569, 0, 554, 560, 561, 572, 574, + 575, 560, 556, 581, 558, 583, 565, 0, 567, 573, + 575, 575, 577, 596, 591, 592, 580, 570, 571, 583, + 573, 574, 586, 587, 601, 585, 589, 590, 602, 603, + + 583, 608, 585, 610, 0, 597, 599, 601, 601, 603, + 616, 617, 605, 595, 596, 608, 598, 599, 611, 0, + 619, 620, 619, 611, 629, 626, 611, 612, 616, 0, + 0, 0, 0, 617, 0, 618, 616, 615, 619, 625, + 621, 627, 627, 625, 626, 646, 0, 0, 647, 0, + 0, 642, 643, 631, 643, 632, 633, 0, 0, 0, + 637, 0, 638, 636, 638, 644, 640, 646, 642, 643, + 663, 0, 0, 664, 0, 0, 665, 648, 649, 654, + 675, 653, 654, 653, 654, 656, 651, 652, 662, 664, + 675, 661, 677, 663, 683, 664, 677, 678, 674, 675, + + 671, 672, 687, 678, 674, 675, 671, 672, 691, 694, + 680, 696, 682, 694, 695, 691, 692, 687, 0, 0, + 690, 695, 685, 0, 0, 0, 702, 0, 0, 0, + 694, 699, 705, 701, 707, 698, 703, 704, 705, 718, + 719, 0, 0, 0, 705, 0, 0, 0, 0, 716, + 711, 717, 713, 719, 714, 715, 728, 729, 718, 725, + 734, 0, 721, 733, 737, 724, 739, 726, 723, 725, + 730, 731, 741, 742, 739, 1336, 748, 735, 750, 737, + 739, 740, 750, 751, 739, 738, 746, 746, 0, 747, + 748, 749, 750, 742, 745, 0, 0, 0, 0, 747, + + 754, 755, 756, 757, 0, 0, 0, 0, 0, 747, + 768, 0, 771, 0, 772, 0, 761, 764, 753, 776, + 0, 777, 0, 0, 0, 776, 777, 765, 0, 0, + 779, 780, 0, 0, 782, 0, 0, 0, 1336, 799, + 803, 807, 811, 810, 815, 819, 818, 823, 827, 826, + 831, 835 } ; -static const flex_int16_t yy_def[1249] = +static const flex_int16_t yy_def[1253] = { 0, - 1235, 1, 1235, 3, 1235, 5, 1236, 1236, 1237, 1237, - 1235, 1235, 1235, 1235, 1238, 1239, 1235, 1235, 1240, 1240, - 1240, 1240, 1240, 1240, 1235, 1235, 1235, 1235, 1241, 1242, - 1235, 1235, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1235, 1235, 1235, 1235, 1244, 1245, 1235, 1235, 1235, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1235, - 1235, 1247, 1235, 1235, 1248, 1235, 1235, 1238, 1235, 1239, - 1235, 1235, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - - 1235, 1241, 1235, 1242, 1235, 1235, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1235, 1244, 1235, 1245, 1235, 1235, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1247, 1235, 1248, 1240, 1240, 1240, 1240, 1240, - - 1240, 1240, 1240, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - - 1246, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - - 1246, 1246, 1246, 1246, 1240, 1240, 1240, 1240, 1240, 1240, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1240, 1240, 1240, - 1240, 1240, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1240, 1240, 1240, 1240, 1240, 1240, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1240, 1240, 1240, 1240, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1235, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1240, - - 1240, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1235, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1240, 1240, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1235, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1240, 1240, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - - 1246, 1235, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1240, 1240, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1235, - 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1240, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1246, 1246, 1246, 1246, - - 1246, 1246, 1246, 1246, 1235, 1246, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1240, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1246, 1235, 1246, 1246, 1246, 1246, - 1246, 1246, 1246, 1246, 1240, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1246, 1235, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, - 1240, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1243, 1246, 1246, 1246, 1246, 1246, - - 1246, 1246, 1246, 1246, 1240, 1243, 1243, 1243, 1243, 1243, - 1243, 1243, 1243, 1243, 1246, 1246, 1246, 1246, 1246, 1243, - 1243, 1243, 1243, 1243, 1243, 1246, 1246, 1246, 1243, 1243, - 1243, 1246, 1246, 1243, 0, 1235, 1235, 1235, 1235, 1235, - 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235 + 1239, 1, 1239, 3, 1239, 5, 1240, 1240, 1241, 1241, + 1239, 1239, 1239, 1239, 1242, 1243, 1239, 1239, 1244, 1244, + 1244, 1244, 1244, 1244, 1239, 1239, 1239, 1239, 1245, 1246, + 1239, 1239, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1239, 1239, 1239, 1239, 1248, 1249, 1239, 1239, 1239, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1239, + 1239, 1251, 1239, 1239, 1252, 1239, 1239, 1242, 1239, 1243, + 1239, 1239, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + + 1239, 1245, 1239, 1246, 1239, 1239, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1239, 1248, 1239, 1249, 1239, 1239, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1251, 1239, 1252, 1244, 1244, 1244, 1244, 1244, + + 1244, 1244, 1244, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + + 1250, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + + 1250, 1250, 1250, 1250, 1250, 1244, 1244, 1244, 1244, 1244, + 1244, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1244, + 1244, 1244, 1244, 1244, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1244, 1244, 1244, 1244, 1244, + 1244, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1244, 1244, + 1244, 1244, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1239, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + + 1250, 1250, 1250, 1244, 1244, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1239, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1244, 1244, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1239, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1244, 1244, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + + 1250, 1250, 1250, 1250, 1250, 1239, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1244, 1244, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1239, 1250, 1250, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1244, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1239, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1244, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1239, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1244, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1250, 1239, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1244, 1247, 1247, 1247, 1247, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1250, + + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1244, 1247, + 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1250, 1250, + 1250, 1250, 1250, 1247, 1247, 1247, 1247, 1247, 1247, 1250, + 1250, 1250, 1247, 1247, 1247, 1250, 1250, 1247, 0, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239 } ; -static const flex_int16_t yy_nxt[1373] = +static const flex_int16_t yy_nxt[1377] = { 0, 12, 13, 14, 13, 15, 16, 12, 12, 17, 18, 19, 19, 19, 19, 19, 20, 19, 19, 19, 19, @@ -845,40 +847,40 @@ static const flex_int16_t yy_nxt[1373] = 83, 84, 83, 84, 87, 91, 87, 94, 92, 98, 95, 101, 105, 101, 108, 106, 109, 113, 120, 110, 117, 111, 123, 124, 99, 114, 149, 129, 92, 150, - 613, 115, 121, 118, 116, 106, 126, 131, 133, 143, + 616, 115, 121, 118, 116, 106, 126, 131, 133, 143, 127, 130, 137, 132, 128, 145, 138, 145, 155, 150, - 614, 180, 134, 144, 163, 135, 139, 140, 152, 165, - 153, 157, 156, 154, 161, 158, 173, 181, 164, 778, - 162, 159, 166, 167, 160, 175, 174, 779, 168, 176, + 617, 180, 134, 144, 163, 135, 139, 140, 152, 165, + 153, 157, 156, 154, 161, 158, 173, 181, 164, 780, + 162, 159, 166, 167, 160, 175, 174, 781, 168, 176, 87, 177, 87, 182, 187, 188, 190, 183, 91, 178, 184, 92, 179, 191, 192, 185, 200, 209, 186, 201, 101, 105, 101, 210, 106, 214, 217, 220, 233, 215, - 224, 92, 240, 780, 221, 238, 216, 234, 260, 239, + 224, 92, 240, 782, 221, 238, 216, 234, 260, 239, 218, 241, 225, 145, 106, 145, 149, 253, 263, 150, 255, 256, 261, 254, 265, 270, 271, 275, 278, 264, 289, 284, 294, 346, 266, 285, 347, 361, 276, 150, - 781, 286, 782, 362, 279, 356, 295, 290, 395, 357, - 396, 427, 434, 451, 455, 397, 428, 435, 452, 456, - 474, 479, 499, 505, 513, 475, 480, 500, 506, 514, - - 534, 783, 536, 535, 453, 537, 557, 625, 560, 558, - 564, 561, 559, 501, 562, 565, 584, 586, 607, 585, - 587, 608, 610, 626, 609, 611, 630, 655, 612, 675, - 785, 631, 656, 786, 676, 632, 701, 750, 677, 789, - 790, 702, 751, 784, 784, 784, 787, 791, 792, 793, - 794, 788, 795, 796, 797, 798, 799, 800, 801, 802, + 783, 286, 784, 362, 279, 356, 295, 290, 391, 357, + 396, 392, 397, 428, 435, 452, 456, 398, 429, 436, + 453, 457, 475, 480, 501, 507, 515, 476, 481, 502, + + 508, 516, 536, 785, 538, 537, 454, 539, 559, 628, + 562, 560, 566, 563, 561, 503, 564, 567, 586, 588, + 610, 587, 589, 611, 613, 629, 612, 614, 633, 658, + 615, 678, 786, 634, 659, 787, 679, 635, 705, 754, + 680, 789, 790, 706, 755, 788, 788, 788, 791, 793, + 794, 795, 796, 792, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 831, 833, 830, - 832, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, + 833, 835, 837, 834, 836, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 861, 784, - 784, 784, 863, 864, 866, 868, 865, 867, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, + 863, 864, 865, 788, 788, 788, 867, 868, 870, 872, + 869, 871, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, - 862, 891, 892, 893, 894, 895, 896, 897, 898, 899, + 891, 892, 893, 894, 866, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, @@ -915,74 +917,74 @@ static const flex_int16_t yy_nxt[1373] = 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, - 1230, 1231, 1232, 1233, 1234, 82, 82, 82, 82, 85, - - 85, 85, 85, 88, 88, 88, 88, 90, 90, 93, - 90, 102, 102, 102, 102, 104, 104, 107, 104, 146, - 146, 146, 146, 148, 148, 151, 148, 193, 777, 776, - 193, 195, 195, 775, 195, 774, 773, 772, 771, 770, - 769, 768, 767, 766, 765, 764, 763, 762, 761, 760, - 759, 758, 757, 756, 755, 754, 753, 752, 749, 748, - 747, 746, 745, 744, 743, 742, 741, 740, 739, 738, - 737, 736, 735, 734, 733, 732, 731, 730, 729, 728, - 727, 726, 725, 724, 723, 722, 721, 720, 719, 718, - 717, 716, 715, 714, 713, 712, 711, 710, 709, 708, - - 707, 706, 705, 704, 703, 700, 699, 698, 697, 696, - 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, - 685, 684, 683, 682, 681, 680, 679, 678, 674, 673, - 672, 671, 670, 669, 668, 667, 666, 665, 664, 663, - 662, 661, 660, 659, 658, 657, 654, 653, 652, 651, - 650, 649, 648, 647, 646, 645, 644, 643, 642, 641, - 640, 639, 638, 637, 636, 635, 634, 633, 629, 628, - 627, 624, 623, 622, 621, 620, 619, 618, 617, 616, - 615, 606, 605, 604, 603, 602, 601, 600, 599, 598, - 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, - - 583, 582, 581, 580, 579, 578, 577, 576, 575, 574, - 573, 572, 571, 570, 569, 568, 567, 566, 563, 556, - 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, - 545, 544, 543, 542, 541, 540, 539, 538, 533, 532, - 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, - 521, 520, 519, 518, 517, 516, 515, 512, 511, 510, - 509, 508, 507, 504, 503, 502, 498, 497, 496, 495, - 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, - 484, 483, 482, 481, 478, 477, 476, 473, 472, 471, - 470, 469, 468, 467, 466, 465, 464, 463, 462, 461, - - 460, 459, 458, 457, 454, 450, 449, 448, 447, 446, - 445, 444, 443, 442, 441, 440, 439, 438, 437, 436, - 433, 432, 431, 430, 429, 426, 425, 424, 423, 422, - 421, 420, 419, 418, 417, 416, 415, 414, 413, 412, - 411, 410, 409, 408, 407, 406, 405, 404, 403, 402, - 401, 400, 399, 398, 394, 393, 392, 391, 390, 389, - 388, 387, 386, 385, 384, 383, 382, 381, 380, 379, - 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, - 368, 367, 366, 365, 364, 363, 360, 359, 358, 355, - 354, 353, 352, 351, 350, 349, 348, 345, 344, 343, - - 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, - 332, 331, 330, 329, 328, 327, 326, 325, 324, 323, - 322, 321, 320, 319, 318, 317, 316, 315, 314, 313, - 312, 311, 310, 309, 308, 307, 306, 305, 304, 303, - 302, 194, 301, 300, 299, 298, 297, 296, 293, 292, - 291, 288, 287, 283, 282, 281, 280, 277, 274, 273, - 272, 269, 268, 267, 262, 259, 258, 257, 252, 251, - 250, 147, 249, 248, 247, 246, 245, 244, 243, 242, - 237, 236, 235, 232, 231, 230, 229, 228, 227, 226, - 223, 222, 219, 213, 212, 211, 208, 207, 206, 205, - - 204, 103, 203, 202, 199, 198, 197, 196, 89, 194, - 189, 172, 171, 170, 169, 147, 142, 141, 136, 125, - 122, 119, 112, 103, 100, 97, 96, 89, 1235, 86, - 86, 11, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1235 + 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 82, + + 82, 82, 82, 85, 85, 85, 85, 88, 88, 88, + 88, 90, 90, 93, 90, 102, 102, 102, 102, 104, + 104, 107, 104, 146, 146, 146, 146, 148, 148, 151, + 148, 193, 779, 778, 193, 195, 195, 777, 195, 776, + 775, 774, 773, 772, 771, 770, 769, 768, 767, 766, + 765, 764, 763, 762, 761, 760, 759, 758, 757, 756, + 753, 752, 751, 750, 749, 748, 747, 746, 745, 744, + 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, + 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, + 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, + + 713, 712, 711, 710, 709, 708, 707, 704, 703, 702, + 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, + 691, 690, 689, 688, 687, 686, 685, 684, 683, 682, + 681, 677, 676, 675, 674, 673, 672, 671, 670, 669, + 668, 667, 666, 665, 664, 663, 662, 661, 660, 657, + 656, 655, 654, 653, 652, 651, 650, 649, 648, 647, + 646, 645, 644, 643, 642, 641, 640, 639, 638, 637, + 636, 632, 631, 630, 627, 626, 625, 624, 623, 622, + 621, 620, 619, 618, 609, 608, 607, 606, 605, 604, + 603, 602, 601, 600, 599, 598, 597, 596, 595, 594, + + 593, 592, 591, 590, 585, 584, 583, 582, 581, 580, + 579, 578, 577, 576, 575, 574, 573, 572, 571, 570, + 569, 568, 565, 558, 557, 556, 555, 554, 553, 552, + 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, + 541, 540, 535, 534, 533, 532, 531, 530, 529, 528, + 527, 526, 525, 524, 523, 522, 521, 520, 519, 518, + 517, 514, 513, 512, 511, 510, 509, 506, 505, 504, + 500, 499, 498, 497, 496, 495, 494, 493, 492, 491, + 490, 489, 488, 487, 486, 485, 484, 483, 482, 479, + 478, 477, 474, 473, 472, 471, 470, 469, 468, 467, + + 466, 465, 464, 463, 462, 461, 460, 459, 458, 455, + 451, 450, 449, 448, 447, 446, 445, 444, 443, 442, + 441, 440, 439, 438, 437, 434, 433, 432, 431, 430, + 427, 426, 425, 424, 423, 422, 421, 420, 419, 418, + 417, 416, 415, 414, 413, 412, 411, 410, 409, 408, + 407, 406, 405, 404, 403, 402, 401, 400, 399, 395, + 394, 393, 390, 389, 388, 387, 386, 385, 384, 383, + 382, 381, 380, 379, 378, 377, 376, 375, 374, 373, + 372, 371, 370, 369, 368, 367, 366, 365, 364, 363, + 360, 359, 358, 355, 354, 353, 352, 351, 350, 349, + + 348, 345, 344, 343, 342, 341, 340, 339, 338, 337, + 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, + 326, 325, 324, 323, 322, 321, 320, 319, 318, 317, + 316, 315, 314, 313, 312, 311, 310, 309, 308, 307, + 306, 305, 304, 303, 302, 194, 301, 300, 299, 298, + 297, 296, 293, 292, 291, 288, 287, 283, 282, 281, + 280, 277, 274, 273, 272, 269, 268, 267, 262, 259, + 258, 257, 252, 251, 250, 147, 249, 248, 247, 246, + 245, 244, 243, 242, 237, 236, 235, 232, 231, 230, + 229, 228, 227, 226, 223, 222, 219, 213, 212, 211, + + 208, 207, 206, 205, 204, 103, 203, 202, 199, 198, + 197, 196, 89, 194, 189, 172, 171, 170, 169, 147, + 142, 141, 136, 125, 122, 119, 112, 103, 100, 97, + 96, 89, 1239, 86, 86, 11, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239 } ; -static const flex_int16_t yy_chk[1373] = +static const flex_int16_t yy_chk[1377] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1000,141 +1002,141 @@ static const flex_int16_t yy_chk[1373] = 7, 7, 8, 8, 13, 17, 13, 20, 17, 23, 20, 27, 31, 27, 34, 31, 34, 36, 39, 34, 37, 34, 41, 41, 23, 36, 59, 44, 17, 59, - 508, 36, 39, 37, 36, 31, 43, 45, 46, 51, + 510, 36, 39, 37, 36, 31, 43, 45, 46, 51, 43, 44, 48, 45, 43, 54, 48, 54, 63, 59, - 508, 75, 46, 51, 66, 46, 48, 48, 62, 67, - 62, 64, 63, 62, 65, 64, 73, 75, 66, 685, - 65, 64, 67, 68, 64, 74, 73, 686, 68, 74, + 510, 75, 46, 51, 66, 46, 48, 48, 62, 67, + 62, 64, 63, 62, 65, 64, 73, 75, 66, 686, + 65, 64, 67, 68, 64, 74, 73, 687, 68, 74, 87, 74, 87, 76, 77, 77, 79, 76, 91, 74, 76, 91, 74, 79, 79, 76, 98, 113, 76, 98, 101, 105, 101, 113, 105, 117, 118, 120, 131, 117, - 123, 91, 136, 687, 120, 135, 117, 131, 160, 135, + 123, 91, 136, 688, 120, 135, 117, 131, 160, 135, 118, 136, 123, 145, 105, 145, 149, 155, 162, 149, 156, 156, 160, 155, 163, 167, 167, 172, 174, 162, 182, 179, 186, 241, 163, 179, 241, 256, 172, 149, - 688, 179, 689, 256, 174, 252, 186, 182, 294, 252, - 294, 326, 332, 350, 353, 294, 326, 332, 350, 353, - 372, 377, 398, 402, 411, 372, 377, 398, 402, 411, - - 434, 690, 435, 434, 350, 435, 455, 519, 456, 455, - 458, 456, 455, 398, 456, 458, 479, 480, 505, 479, - 480, 505, 506, 519, 505, 506, 524, 550, 506, 573, - 696, 524, 550, 697, 573, 524, 599, 652, 573, 701, - 702, 599, 652, 694, 694, 694, 698, 703, 704, 705, - 709, 698, 710, 711, 712, 713, 714, 715, 716, 719, - 720, 721, 722, 723, 724, 725, 726, 727, 728, 730, - 731, 733, 734, 735, 736, 737, 738, 739, 740, 741, - 742, 743, 744, 745, 746, 747, 750, 751, 752, 750, - 751, 753, 754, 755, 756, 757, 758, 759, 760, 761, - - 762, 763, 764, 765, 766, 767, 768, 770, 771, 772, - 774, 776, 777, 778, 779, 780, 781, 782, 783, 784, - 784, 784, 785, 787, 788, 789, 787, 788, 790, 791, - 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, + 689, 179, 690, 256, 174, 252, 186, 182, 287, 252, + 294, 287, 294, 326, 332, 350, 353, 294, 326, 332, + 350, 353, 372, 377, 399, 403, 412, 372, 377, 399, + + 403, 412, 435, 691, 436, 435, 350, 436, 456, 521, + 457, 456, 459, 457, 456, 399, 457, 459, 480, 481, + 507, 480, 481, 507, 508, 521, 507, 508, 526, 552, + 508, 575, 692, 526, 552, 693, 575, 526, 602, 655, + 575, 699, 700, 602, 655, 697, 697, 697, 701, 705, + 706, 707, 708, 701, 709, 713, 714, 715, 716, 717, + 718, 719, 720, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 734, 735, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 754, 755, 756, 754, 755, 757, 758, 759, 760, 761, + + 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, + 772, 774, 775, 776, 778, 780, 781, 782, 783, 784, + 785, 786, 787, 788, 788, 788, 789, 791, 792, 793, + 791, 792, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, - 784, 812, 813, 814, 815, 816, 818, 821, 822, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 837, 838, 839, 840, 841, 842, 843, 844, + 812, 813, 814, 815, 788, 816, 817, 818, 819, 820, + 822, 825, 826, 827, 828, 829, 830, 831, 832, 833, + 834, 835, 836, 837, 838, 839, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, - 855, 857, 858, 859, 860, 861, 862, 863, 864, 865, - - 866, 867, 868, 869, 871, 872, 873, 874, 875, 876, - 877, 878, 879, 880, 881, 882, 883, 884, 885, 887, - 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, - 898, 899, 900, 901, 902, 903, 905, 906, 907, 908, - 909, 912, 913, 914, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 925, 926, 929, 930, 931, 932, 933, - 934, 935, 936, 938, 939, 940, 941, 944, 945, 946, - 947, 948, 949, 950, 951, 952, 953, 954, 955, 958, - 959, 960, 962, 963, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 975, 976, 977, 978, 979, 980, + 855, 856, 857, 858, 859, 861, 862, 863, 864, 865, + + 866, 867, 868, 869, 870, 871, 872, 873, 875, 876, + 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, + 887, 888, 889, 891, 892, 893, 894, 895, 896, 897, + 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, + 909, 910, 911, 912, 913, 916, 917, 918, 919, 920, + 921, 922, 923, 924, 925, 926, 927, 929, 930, 933, + 934, 935, 936, 937, 938, 939, 940, 942, 943, 944, + 945, 948, 949, 950, 951, 952, 953, 954, 955, 956, + 957, 958, 959, 962, 963, 964, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, - 1012, 1013, 1014, 1015, 1017, 1018, 1019, 1020, 1021, 1022, - 1023, 1024, 1025, 1030, 1032, 1033, 1034, 1035, 1036, 1037, - 1038, 1039, 1039, 1040, 1041, 1042, 1045, 1048, 1049, 1050, - 1051, 1052, 1053, 1057, 1059, 1060, 1061, 1062, 1063, 1064, - 1065, 1066, 1067, 1070, 1073, 1074, 1075, 1076, 1077, 1078, + 1001, 1002, 1003, 1004, 1006, 1007, 1008, 1009, 1010, 1011, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1021, 1022, + 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1034, 1036, 1037, + 1038, 1039, 1040, 1041, 1042, 1043, 1043, 1044, 1045, 1046, + 1049, 1052, 1053, 1054, 1055, 1056, 1057, 1061, 1063, 1064, + 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1074, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, - 1109, 1110, 1111, 1112, 1113, 1114, 1117, 1118, 1119, 1123, - 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, - 1137, 1141, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, - 1154, 1155, 1156, 1157, 1159, 1160, 1161, 1162, 1163, 1164, - 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1173, 1174, 1175, - 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1186, - 1187, 1188, 1189, 1190, 1191, 1196, 1197, 1198, 1199, 1200, - 1206, 1207, 1209, 1211, 1213, 1214, 1215, 1216, 1218, 1222, - 1223, 1224, 1227, 1228, 1231, 1236, 1236, 1236, 1236, 1237, - - 1237, 1237, 1237, 1238, 1238, 1238, 1238, 1239, 1239, 1240, - 1239, 1241, 1241, 1241, 1241, 1242, 1242, 1243, 1242, 1244, - 1244, 1244, 1244, 1245, 1245, 1246, 1245, 1247, 684, 683, - 1247, 1248, 1248, 682, 1248, 681, 679, 678, 676, 675, - 674, 671, 670, 669, 668, 667, 666, 665, 664, 663, - 662, 661, 659, 658, 657, 656, 655, 654, 651, 650, - 649, 648, 647, 646, 645, 644, 643, 642, 641, 640, - 639, 638, 637, 636, 635, 633, 631, 630, 629, 628, - 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, - 617, 614, 613, 612, 611, 610, 609, 608, 607, 606, - - 605, 604, 603, 602, 600, 598, 597, 596, 595, 594, - 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, - 582, 581, 580, 579, 577, 576, 575, 574, 572, 571, - 570, 569, 568, 567, 565, 564, 562, 561, 560, 559, - 558, 557, 555, 554, 553, 551, 549, 547, 546, 545, - 544, 543, 542, 541, 539, 537, 536, 535, 534, 533, - 532, 531, 530, 529, 528, 527, 526, 525, 523, 522, - 520, 518, 517, 516, 515, 514, 513, 512, 511, 510, - 509, 503, 502, 501, 500, 499, 494, 493, 492, 491, - 490, 489, 488, 487, 486, 485, 484, 483, 482, 481, - - 478, 476, 475, 474, 473, 472, 471, 469, 468, 467, - 466, 465, 464, 463, 462, 461, 460, 459, 457, 454, - 453, 452, 451, 450, 449, 448, 447, 446, 445, 444, - 443, 442, 441, 440, 439, 438, 437, 436, 433, 432, - 431, 429, 428, 427, 425, 424, 423, 422, 421, 420, - 419, 418, 417, 416, 415, 414, 413, 410, 408, 407, - 406, 405, 403, 401, 400, 399, 397, 396, 395, 394, - 393, 392, 391, 390, 389, 388, 387, 386, 385, 384, - 383, 382, 381, 380, 376, 374, 373, 371, 370, 369, - 368, 367, 366, 364, 363, 362, 361, 360, 359, 358, - - 357, 356, 355, 354, 352, 349, 348, 347, 346, 345, - 344, 343, 341, 340, 338, 337, 336, 335, 334, 333, - 331, 330, 329, 328, 327, 325, 324, 323, 322, 321, - 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, - 310, 309, 307, 306, 304, 303, 302, 301, 300, 299, - 298, 297, 296, 295, 292, 291, 289, 287, 286, 285, - 284, 283, 282, 281, 280, 278, 277, 276, 275, 274, - 273, 272, 271, 270, 269, 267, 266, 265, 264, 263, - 262, 261, 260, 259, 258, 257, 255, 254, 253, 251, - 249, 248, 247, 246, 245, 243, 242, 240, 239, 238, - - 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, - 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, - 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, - 207, 206, 205, 203, 202, 201, 200, 199, 198, 197, - 196, 194, 192, 191, 190, 189, 188, 187, 185, 184, - 183, 181, 180, 178, 177, 176, 175, 173, 171, 170, - 169, 166, 165, 164, 161, 159, 158, 157, 154, 153, - 152, 146, 144, 143, 142, 141, 140, 139, 138, 137, - 134, 133, 132, 130, 129, 128, 127, 126, 125, 124, - 122, 121, 119, 116, 115, 114, 112, 111, 110, 109, - - 108, 102, 100, 99, 97, 96, 95, 94, 88, 83, - 78, 72, 71, 70, 69, 56, 50, 49, 47, 42, - 40, 38, 35, 29, 24, 22, 21, 15, 11, 10, - 9, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, - 1235, 1235 + 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, + 1121, 1122, 1123, 1127, 1131, 1132, 1133, 1134, 1135, 1136, + 1137, 1138, 1139, 1140, 1141, 1145, 1150, 1151, 1152, 1153, + 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1163, 1164, + 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, + 1175, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, + 1186, 1187, 1188, 1190, 1191, 1192, 1193, 1194, 1195, 1200, + 1201, 1202, 1203, 1204, 1210, 1211, 1213, 1215, 1217, 1218, + 1219, 1220, 1222, 1226, 1227, 1228, 1231, 1232, 1235, 1240, + + 1240, 1240, 1240, 1241, 1241, 1241, 1241, 1242, 1242, 1242, + 1242, 1243, 1243, 1244, 1243, 1245, 1245, 1245, 1245, 1246, + 1246, 1247, 1246, 1248, 1248, 1248, 1248, 1249, 1249, 1250, + 1249, 1251, 685, 684, 1251, 1252, 1252, 682, 1252, 681, + 679, 678, 677, 674, 673, 672, 671, 670, 669, 668, + 667, 666, 665, 664, 662, 661, 660, 659, 658, 657, + 654, 653, 652, 651, 650, 649, 648, 647, 646, 645, + 644, 643, 642, 641, 640, 639, 638, 636, 634, 633, + 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, + 622, 621, 620, 617, 616, 615, 614, 613, 612, 611, + + 610, 609, 608, 607, 606, 605, 603, 601, 600, 599, + 598, 597, 596, 595, 594, 593, 592, 591, 590, 589, + 588, 587, 586, 584, 583, 582, 581, 579, 578, 577, + 576, 574, 573, 572, 571, 570, 569, 567, 566, 564, + 563, 562, 561, 560, 559, 557, 556, 555, 553, 551, + 549, 548, 547, 546, 545, 544, 543, 541, 539, 538, + 537, 536, 535, 534, 533, 532, 531, 530, 529, 528, + 527, 525, 524, 522, 520, 519, 518, 517, 516, 515, + 514, 513, 512, 511, 505, 504, 503, 502, 501, 496, + 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, + + 485, 484, 483, 482, 479, 477, 476, 475, 474, 473, + 472, 470, 469, 468, 467, 466, 465, 464, 463, 462, + 461, 460, 458, 455, 454, 453, 452, 451, 450, 449, + 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, + 438, 437, 434, 433, 432, 430, 429, 428, 426, 425, + 424, 423, 422, 421, 420, 419, 418, 417, 416, 415, + 414, 411, 409, 408, 407, 406, 404, 402, 401, 400, + 398, 397, 396, 395, 394, 393, 392, 391, 390, 389, + 388, 387, 386, 385, 384, 383, 382, 381, 380, 376, + 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, + + 362, 361, 360, 359, 358, 357, 356, 355, 354, 352, + 349, 348, 347, 346, 345, 344, 343, 341, 340, 338, + 337, 336, 335, 334, 333, 331, 330, 329, 328, 327, + 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, + 315, 314, 313, 312, 311, 310, 309, 307, 306, 304, + 303, 302, 301, 300, 299, 298, 297, 296, 295, 292, + 291, 289, 286, 285, 284, 283, 282, 281, 280, 278, + 277, 276, 275, 274, 273, 272, 271, 270, 269, 267, + 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, + 255, 254, 253, 251, 249, 248, 247, 246, 245, 243, + + 242, 240, 239, 238, 237, 236, 235, 234, 233, 232, + 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, + 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, + 211, 210, 209, 208, 207, 206, 205, 203, 202, 201, + 200, 199, 198, 197, 196, 194, 192, 191, 190, 189, + 188, 187, 185, 184, 183, 181, 180, 178, 177, 176, + 175, 173, 171, 170, 169, 166, 165, 164, 161, 159, + 158, 157, 154, 153, 152, 146, 144, 143, 142, 141, + 140, 139, 138, 137, 134, 133, 132, 130, 129, 128, + 127, 126, 125, 124, 122, 121, 119, 116, 115, 114, + + 112, 111, 110, 109, 108, 102, 100, 99, 97, 96, + 95, 94, 88, 83, 78, 72, 71, 70, 69, 56, + 50, 49, 47, 42, 40, 38, 35, 29, 24, 22, + 21, 15, 11, 10, 9, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239 } ; static yy_state_type yy_last_accepting_state; @@ -1229,10 +1231,10 @@ static char *pgaf_strdup(const char *s) * call flex's static input() function. */ static void pgaf_read_raw_block(void); -#line 1232 "test_spec_scan.c" - #line 1234 "test_spec_scan.c" +#line 1236 "test_spec_scan.c" + #define INITIAL 0 #define CLUSTER_BODY 1 #define STEP_BODY 2 @@ -1453,7 +1455,7 @@ YY_DECL #line 89 "test_spec_scan.l" -#line 1456 "test_spec_scan.c" +#line 1458 "test_spec_scan.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -1480,13 +1482,13 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1236 ) + if ( yy_current_state >= 1240 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1235 ); + while ( yy_current_state != 1239 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2096,170 +2098,170 @@ YY_RULE_SETUP case 108: YY_RULE_SETUP #line 267 "test_spec_scan.l" -{ return T_TIMEOUT; } +{ return T_REPLAYS; } YY_BREAK case 109: YY_RULE_SETUP #line 268 "test_spec_scan.l" -{ return T_ASSERT; } +{ return T_TIMEOUT; } YY_BREAK case 110: YY_RULE_SETUP #line 269 "test_spec_scan.l" -{ return T_SQL; } +{ return T_ASSERT; } YY_BREAK case 111: YY_RULE_SETUP #line 270 "test_spec_scan.l" -{ return T_EXPECT; } +{ return T_SQL; } YY_BREAK case 112: YY_RULE_SETUP #line 271 "test_spec_scan.l" -{ return T_ERROR; } +{ return T_EXPECT; } YY_BREAK case 113: YY_RULE_SETUP #line 272 "test_spec_scan.l" -{ return T_PROMOTE; } +{ return T_ERROR; } YY_BREAK case 114: YY_RULE_SETUP #line 273 "test_spec_scan.l" -{ return T_PERFORM; } +{ return T_PROMOTE; } YY_BREAK case 115: YY_RULE_SETUP #line 274 "test_spec_scan.l" -{ return T_FAILOVER; } +{ return T_PERFORM; } YY_BREAK case 116: YY_RULE_SETUP #line 275 "test_spec_scan.l" -{ return T_NETWORK; } +{ return T_FAILOVER; } YY_BREAK case 117: YY_RULE_SETUP #line 276 "test_spec_scan.l" -{ return T_DISCONNECT; } +{ return T_NETWORK; } YY_BREAK case 118: YY_RULE_SETUP #line 277 "test_spec_scan.l" -{ return T_CONNECT; } +{ return T_DISCONNECT; } YY_BREAK case 119: YY_RULE_SETUP #line 278 "test_spec_scan.l" -{ return T_SLEEP; } +{ return T_CONNECT; } YY_BREAK case 120: YY_RULE_SETUP #line 279 "test_spec_scan.l" -{ return T_COMPOSE; } +{ return T_SLEEP; } YY_BREAK case 121: YY_RULE_SETUP #line 280 "test_spec_scan.l" -{ return T_NODEINI; } +{ return T_COMPOSE; } YY_BREAK case 122: YY_RULE_SETUP #line 281 "test_spec_scan.l" -{ return T_DOWN; } +{ return T_NODEINI; } YY_BREAK case 123: YY_RULE_SETUP #line 282 "test_spec_scan.l" -{ return T_START; } +{ return T_DOWN; } YY_BREAK case 124: YY_RULE_SETUP #line 283 "test_spec_scan.l" -{ return T_STOP; } +{ return T_START; } YY_BREAK case 125: YY_RULE_SETUP #line 284 "test_spec_scan.l" -{ return T_STOPPED; } +{ return T_STOP; } YY_BREAK case 126: YY_RULE_SETUP #line 285 "test_spec_scan.l" -{ return T_KILL; } +{ return T_STOPPED; } YY_BREAK case 127: YY_RULE_SETUP #line 286 "test_spec_scan.l" -{ return T_IN; } +{ return T_KILL; } YY_BREAK case 128: YY_RULE_SETUP #line 287 "test_spec_scan.l" -{ return T_STATE; } +{ return T_IN; } YY_BREAK case 129: YY_RULE_SETUP #line 288 "test_spec_scan.l" -{ return T_ASSIGNED_STATE; } +{ return T_STATE; } YY_BREAK case 130: YY_RULE_SETUP #line 289 "test_spec_scan.l" -{ return T_CANDIDATE_PRIORITY; } +{ return T_ASSIGNED_STATE; } YY_BREAK case 131: YY_RULE_SETUP #line 290 "test_spec_scan.l" -{ return T_GROUP; } +{ return T_CANDIDATE_PRIORITY; } YY_BREAK case 132: YY_RULE_SETUP #line 291 "test_spec_scan.l" -{ return T_AND; } +{ return T_GROUP; } YY_BREAK case 133: YY_RULE_SETUP #line 292 "test_spec_scan.l" -{ return T_IS; } +{ return T_AND; } YY_BREAK case 134: YY_RULE_SETUP #line 293 "test_spec_scan.l" -{ return T_WITH; } +{ return T_IS; } YY_BREAK case 135: YY_RULE_SETUP #line 294 "test_spec_scan.l" -{ return T_EQUALS; } +{ return T_WITH; } YY_BREAK case 136: YY_RULE_SETUP #line 295 "test_spec_scan.l" -{ return T_COMMA; } +{ return T_EQUALS; } YY_BREAK case 137: YY_RULE_SETUP #line 296 "test_spec_scan.l" -{ return T_POSTGRES; } +{ return T_COMMA; } YY_BREAK case 138: YY_RULE_SETUP #line 297 "test_spec_scan.l" -{ return T_STAYS; } +{ return T_POSTGRES; } YY_BREAK case 139: YY_RULE_SETUP #line 298 "test_spec_scan.l" -{ return T_WHILE; } +{ return T_STAYS; } YY_BREAK case 140: -/* rule 140 can match eol */ YY_RULE_SETUP #line 299 "test_spec_scan.l" -{ return T_THROUGH; } +{ return T_WHILE; } YY_BREAK case 141: +/* rule 141 can match eol */ YY_RULE_SETUP #line 300 "test_spec_scan.l" { return T_THROUGH; } @@ -2267,59 +2269,64 @@ YY_RULE_SETUP case 142: YY_RULE_SETUP #line 301 "test_spec_scan.l" -{ return T_SET; } +{ return T_THROUGH; } YY_BREAK case 143: YY_RULE_SETUP #line 302 "test_spec_scan.l" -{ return T_GET; } +{ return T_SET; } YY_BREAK case 144: YY_RULE_SETUP #line 303 "test_spec_scan.l" -{ BEGIN(EXEC_ARGS); return T_INJECT; } +{ return T_GET; } YY_BREAK case 145: YY_RULE_SETUP #line 304 "test_spec_scan.l" -{ return T_LOGS; } +{ BEGIN(EXEC_ARGS); return T_INJECT; } YY_BREAK case 146: YY_RULE_SETUP #line 305 "test_spec_scan.l" -{ return T_NOT; } +{ return T_LOGS; } YY_BREAK case 147: YY_RULE_SETUP #line 306 "test_spec_scan.l" -{ return T_CONTAINS; } +{ return T_NOT; } YY_BREAK case 148: YY_RULE_SETUP #line 307 "test_spec_scan.l" -{ return T_MATCHES; } +{ return T_CONTAINS; } YY_BREAK case 149: YY_RULE_SETUP -#line 309 "test_spec_scan.l" +#line 308 "test_spec_scan.l" +{ return T_MATCHES; } + YY_BREAK +case 150: +YY_RULE_SETUP +#line 310 "test_spec_scan.l" { yylval.ival = atoi(yytext); return T_INTEGER; } YY_BREAK -case 150: -/* rule 150 can match eol */ +case 151: +/* rule 151 can match eol */ YY_RULE_SETUP -#line 314 "test_spec_scan.l" +#line 315 "test_spec_scan.l" { yytext[yyleng - 1] = '\0'; yylval.str = pgaf_strdup(yytext + 1); return T_STRING; } YY_BREAK -case 151: +case 152: YY_RULE_SETUP -#line 320 "test_spec_scan.l" +#line 321 "test_spec_scan.l" { if (pgaf_next_brace_is_while) { pgaf_next_brace_is_while = 0; @@ -2330,9 +2337,9 @@ YY_RULE_SETUP return T_BLOCK; } YY_BREAK -case 152: +case 153: YY_RULE_SETUP -#line 330 "test_spec_scan.l" +#line 331 "test_spec_scan.l" { if (pgaf_step_brace_depth > 0) { pgaf_step_brace_depth--; @@ -2343,40 +2350,40 @@ YY_RULE_SETUP return T_RBRACE; } YY_BREAK -case 153: +case 154: YY_RULE_SETUP -#line 340 "test_spec_scan.l" +#line 341 "test_spec_scan.l" { yylval.str = pgaf_strdup(yytext); return T_IDENT; } YY_BREAK -case 154: +case 155: YY_RULE_SETUP -#line 345 "test_spec_scan.l" +#line 346 "test_spec_scan.l" { /* skip whitespace before service name */ } YY_BREAK -case 155: +case 156: YY_RULE_SETUP -#line 347 "test_spec_scan.l" +#line 348 "test_spec_scan.l" { yylval.str = pgaf_strdup(yytext); BEGIN(EXEC_ARGS_REST); return T_IDENT; } YY_BREAK -case 156: -/* rule 156 can match eol */ +case 157: +/* rule 157 can match eol */ YY_RULE_SETUP -#line 353 "test_spec_scan.l" +#line 354 "test_spec_scan.l" { pgaf_line_number++; BEGIN(STEP_BODY); } YY_BREAK -case 157: +case 158: YY_RULE_SETUP -#line 358 "test_spec_scan.l" +#line 359 "test_spec_scan.l" { char *p = yytext; while (*p == ' ' || *p == '\t') p++; @@ -2385,21 +2392,21 @@ YY_RULE_SETUP return T_SHELL_ARGS; } YY_BREAK -case 158: -/* rule 158 can match eol */ +case 159: +/* rule 159 can match eol */ YY_RULE_SETUP -#line 366 "test_spec_scan.l" +#line 367 "test_spec_scan.l" { pgaf_line_number++; BEGIN(STEP_BODY); } YY_BREAK -case 159: +case 160: YY_RULE_SETUP -#line 371 "test_spec_scan.l" +#line 372 "test_spec_scan.l" ECHO; YY_BREAK -#line 2402 "test_spec_scan.c" +#line 2409 "test_spec_scan.c" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(CLUSTER_BODY): case YY_STATE_EOF(STEP_BODY): @@ -2701,7 +2708,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1236 ) + if ( yy_current_state >= 1240 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -2729,11 +2736,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1236 ) + if ( yy_current_state >= 1240 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1235); + yy_is_jam = (yy_current_state == 1239); return yy_is_jam ? 0 : yy_current_state; } @@ -3372,7 +3379,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 371 "test_spec_scan.l" +#line 372 "test_spec_scan.l" static void diff --git a/src/bin/pgaftest/test_spec_scan.l b/src/bin/pgaftest/test_spec_scan.l index a907d1170..6e63ea648 100644 --- a/src/bin/pgaftest/test_spec_scan.l +++ b/src/bin/pgaftest/test_spec_scan.l @@ -264,6 +264,7 @@ static void pgaf_read_raw_block(void); "wait" { return T_WAIT; } "until" { return T_UNTIL; } +"replays" { return T_REPLAYS; } "timeout" { return T_TIMEOUT; } "assert" { return T_ASSERT; } "sql" { return T_SQL; } diff --git a/tests/tap/specs/upgrade.pgaf b/tests/tap/specs/upgrade.pgaf index 64a3cb48f..72bfbd30a 100644 --- a/tests/tap/specs/upgrade.pgaf +++ b/tests/tap/specs/upgrade.pgaf @@ -256,6 +256,14 @@ step test_008_failover_post_upgrade { step test_009_write_on_new_primary { sql node2 { INSERT INTO upgrade_marker DEFAULT VALUES; } + + # The FSM reports node1/node3 as secondary as soon as the promotion + # converges, which isn't the same instant a write issued a moment later + # has actually replicated -- wait for each standby to catch up to + # node2's post-INSERT LSN before reading, instead of racing that gap. + wait until node1 replays node2 timeout 30s + wait until node3 replays node2 timeout 30s + sql node1 { SELECT count(*) FROM upgrade_marker; } expect { 2 } sql node3 { SELECT count(*) FROM upgrade_marker; } From 16a954489c3ffe468c31515e09ecc5e70320adf4 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 29 Jul 2026 04:19:16 +0200 Subject: [PATCH 3/8] pgaftest: use docker compose --wait instead of a hand-rolled poll for compose start CMD_COMPOSE_START polled 'docker compose ps -q | xargs docker inspect --format {{.State.Running}}' every 200ms for up to 10s after 'up -d --no-recreate --no-deps '. Confirmed via local repro (docker events log) that the whole stop/start cycle normally completes in under a second -- the failure seen in CI (pgaftest/ssl test_007_enable_ssl_secondary, 'container did not report running within 10000 ms') is purely a margin problem on a loaded runner, not a logic bug in the check itself. Replaced the two-subprocess-per-poll loop with a single 'up -d --no-recreate --no-deps --wait --wait-timeout 30' call: lets compose's own daemon-side readiness check do the work (using the service's healthcheck when one is defined, same 'running' state otherwise) instead of re-implementing it here, and triples the margin in the same move. Verified with docker compose directly (--wait/--wait-timeout compose with --no-recreate --no-deps cleanly, matches the existing 'Waiting'/ 'Healthy' compose-up output already relied on for initial cluster bring-up) and by re-running enable_ssl.pgaf (8/8), ensure.pgaf (5/5, this exact code path's prior fix target), and basic_operation.pgaf (28/28). --- src/bin/pgaftest/test_runner.c | 67 ++++++++++------------------------ 1 file changed, 19 insertions(+), 48 deletions(-) diff --git a/src/bin/pgaftest/test_runner.c b/src/bin/pgaftest/test_runner.c index 7c69e9483..ea1608254 100644 --- a/src/bin/pgaftest/test_runner.c +++ b/src/bin/pgaftest/test_runner.c @@ -3417,11 +3417,25 @@ runner_exec_cmd(TestRunner *r, TestCmd *cmd, char *errBuf, int errLen) * `--no-deps` is critical: without it, `start` (and `up`) would * also start any stopped services listed in `depends_on`, which * interferes with tests that restart a single node. + * + * `--wait --wait-timeout` lets compose's own daemon-side readiness + * check do the work, instead of a hand-rolled `docker compose ps + * -q | xargs docker inspect` poll loop from here: one call instead + * of up to N subprocess pairs, and it uses the service's own + * healthcheck when one is defined rather than only "process + * started". 30s (vs the previous 10s poll) gives real headroom + * for a loaded CI runner -- this restart briefly overlaps with + * the node's own in-flight config-reload-triggered Postgres + * restart on a slow runner (see the "did not report running + * within 10000 ms" flake on pgaftest/ssl this was sized for). */ char out[4096] = ""; + const int waitTimeoutSecs = 30; int rc = run_cmd_capture(out, sizeof(out), - "%s up -d --no-recreate --no-deps %s 2>&1", - r->composeBase, cmd->service); + "%s up -d --no-recreate --no-deps " + "--wait --wait-timeout %d %s 2>&1", + r->composeBase, waitTimeoutSecs, + cmd->service); if (out[0]) { log_output(" compose: ", out); @@ -3429,55 +3443,12 @@ runner_exec_cmd(TestRunner *r, TestCmd *cmd, char *errBuf, int errLen) if (rc != 0) { sformat(errBuf, errLen, - "docker compose start %s failed (exit %d)", - cmd->service, rc); + "docker compose start %s: container did not " + "become running/healthy within %ds (exit %d)", + cmd->service, waitTimeoutSecs, rc); return false; } - /* - * `docker compose up -d` (and its own "Started"/"Running" status - * line) returns as soon as the daemon has issued the start, not - * once the container is actually registered as running -- a - * following `docker exec` can still race that with "container - * ... is not running" for a few hundred ms. Poll the daemon's - * own view of the container state before declaring success. - */ - { - bool running = false; - int elapsedMs = 0; - const int pollIntervalMs = 200; - const int pollTimeoutMs = 10000; - - while (elapsedMs < pollTimeoutMs) - { - char state[64] = ""; - int stateRc = run_cmd_capture(state, sizeof(state), - "%s ps -q %s | " - "xargs -r docker inspect " - "--format '{{.State.Running}}' " - "2>/dev/null", - r->composeBase, cmd->service); - - if (stateRc == 0 && strcmp(state, "true") == 0) - { - running = true; - break; - } - - pg_usleep(pollIntervalMs * 1000); - elapsedMs += pollIntervalMs; - } - - if (!running) - { - sformat(errBuf, errLen, - "docker compose start %s: container did not " - "report running within %d ms", - cmd->service, pollTimeoutMs); - return false; - } - } - return true; } From dd902f649583acdf349b9d74f7393d44505bd4ad Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 29 Jul 2026 10:29:38 +0200 Subject: [PATCH 4/8] Add TCP keepalives + tcp_user_timeout to keeper-to-monitor connections Root cause of the auth.pgaf::test_006 flake investigated further: a query already in flight on the keeper's monitor connection at the exact moment the network vanishes without a graceful FIN/RST (a real partition, or docker network disconnect in our own tests) blocks on read() with no libpq-level bound at all -- PGCONNECT_TIMEOUT only covers the initial handshake. Confirmed directly: a plain query left in that state took over 5 minutes to fail locally. pgsql_open_connection() now uses PQconnectdbParams() (dbname=the existing connection string, expand_dbname=1, so this doesn't need to parse/rebuild pgsql->connectionString) to add, for PGSQL_CONN_MONITOR connections only: - keepalives_idle/interval/count: detects a connection that's gone fully idle (no unacknowledged data) within seconds. - tcp_user_timeout: bounds the separate case where the connection still has unacknowledged data in flight when the network breaks -- confirmed via strace that plain TCP_KEEPCNT alone doesn't cover this case, since the kernel's data-retransmission timer (not the keepalive timer) governs it until data is acknowledged. Deliberately scoped to PGSQL_CONN_MONITOR only (not local Postgres connections, over Unix sockets where this is moot). Nothing here touches pgsql->connectionString itself, so none of the existing log lines that print it (scrubbed or otherwise) change -- the extra parameters are added only at the actual libpq connect call. Verified: clean build, banned-API and citus_indent checks; strace confirms the exact setsockopt(TCP_KEEPIDLE/INTVL/CNT) values are applied; auth.pgaf (6/6) and basic_operation.pgaf (28/28, including the 84s real network-partition test) show no regression. Local verification of the actual bound this gives on the exact query-in-flight hang was inconclusive on this machine (Docker Desktop on macOS runs containers in a virtualized Linux kernel that may not reflect the CI runners' bare-metal-like Linux networking stack); the mechanism itself (setsockopt calls, parameter values) is confirmed correct and is the standard, documented way to bound this class of problem. Real CI (native Linux) is the authoritative check for whether this actually shortens the auth.pgaf::test_006 flake. --- src/bin/common/pgsql.c | 47 +++++++++++++++++++++++++++++++++-- src/bin/pg_autoctl/defaults.h | 22 ++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/bin/common/pgsql.c b/src/bin/common/pgsql.c index bee978c2e..105c4f96c 100644 --- a/src/bin/common/pgsql.c +++ b/src/bin/common/pgsql.c @@ -545,8 +545,51 @@ pgsql_open_connection(PGSQL *pgsql) INSTR_TIME_SET_CURRENT(pgsql->retryPolicy.startTime); INSTR_TIME_SET_ZERO(pgsql->retryPolicy.connectTime); - /* Make a connection to the database */ - pgsql->connection = PQconnectdb(pgsql->connectionString); + if (pgsql->connectionType == PGSQL_CONN_MONITOR) + { + /* + * Bound how long a query already in flight when the network + * disappears without a graceful FIN/RST (a hard network partition, + * or `docker network disconnect` in our own test suite) can block + * on read(), instead of relying on the OS default TCP retransmission + * timeout (many minutes). PGCONNECT_TIMEOUT above only bounds the + * initial handshake, not an already-established connection. + * + * Two distinct mechanisms, both needed: keepalives only start + * probing once a connection has been fully idle (no unacknowledged + * data) for keepalives_idle seconds -- if the query's own bytes are + * still unacknowledged at the moment the network vanishes, plain + * data retransmission (governed by the kernel's tcp_retries2, not + * by our keepalive settings) takes over instead and keepalives never + * get a chance to apply. tcp_user_timeout bounds that unacknowledged + * -data case directly, regardless of which timer the kernel is + * currently running. + * + * dbname carries the full connection string/URI as given by the + * caller; expand_dbname=1 tells libpq to parse it as such rather + * than take it literally, so this works whichever form (URI or + * keyword=value) pgsql->connectionString happens to be in, without + * us having to parse and rebuild it here ourselves. + */ + const char *keywords[] = { + "dbname", "keepalives", "keepalives_idle", + "keepalives_interval", "keepalives_count", + "tcp_user_timeout", NULL + }; + const char *values[] = { + pgsql->connectionString, "1", POSTGRES_MONITOR_KEEPALIVES_IDLE, + POSTGRES_MONITOR_KEEPALIVES_INTERVAL, + POSTGRES_MONITOR_KEEPALIVES_COUNT, + POSTGRES_MONITOR_TCP_USER_TIMEOUT, NULL + }; + + pgsql->connection = PQconnectdbParams(keywords, values, 1); + } + else + { + /* Make a connection to the database */ + pgsql->connection = PQconnectdb(pgsql->connectionString); + } /* Check to see that the backend connection was successfully made */ if (PQstatus(pgsql->connection) != CONNECTION_OK) diff --git a/src/bin/pg_autoctl/defaults.h b/src/bin/pg_autoctl/defaults.h index bf931db87..d63e7a4e2 100644 --- a/src/bin/pg_autoctl/defaults.h +++ b/src/bin/pg_autoctl/defaults.h @@ -61,6 +61,28 @@ #define MAXIMUM_BACKUP_RATE "100M" #define MAXIMUM_BACKUP_RATE_LEN 32 +/* + * TCP keepalives for the keeper-to-monitor connection. PGCONNECT_TIMEOUT + * only bounds the initial TCP handshake -- once connected, a query that's + * in flight when the network vanishes without a graceful FIN/RST (e.g. a + * hard `docker network disconnect`, or a real network partition) blocks on + * a plain read() with no libpq-level timeout of its own, relying entirely + * on the OS's default TCP retransmission timeout (many minutes). These + * values bound that worst case to keepalives_idle + keepalives_interval * + * keepalives_count =~ 11 seconds instead. + */ +#define POSTGRES_MONITOR_KEEPALIVES_IDLE "5" +#define POSTGRES_MONITOR_KEEPALIVES_INTERVAL "2" +#define POSTGRES_MONITOR_KEEPALIVES_COUNT "3" + +/* + * Milliseconds. Bounds how long already-transmitted, unacknowledged data + * may go unacknowledged before the kernel gives up on the connection -- + * the case plain keepalives don't cover (see the comment at the + * PQconnectdbParams() call site in pgsql_open_connection()). + */ +#define POSTGRES_MONITOR_TCP_USER_TIMEOUT "10000" + /* * Microsoft approved cipher string. From f6009080d472fe0c74b74ec388282ea6a16d35c5 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 29 Jul 2026 12:55:16 +0200 Subject: [PATCH 5/8] pgaftest: fix multi_alternate's test_005_002 election-tie flake test_005_002_fail_primary_again restarts node2, kills node1, and expects node3 to be elected the new primary -- but node2 (freshly pg_rewind'ed) streams the small amount of missing WAL and reaches the exact same LSN as node3 well before the monitor's health-check-based unhealthy detection (~20s+) even notices node1 is gone. On an LSN tie, SelectFailoverCandidateNode() (group_state_machine.c) keeps the first candidate seen at equal priority, and node2 (id=2) sorts ahead of node3 (id=3) -- so on any tie node2 always wins, the opposite of what this test hardcodes. Root-caused via a pasted CI log (pgaftest / multi-alternate (PG17)): "timeout: node3 assigned-state never reached primary". This is a latent design flaw in the test itself (not a regression from this branch's other fixes) -- previously it "worked" only because node2 usually hadn't caught up by the time the monitor noticed node1 was gone. Fix: drop node2's candidate-priority to 0 right before killing it in test_005_001, which removes it from GroupListCandidates' selection pool entirely while still letting it report its LSN (satisfying this formation's number_sync_standbys=1 quorum requirement of 2 reports). Restore it to 50 once node2 rejoins as secondary in test_005_003, since series 006's test_006_002 expects node2 to win a later election normally. Verified: pgaftest run tests/tap/specs/multi_alternate.pgaf: 16/16, including test_005_002 (now deterministic) and test_006_002 (confirms the priority restore works, node2 still wins there as expected). --- tests/tap/specs/multi_alternate.pgaf | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/tap/specs/multi_alternate.pgaf b/tests/tap/specs/multi_alternate.pgaf index ec5c72bec..cf91ba9fa 100644 --- a/tests/tap/specs/multi_alternate.pgaf +++ b/tests/tap/specs/multi_alternate.pgaf @@ -138,6 +138,19 @@ step test_003_005_check_slots_after_series_003 { } step test_005_001_fail_primary_again { + # Force node3 to win the upcoming test_005_002 election even if node2 + # (restarted there) manages to stream-catch-up to the exact same LSN as + # node3 before the monitor notices node1 is gone: on an LSN tie, the + # monitor's SelectFailoverCandidateNode() keeps the first candidate seen + # at equal priority (lowest node id), so without this node2 (id=2) would + # beat node3 (id=3) on any tie -- the opposite of what this step name and + # the series 005 diagram above document. candidate-priority 0 removes + # node2 from GroupListCandidates' selection pool entirely while still + # letting it report its LSN, which is required to satisfy this + # formation's number_sync_standbys=1 quorum (2 reports needed) -- see the + # comment on test_005_002 below. Restored once node2 rejoins as + # secondary, in test_005_003, before series 006 needs it eligible again. + exec node2 pg_autoctl set node candidate-priority 0 compose kill node2 wait until node1 state is primary and node3 state is secondary @@ -183,6 +196,10 @@ step test_005_003_bring_up_first_failed_primary { wait until node2 state is secondary and node3 state is primary timeout 300s + # Restore node2's normal candidate priority now that it's back as a + # healthy secondary: series 006 (test_006_002) expects node2 to win a + # later election, so it must be a normal-priority candidate again by then. + exec node2 pg_autoctl set node candidate-priority 50 } step test_005_004_bring_up_last_failed_primary { From ca8f97a2a84ffcc43527d41e5291c0297332ec81 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 29 Jul 2026 15:18:13 +0200 Subject: [PATCH 6/8] pgaftest: bump config_get_set.pgaf rename-settle margin 2s -> 5s test_003_region_cli_roundtrip failed on CI (pgaftest / quick (PG14)): "exec node1 pg_autoctl get node region failed" / "Query returned 0 rows, expected 1" -- monitor_get_node_region() (monitor.c) looks node1 up by its CURRENT nodename, which is renamed twice by the preceding steps (test_001's "set node metadata --name" then "config set pg_autoctl.name"). Each rename signals the running supervisor to reload and push the new name to the monitor asynchronously; the existing 2s sleeps after both renames (already commented as guarding against exactly this) weren't enough margin under CI load. Root cause is a timing race, not a logic bug -- confirmed by running the spec 2x locally with the original 2s margin (both passed cleanly), consistent with this being CI-load-dependent rather than deterministic. Bumped both settle sleeps to 5s, matching the same class of fix already applied elsewhere in this branch's CI-flake sweep (auth.pgaf's 5s->15s). Verified: pgaftest run tests/tap/specs/config_get_set.pgaf: 5/5. --- tests/tap/specs/config_get_set.pgaf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/tap/specs/config_get_set.pgaf b/tests/tap/specs/config_get_set.pgaf index 8082c4b5c..7c5ccd276 100644 --- a/tests/tap/specs/config_get_set.pgaf +++ b/tests/tap/specs/config_get_set.pgaf @@ -24,7 +24,7 @@ step test_001_init_primary { exec node1 pg_autoctl set node metadata --name "node a" exec node1 pg_autoctl show state exec node1 pg_autoctl config set pg_autoctl.name a - sleep 2s + sleep 5s exec node1 pg_autoctl show settings } @@ -50,8 +50,10 @@ step test_002b_config_set_node { # running supervisor to reload, which restarts its sub-services -- give # it the same settle time test_001_init_primary already does after its # own config-set, so the next step's monitor query doesn't race a node - # still re-registering after the restart cascade. - sleep 2s + # still re-registering after the restart cascade. CI hit this race with + # 2s (test_003_region_cli_roundtrip got "Query returned 0 rows" from the + # monitor for node1's freshly-renamed identity); bumped to 5s. + sleep 5s } # region is set at create time (node1 region dc1) and, unlike From 8e6045dff5465caf83679b9441fd5d2fdd65b463 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 29 Jul 2026 16:44:44 +0200 Subject: [PATCH 7/8] pg_autoctl: make "config set pg_autoctl.name/hostname" push to the monitor synchronously Replaces fix 9's sleep-based workaround (2s -> 5s) with a real fix, per review feedback: instead of widening the margin around an async race, close it. "pg_autoctl config set pg_autoctl.name/hostname" only wrote the local config file and sent the running supervisor a SIGHUP; the actual push to the monitor happened whenever that supervisor next got around to reloading, asynchronously relative to the CLI command returning. The one-shot CLI process has no way to wait on that, which is exactly the race config_get_set.pgaf::test_003_region_cli_roundtrip hit in CI ("Query returned 0 rows" -- the monitor hadn't been updated yet). "pg_autoctl set node metadata --name/--hostname" already does this correctly: it calls monitor_update_node_metadata() directly, in-process, before returning. cli_keeper_config_set() now does the same for these two keys specifically -- reads the pre-change config, applies the setting, writes the file (unchanged), then, for pg_autoctl.name/hostname only, builds a Keeper/Monitor and calls the same keeper_set_node_metadata() used by the metadata command, synchronously pushing the change before the CLI returns. Skipped when the node runs with its monitor disabled, since there's nothing to synchronize with in that case. All other config keys are untouched -- they still rely on the async SIGHUP reload, which is fine since they have no monitor-visible identity implication. tests/tap/specs/config_get_set.pgaf: removed the now-unnecessary sleep after "config set pg_autoctl.name a" entirely (test_001_init_primary now completes in ~0.6s instead of ~5.7s) and verified test_003 still passes with zero settle time -- confirming the race is closed at the source rather than just given a wider margin. Verified: - Clean build, clean banned-API check, clean citus_indent. - pgaftest run tests/tap/specs/config_get_set.pgaf: 5/5, x3 in a row, with no sleep after the rename. - pytest test_config_get_set.py: 3/3 (unaffected; still uses config_set + its own sleep(2), which still works, now with the added guarantee). - pytest test_basic_operation.py: 32/32 (uses the same config_set pattern in test_001, exercised under a heavier/slower run without incident). --- src/bin/pg_autoctl/cli_config.c | 64 +++++++++++++++++++++++++++++ tests/tap/specs/config_get_set.pgaf | 6 ++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_autoctl/cli_config.c b/src/bin/pg_autoctl/cli_config.c index afc057abc..ef24833ec 100644 --- a/src/bin/pg_autoctl/cli_config.c +++ b/src/bin/pg_autoctl/cli_config.c @@ -649,6 +649,15 @@ cli_config_set(int argc, char **argv) /* * cli_keeper_config_set sets the given option path to the given value. + * + * pg_autoctl.name and pg_autoctl.hostname are node metadata that the monitor + * also carries a copy of: pushing the change there is normally left to the + * running supervisor's own config-reload handling, which this one-shot + * command can only trigger asynchronously (a SIGHUP) and has no way to wait + * on. Push those two synchronously here instead, the same way "pg_autoctl + * set node metadata" already does, so that by the time this command returns + * the monitor is guaranteed to be caught up -- no polling or sleep needed by + * the caller. */ static void cli_keeper_config_set(int argc, char **argv) @@ -675,6 +684,36 @@ cli_keeper_config_set(int argc, char **argv) exit(EXIT_CODE_BAD_ARGS); } + bool isNodeMetadata = streq(argv[0], "pg_autoctl.name") || + streq(argv[0], "pg_autoctl.hostname"); + + /* + * Capture the pre-change values now: keeper_config_set_setting() + * below both patches this exact file on disk and repopulates config + * from it, so config itself won't hold the "old" values anymore by + * the time we'd want to compare. + */ + KeeperConfig oldConfig = { 0 }; + + if (isNodeMetadata) + { + bool missingPgdataIsOk = true; + bool pgIsNotRunningIsOk = true; + bool monitorDisabledIsOk = true; + + oldConfig = keeperOptions; + + if (!keeper_config_read_file(&oldConfig, + missingPgdataIsOk, + pgIsNotRunningIsOk, + monitorDisabledIsOk)) + { + log_fatal("Failed to read configuration file \"%s\"", + config.pathnames.config); + exit(EXIT_CODE_BAD_CONFIG); + } + } + if (!keeper_config_set_setting(&config, argv[0], argv[1])) @@ -692,6 +731,31 @@ cli_keeper_config_set(int argc, char **argv) exit(EXIT_CODE_BAD_CONFIG); } + /* + * Push the name/hostname change to the monitor synchronously, + * unless this node runs with its monitor disabled, in which case + * there is nothing to synchronize with. + */ + if (isNodeMetadata && !oldConfig.monitorDisabled) + { + Keeper keeper = { 0 }; + + keeper.config = config; + + if (!monitor_init(&(keeper.monitor), config.monitor_pguri)) + { + /* errors have already been logged */ + exit(EXIT_CODE_BAD_ARGS); + } + + if (!keeper_set_node_metadata(&keeper, &oldConfig)) + { + log_error("Failed to update \"%s\" on the monitor, " + "see above for details", argv[0]); + exit(EXIT_CODE_MONITOR); + } + } + /* now read the value from just written file */ if (keeper_config_get_setting(&config, argv[0], diff --git a/tests/tap/specs/config_get_set.pgaf b/tests/tap/specs/config_get_set.pgaf index 7c5ccd276..5e77762f4 100644 --- a/tests/tap/specs/config_get_set.pgaf +++ b/tests/tap/specs/config_get_set.pgaf @@ -23,8 +23,12 @@ teardown { step test_001_init_primary { exec node1 pg_autoctl set node metadata --name "node a" exec node1 pg_autoctl show state + + # "config set pg_autoctl.name/hostname" pushes the change to the monitor + # synchronously (same code path as "set node metadata"), so there's + # nothing left to settle here -- no sleep needed before the next step + # queries the monitor for this node's identity. exec node1 pg_autoctl config set pg_autoctl.name a - sleep 5s exec node1 pg_autoctl show settings } From c8ee5d20791b94df042067d8d61d6b1f1a7f4d3f Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Wed, 29 Jul 2026 16:48:08 +0200 Subject: [PATCH 8/8] ci: bump pytest matrix step timeout 15 -> 18 minutes pytest / citus (PG14) hit the "Run pytest / ..." step's 15-minute timeout while still actively making forward progress (on the last of 6 test files, its 4th test), not stuck or hung. citus is by far the heaviest TEST value in this shared timeout (6 files, ~76 items, several multi-coordinator/multi-worker convergence waits -- one file alone (test_nonha_citus_operation.py::test_008_shutdown_primaries) spent ~3 minutes across three sequential ~45s convergence waits), so a step timeout tuned generically for all of {multi, single, monitor, ssl, citus, tablespaces} runs tightest against citus specifically. The step timeout (15min) was also artificially tighter than the job's own timeout-minutes: 20 ceiling that wraps it: checkout + artifact download + docker load took under a minute in the failing run, leaving 4-5 minutes of the job's own budget completely unused when the step timeout fired first. Bumping to 18 minutes uses more of that existing headroom while still leaving comfortable margin under the job-level timeout. This is a CI configuration change with no code behind it to test locally; verified the YAML parses cleanly (python3 -c "import yaml; yaml.safe_load(...)"). --- .github/workflows/ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index afd22ec81..aa70651d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -485,5 +485,13 @@ jobs: echo "TRAVIS_BUILD_DIR=$(pwd)" >> $GITHUB_ENV - name: Run pytest / ${{ matrix.TEST }} (PG${{ matrix.PGVERSION }}) - timeout-minutes: 15 + # citus is the heaviest TEST value in this matrix (6 files, ~76 items, + # several multi-coordinator/multi-worker convergence waits) and has + # been seen to run right up against a 15-minute step timeout while + # still making forward progress, not stuck -- e.g. citus (PG14) + # timed out mid-suite on 2026-07-29 with ~4-5 minutes of the job's + # own 20-minute ceiling (see above) left completely unused. 18 + # minutes gives real headroom while still leaving margin under the + # job-level timeout once checkout/download/docker-load are counted. + timeout-minutes: 18 run: make run-test-prebuilt