diff --git a/iModelCore/ECDb/CHANGES.md b/iModelCore/ECDb/CHANGES.md index fb9df42843b..b21fa619814 100644 --- a/iModelCore/ECDb/CHANGES.md +++ b/iModelCore/ECDb/CHANGES.md @@ -5,7 +5,15 @@ This document including important changes to syntax or file format. | Module | Version | | ------- | --------- | | Profile | `4.0.0.5` | -| ECSQL | `2.0.3.2` | +| ECSQL | `2.0.4.0` | + +## ## `06/23/2026`: Added `IS` / `IS NOT` operator between operands +* ECSql version change `2.0.3.2` -> `2.0.4.0`. +* The `IS` and `IS NOT` operators can now be used between two operands, e.g. `prop1 IS [NOT] prop2`. Each operand may be any value expression — a property, the `NULL` literal, a constant, a parameter, a function call, an arithmetic expression, etc. These map to SQLite's null-safe comparison operators (`NULL IS NULL` is true, `1 IS NULL` is false). +* Previously `IS` / `IS NOT` only supported the right-hand operands `NULL`, the boolean literals `TRUE`/`FALSE`/`UNKNOWN`, and the class type predicate `IS (ClassName)`. Those forms are unchanged: a right-hand operand that is exactly `NULL`/`TRUE`/`FALSE`/`UNKNOWN`, or a parenthesized name that resolves to a class — a qualified `(schema.Class)`, an `ONLY`/`ALL`-prefixed form, or a comma-separated list — keeps its original type-predicate meaning. A parenthesized name that does **not** resolve to a class, e.g. a property reference `(alias.prop)`, is parsed as an ordinary value expression (null-safe comparison), exactly as it would be without the parentheses. When a parenthesized qualified name is both a class and a valid property path, the class (type-predicate) reading wins. +* For multi-column operands (e.g. `Point2d`/`Point3d` and navigation properties), the comparison is expanded column-wise: `IS` joins the per-column comparisons with `AND`, `IS NOT` joins them with `OR` (consistent with `=` and `<>`). +* Example: `SELECT * FROM bis.Element WHERE CodeValue IS NOT UserLabel` +* Example: `SELECT * FROM bis.Element WHERE CodeValue IS json_extract(JsonProperties, '$.code')` ## ## `04/24/2026`: Allow optional ON clause with CROSS JOIN * ECSql version change `2.0.3.1` -> `2.0.3.2`. diff --git a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp index 0b075f5cdb1..b79ffacf772 100644 --- a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp +++ b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp @@ -2434,20 +2434,61 @@ BentleyStatus ECSqlParser::ParseSearchCondition(std::unique_ptr& exp } case OSQLParseNode::boolean_test: { - std::unique_ptr op1 = nullptr; - if (SUCCESS != ParseSearchCondition(op1, parseNode->getChild(0/*boolean_primary*/))) - return ERROR; - bool isNot = false; if (SUCCESS != ParseNotToken(isNot, parseNode->getChild(2/*sql_not*/))) return ERROR; + const BooleanSqlOperator op = isNot ? BooleanSqlOperator::IsNot : BooleanSqlOperator::Is; + OSQLParseNode const* lhsNode = parseNode->getChild(0/*boolean_primary*/); + OSQLParseNode const* rhsNode = parseNode->getChild(3/*truth_value | value_exp*/); + + // A parenthesized qualified name on the right-hand side - e.g. 'X IS (alias.prop)' - parses as a + // '(ClassName)' type predicate because it is grammatically identical to one. If the name does not + // resolve to a class, reinterpret it as a property reference or enum literal so the comparison behaves + // like the null-safe 'X IS alias.prop' / 'X IS ts.Enum.Enumerator' instead of failing with a + // "class not found" error. + std::unique_ptr rhsAsValueExp = nullptr; + if (SQL_ISRULE(rhsNode, type_predicate) && SUCCESS != TryParseParenthesizedNameAsValueExp(rhsAsValueExp, rhsNode)) + return ERROR; + + // The right-hand operand of 'X IS [NOT] ' is either a "truth value" + // (NULL/TRUE/FALSE/UNKNOWN or the (ClassName) type predicate), which keeps the original + // boolean-predicate semantics, or any other value expression, which is a null-safe comparison. + const bool rhsIsTruthValue = rhsAsValueExp == nullptr + && (SQL_ISRULE(rhsNode, type_predicate) + || SQL_ISTOKEN(rhsNode, NULL) || SQL_ISTOKEN(rhsNode, TRUE) + || SQL_ISTOKEN(rhsNode, FALSE) || SQL_ISTOKEN(rhsNode, UNKNOWN)); + + if (!rhsIsTruthValue) + { + // X IS [NOT] Y : both sides are value expressions compared with SQLite's null-safe IS operator. + // The left side is parsed as a value expression (not a boolean predicate) so that it keeps its real + // type. This matters for operands whose comparability depends on their type (e.g. points and + // navigation properties) and to detect a NULL literal operand for the column-wise expansion. + std::unique_ptr lhsValueExp = nullptr; + if (SUCCESS != ParseValueExp(lhsValueExp, lhsNode)) + return ERROR; + + std::unique_ptr rhsValueExp = nullptr; + if (rhsAsValueExp != nullptr) + rhsValueExp = std::move(rhsAsValueExp); + else if (SUCCESS != ParseValueExp(rhsValueExp, rhsNode)) + return ERROR; + + exp = std::make_unique(std::move(lhsValueExp), op, std::move(rhsValueExp)); + return SUCCESS; + } + + // X IS [NOT] NULL|TRUE|FALSE|UNKNOWN|(ClassName) : the left side is a boolean predicate. + std::unique_ptr op1 = nullptr; + if (SUCCESS != ParseSearchCondition(op1, lhsNode)) + return ERROR; + std::unique_ptr truthValueExp = nullptr; - if (SUCCESS != ParseTruthValue(truthValueExp, parseNode->getChild(3/*truth_value*/))) + if (SUCCESS != ParseValueExp(truthValueExp, rhsNode)) return ERROR; - // X IS [NOT] NULL|TRUE|FALSE|UNKNOWN - exp = std::make_unique(std::move(op1), isNot ? BooleanSqlOperator::IsNot : BooleanSqlOperator::Is, std::move(truthValueExp)); + exp = std::make_unique(std::move(op1), op, std::move(truthValueExp)); return SUCCESS; } case OSQLParseNode::boolean_primary: @@ -3466,6 +3507,103 @@ BentleyStatus ECSqlParser::ParseTypePredicate(std::unique_ptr& valueEx return SUCCESS; } //----------------------------------------------------------------------------------------- +// In an 'X IS (...)' expression a parenthesized qualified name such as '(alias.prop)' is +// grammatically indistinguishable from the '(ClassName)' type predicate: both reduce to a +// 'type_predicate' node. When the name does not resolve to an existing class, this reinterprets it as +// a property-reference or enum-literal value expression so the statement behaves like the +// null-safe comparison 'X IS alias.prop' / 'X IS ts.Enum.Enumerator' instead of failing with +// a "class not found" error. +// 'valueExp' is left null - so the caller keeps the type-predicate behavior - when the predicate uses +// an ONLY/ALL prefix, a comma-separated type list, the 'schema:class' (colon) form, or a name that +// does resolve to a class (e.g. 'ECClassId IS (ts.Foo)' or 'ECClassId IS (main.ts.Foo)'). +// @bsimethod +//+---------------+---------------+---------------+---------------+---------------+------ +BentleyStatus ECSqlParser::TryParseParenthesizedNameAsValueExp(std::unique_ptr& valueExp, OSQLParseNode const* typePredicateNode) const + { + valueExp = nullptr; + if (!SQL_ISRULE(typePredicateNode, type_predicate)) + return SUCCESS; + + OSQLParseNode const* type_list = typePredicateNode->getChild(1/*type_list*/); + if (type_list->count() != 1) + return SUCCESS; // a comma-separated type list is always a genuine type predicate + + OSQLParseNode const* type_list_item = type_list->getChild(0); + OSQLParseNode const* opt_only = type_list_item->getChild(0/*opt_only*/); + if (opt_only->count() != 0) + return SUCCESS; // an ONLY/ALL prefix is always a genuine type predicate + + OSQLParseNode const* tableNode = type_list_item->getChild(1/*table_node*/); + if (!SQL_ISRULE(tableNode, table_node)) + return SUCCESS; + + OSQLParseNode const* nameNode = tableNode->getChild(0); + PropertyPath propertyPath; + if (SQL_ISRULE(nameNode, qualified_class_name)) + { + // The 'schema:class' (colon) form is class-only syntax and is never a property path. + if (!nameNode->getChild(1/*'.' or ':'*/)->getTokenValue().Equals(".")) + return SUCCESS; + + Utf8StringCR schemaNameOrAlias = nameNode->getChild(0)->getTokenValue(); + OSQLParseNode const* classNameNode = nameNode->getChild(2/*class_name*/); + Utf8StringCR propertyName = classNameNode->getChild(0)->getTokenValue(); + if (schemaNameOrAlias.empty() || propertyName.empty()) + return SUCCESS; + + // If the name resolves to a class, keep the '(ClassName)' type-predicate meaning. + if (m_context->GetECDb().Schemas().GetClass(schemaNameOrAlias, propertyName, SchemaLookupMode::AutoDetect) != nullptr) + return SUCCESS; + + propertyPath.Push(schemaNameOrAlias); + propertyPath.Push(propertyName); + } + else if (SQL_ISRULE(nameNode, tablespace_qualified_class_name)) + { + Utf8StringCR tableSpaceName = nameNode->getChild(0)->getTokenValue(); + OSQLParseNode const* qualifiedNameNode = nameNode->getChild(2/*qualified_class_name*/); + if (!SQL_ISRULE(qualifiedNameNode, qualified_class_name)) + return SUCCESS; + + // The 'tablespace.schema:class' (colon) form is class-only syntax and is never a property path. + if (!qualifiedNameNode->getChild(1/*'.' or ':'*/)->getTokenValue().Equals(".")) + return SUCCESS; + + Utf8StringCR schemaNameOrAlias = qualifiedNameNode->getChild(0)->getTokenValue(); + OSQLParseNode const* classNameNode = qualifiedNameNode->getChild(2/*class_name*/); + Utf8StringCR classNameOrPropertyName = classNameNode->getChild(0)->getTokenValue(); + if (tableSpaceName.empty() || schemaNameOrAlias.empty() || classNameOrPropertyName.empty()) + return SUCCESS; + + // If the name resolves to a tablespace-qualified class, keep the '(ClassName)' type-predicate meaning. + if (m_context->GetECDb().Schemas().GetClass(schemaNameOrAlias, classNameOrPropertyName, SchemaLookupMode::AutoDetect, tableSpaceName.c_str()) != nullptr) + return SUCCESS; + + propertyPath.Push(tableSpaceName); + propertyPath.Push(schemaNameOrAlias); + propertyPath.Push(classNameOrPropertyName); + } + else + return SUCCESS; + + if (propertyPath.Size() == 3) + { + ECEnumerationCP ecEnum = m_context->GetECDb().Schemas().GetEnumeration(propertyPath[0].GetName(), propertyPath[1].GetName(), SchemaLookupMode::AutoDetect); + if (ecEnum != nullptr) + { + ECEnumeratorCP enumerator = ecEnum->FindEnumeratorByName(propertyPath[2].GetName().c_str()); + if (enumerator != nullptr) + { + valueExp = std::make_unique(*enumerator, propertyPath); + return SUCCESS; + } + } + } + + valueExp = std::make_unique(propertyPath); + return SUCCESS; + } +//----------------------------------------------------------------------------------------- // @bsimethod //+---------------+---------------+---------------+---------------+---------------+------ BentleyStatus ECSqlParser::ParseValueExp(std::unique_ptr& valueExp, OSQLParseNode const* parseNode) const diff --git a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h index 6da3098ccfc..80bd73756e6 100644 --- a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h +++ b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h @@ -246,7 +246,6 @@ struct ECSqlParser final BentleyStatus ParseTableNodeWithOptMemberCall(std::unique_ptr&, connectivity::OSQLParseNode const&, ECSqlType, PolymorphicInfo polymorphic, bool disqualifyPrimaryJoin) const; BentleyStatus ParseTableRef(std::unique_ptr&, connectivity::OSQLParseNode const*, ECSqlType ecsqlType) const; BentleyStatus ParseTerm(std::unique_ptr&, connectivity::OSQLParseNode const*) const; - BentleyStatus ParseTruthValue(std::unique_ptr& exp, connectivity::OSQLParseNode const* node) const { return ParseValueExp(exp, node); } BentleyStatus ParseSearchCondition(std::unique_ptr&, connectivity::OSQLParseNode const*) const; BentleyStatus ParseSetFct(std::unique_ptr&, connectivity::OSQLParseNode const&, Utf8StringCR functionName, bool isStandardSetFunction) const; @@ -262,6 +261,7 @@ struct ECSqlParser final BentleyStatus ParseTableValuedFunction(std::unique_ptr&, connectivity::OSQLParseNode const&) const; BentleyStatus ParseIIFExp(std::unique_ptr &valueExp, connectivity::OSQLParseNode const *parseNode) const; BentleyStatus ParseTypePredicate(std::unique_ptr &valueExp, connectivity::OSQLParseNode const *parseNode) const; + BentleyStatus TryParseParenthesizedNameAsValueExp(std::unique_ptr &valueExp, connectivity::OSQLParseNode const *typePredicateNode) const; BentleyStatus ParseWindowClause(std::unique_ptr&, connectivity::OSQLParseNode const*) const; BentleyStatus ParseWindowDefinitionListExp(std::unique_ptr&, connectivity::OSQLParseNode const*) const; BentleyStatus ParseWindowDefinitionExp(std::unique_ptr&, connectivity::OSQLParseNode const*) const; diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp b/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp index 20c1dee249c..561f168d1fe 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp @@ -896,16 +896,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 31 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 3094 +#define YYLAST 3430 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 173 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 220 /* YYNRULES -- Number of rules. */ -#define YYNRULES 482 +#define YYNRULES 485 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 767 +#define YYNSTATES 778 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 405 @@ -982,42 +982,42 @@ static const yytype_int16 yyrline[] = 754, 764, 767, 773, 774, 778, 781, 791, 792, 797, 804, 805, 812, 813, 818, 826, 827, 834, 842, 850, 858, 862, 871, 872, 882, 883, 891, 892, 893, 894, - 895, 898, 899, 900, 901, 902, 903, 904, 914, 915, - 925, 926, 934, 935, 944, 945, 955, 964, 969, 977, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 1000, - 1007, 1014, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1053, - 1063, 1071, 1081, 1091, 1097, 1103, 1125, 1150, 1151, 1158, - 1167, 1173, 1189, 1193, 1201, 1210, 1216, 1232, 1241, 1250, - 1259, 1269, 1270, 1271, 1275, 1283, 1289, 1297, 1304, 1315, - 1320, 1327, 1331, 1332, 1333, 1334, 1335, 1337, 1349, 1361, - 1373, 1389, 1390, 1396, 1400, 1401, 1404, 1405, 1406, 1407, - 1410, 1422, 1423, 1424, 1425, 1432, 1440, 1452, 1453, 1457, - 1471, 1487, 1503, 1512, 1520, 1529, 1547, 1548, 1557, 1558, - 1559, 1560, 1561, 1562, 1566, 1571, 1576, 1583, 1591, 1592, - 1595, 1596, 1601, 1602, 1610, 1618, 1631, 1641, 1650, 1654, - 1665, 1672, 1679, 1680, 1681, 1682, 1683, 1687, 1698, 1699, - 1705, 1716, 1728, 1729, 1733, 1738, 1749, 1750, 1754, 1768, - 1769, 1779, 1783, 1784, 1788, 1793, 1794, 1803, 1806, 1812, - 1822, 1826, 1844, 1845, 1849, 1854, 1855, 1866, 1867, 1877, - 1880, 1886, 1896, 1897, 1904, 1910, 1916, 1927, 1928, 1929, - 1933, 1934, 1938, 1944, 1951, 1960, 1969, 1980, 1981, 1987, - 1991, 1992, 2001, 2002, 2011, 2020, 2021, 2022, 2023, 2028, - 2029, 2038, 2039, 2040, 2044, 2058, 2059, 2060, 2063, 2064, - 2067, 2079, 2080, 2084, 2087, 2091, 2092, 2093, 2094, 2095, - 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, - 2106, 2110, 2115, 2125, 2134, 2135, 2139, 2151, 2152, 2159, - 2160, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2181, 2185, - 2189, 2190, 2196, 2202, 2211, 2212, 2219, 2226, 2236, 2237, - 2244, 2254, 2255, 2262, 2269, 2276, 2286, 2293, 2298, 2303, - 2308, 2314, 2320, 2329, 2336, 2344, 2352, 2355, 2361, 2365, - 2370, 2378, 2379, 2380, 2384, 2388, 2389, 2392, 2399, 2409, - 2412, 2416, 2426, 2431, 2438, 2447, 2455, 2464, 2472, 2481, - 2489, 2494, 2499, 2507, 2516, 2517, 2527, 2528, 2536, 2541, - 2559, 2565, 2570, 2578, 2590, 2594, 2598, 2599, 2603, 2614, - 2624, 2629, 2636, 2646, 2649, 2654, 2655, 2656, 2657, 2658, - 2659, 2662, 2667, 2674, 2684, 2685, 2693, 2697, 2701, 2705, - 2711, 2719, 2722, 2732, 2733, 2737, 2746, 2751, 2759, 2765, - 2775, 2776, 2777 + 895, 898, 899, 900, 901, 902, 903, 904, 914, 916, + 928, 938, 939, 947, 948, 957, 958, 968, 977, 982, + 994, 1000, 1009, 1021, 1022, 1023, 1024, 1025, 1026, 1027, + 1028, 1029, 1035, 1042, 1049, 1074, 1075, 1076, 1077, 1078, + 1079, 1080, 1088, 1098, 1106, 1116, 1126, 1132, 1138, 1160, + 1185, 1186, 1193, 1202, 1208, 1224, 1228, 1236, 1245, 1251, + 1267, 1276, 1285, 1294, 1304, 1305, 1306, 1310, 1318, 1324, + 1332, 1339, 1350, 1355, 1362, 1366, 1367, 1368, 1369, 1370, + 1372, 1384, 1396, 1408, 1424, 1425, 1431, 1435, 1436, 1439, + 1440, 1441, 1442, 1445, 1457, 1458, 1459, 1460, 1467, 1475, + 1487, 1488, 1492, 1506, 1522, 1538, 1547, 1555, 1564, 1582, + 1583, 1592, 1593, 1594, 1595, 1596, 1597, 1601, 1606, 1611, + 1618, 1626, 1627, 1630, 1631, 1636, 1637, 1645, 1653, 1666, + 1676, 1685, 1689, 1700, 1707, 1714, 1715, 1716, 1717, 1718, + 1722, 1733, 1734, 1740, 1751, 1763, 1764, 1768, 1773, 1784, + 1785, 1789, 1803, 1804, 1814, 1818, 1819, 1823, 1828, 1829, + 1838, 1841, 1847, 1857, 1861, 1879, 1880, 1884, 1889, 1890, + 1901, 1902, 1912, 1915, 1921, 1931, 1932, 1939, 1945, 1951, + 1962, 1963, 1964, 1968, 1969, 1973, 1979, 1986, 1995, 2004, + 2015, 2016, 2022, 2026, 2027, 2036, 2037, 2046, 2055, 2056, + 2057, 2058, 2063, 2064, 2073, 2074, 2075, 2079, 2093, 2094, + 2095, 2098, 2099, 2102, 2114, 2115, 2119, 2122, 2126, 2127, + 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, + 2138, 2139, 2140, 2141, 2145, 2150, 2160, 2169, 2170, 2174, + 2186, 2187, 2194, 2195, 2203, 2204, 2205, 2206, 2207, 2208, + 2209, 2216, 2220, 2224, 2225, 2231, 2237, 2246, 2247, 2254, + 2261, 2271, 2272, 2279, 2289, 2290, 2297, 2304, 2311, 2321, + 2328, 2333, 2338, 2343, 2349, 2355, 2364, 2371, 2379, 2387, + 2390, 2396, 2400, 2405, 2413, 2414, 2415, 2419, 2423, 2424, + 2427, 2434, 2444, 2447, 2451, 2461, 2466, 2473, 2482, 2490, + 2499, 2507, 2516, 2524, 2529, 2534, 2542, 2551, 2552, 2562, + 2563, 2571, 2576, 2594, 2600, 2605, 2613, 2625, 2629, 2633, + 2634, 2638, 2649, 2659, 2664, 2671, 2681, 2684, 2689, 2690, + 2691, 2692, 2693, 2694, 2697, 2702, 2709, 2719, 2720, 2728, + 2732, 2736, 2740, 2746, 2754, 2757, 2767, 2768, 2772, 2781, + 2786, 2794, 2800, 2810, 2811, 2812 }; #endif @@ -1161,12 +1161,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-583) +#define YYPACT_NINF (-608) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-461) +#define YYTABLE_NINF (-464) #define yytable_value_is_error(Yyn) \ 0 @@ -1175,83 +1175,84 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - 280, 87, 80, 75, 240, 82, 144, 143, 233, 206, - 284, -583, -583, -583, -583, -583, -583, -583, 34, -583, - 279, 82, 54, -583, -583, 2411, -583, -583, 285, 2561, - 48, -583, -583, -583, -583, -583, -583, 305, 113, -583, - 94, 285, 95, 285, 336, -583, -583, 1361, 320, -583, - -583, -583, -583, -583, 213, -583, -583, 348, 354, -583, - 356, 358, -583, -583, 372, -583, -583, -583, -583, 2861, - 381, -583, -583, -583, -583, 2111, -583, -583, 2561, 2561, - 2561, 383, 385, -583, -583, -583, -583, 388, -583, -583, - -583, -583, -583, 397, 2861, 2861, 139, 393, -583, 445, - -583, 67, -583, -583, -583, -583, 449, -583, 116, 463, - -583, 330, -583, -583, 483, -583, 485, -583, 488, -583, - -583, -583, -583, -583, 225, 65, 216, -583, -583, -583, - -583, -583, 28, -583, 328, -583, -583, -583, -583, 53, - -583, -583, -583, -583, -583, -583, -583, 427, -583, 362, - -583, -583, 342, 64, 64, 408, -583, -583, -583, 175, - 492, 517, 279, -583, 447, 497, 507, 336, 17, 451, - 532, 534, 537, 38, -583, -583, -583, 2561, 46, 240, - 240, 911, -583, 2561, 911, -583, 301, -583, 448, 342, - -583, -583, -583, 538, 2561, 2561, 240, -583, -583, 45, - -583, 447, 2561, -583, -583, -583, -583, 1511, 240, 541, - 429, 2561, 2561, 544, 2711, 2711, 2711, 2711, 2711, 2711, - 2711, 2711, 2711, -583, 527, 2561, -583, -583, 439, 17, - 17, -583, 17, -583, 2561, -583, -583, -583, -583, -583, - -583, -583, 548, -583, 530, 454, -583, -583, 373, 205, - -583, 911, 454, -583, -583, -583, 115, -583, -583, 451, - 535, 403, -583, -583, 2561, 432, -583, -583, -583, 524, - 342, 553, 2561, 2561, 2561, 611, 761, 558, 540, 558, - -583, -583, -583, -583, -583, -583, 246, 61, 509, -583, - -583, 412, 44, -583, -583, 2561, -583, -583, -583, -583, - -583, -583, -583, -583, -583, -583, -583, -583, 264, 430, - 2887, 251, 2909, 561, -3, 2561, -583, 475, 911, 478, - -583, 448, -583, 570, 342, -583, -583, 573, 2561, 556, - 576, 101, 41, 559, 506, -583, -583, -583, -583, 529, - -583, -583, 2561, -583, 435, 2561, 447, 212, 579, -583, - 597, -583, -583, -583, -583, 225, 225, 65, 65, 65, - 65, -583, -583, -583, -583, 291, 98, -583, 440, -583, - -583, -583, 319, 578, -583, -583, 572, 582, 532, 603, - -583, 456, -583, 497, -583, -583, 17, 438, -583, 607, - 2974, -583, 612, 450, 453, 39, 36, -583, -583, 207, - -583, 547, -583, 617, 2561, 193, 2261, -583, -583, -583, - -583, -583, -583, -583, 540, 911, 2561, 911, -583, 2561, - 2561, -583, -583, 57, 66, -583, 2561, -583, 616, 619, - 620, 68, -583, 526, -583, -583, 2561, 621, 45, -583, - -583, -583, 559, 312, 624, 312, 332, -583, 567, -583, - -583, -583, -583, 353, 557, 575, 602, 585, 636, -583, - 2561, 638, 639, 623, -583, -583, -583, -583, -583, 2561, - 641, -583, -583, -583, 17, 454, 2561, 625, 628, 484, - 578, -583, 650, -583, 651, -583, -583, 457, 2561, 642, - -583, -583, -583, -583, -583, -583, -583, -583, -583, -583, - -583, -583, -583, -583, -583, -583, 632, -583, 654, -583, - -583, -583, -583, -583, 1361, -583, -583, 357, 15, 2561, - 287, -583, -583, -583, -583, 558, 250, -583, 657, 412, - 621, -583, 71, 1211, 2561, -583, 655, 2561, 659, 506, - 312, -583, 640, 336, 2561, -583, 643, -583, 559, 559, - 45, 605, -583, 45, 2561, 911, 531, -583, -583, -583, - -583, -583, 536, -583, 663, -583, -583, -583, -583, 342, - -583, -583, 151, -583, 205, 465, 647, -583, -583, 468, - 342, 2561, -583, -583, 519, -583, -583, -583, -583, 33, - -583, -583, -583, -583, -583, -583, 2561, 670, 268, -583, - 2561, -583, -583, -583, -583, -583, -583, -583, -583, -583, - -583, -583, 471, 672, -583, -583, 476, 45, 404, 673, - 456, 623, 610, 648, 610, 2561, -583, -583, 67, -583, - 678, -583, -583, -583, 2561, 523, 2561, -583, 285, 477, - -583, 688, -583, 2561, -583, -583, 527, -583, 911, -583, - 506, 243, -583, -583, -583, -583, 689, -583, 662, 671, - 598, 17, 179, -583, -583, 342, -583, -583, -583, 33, - -583, 479, -583, 456, 527, 452, 312, 623, 704, 1061, - 2711, 454, -583, 703, -583, 563, -583, -583, -583, 706, - 1661, -583, -583, 527, 496, -583, -583, -583, -583, -583, - -583, 707, -583, 2863, 292, -21, -583, 17, -7, -583, - -583, 1811, 577, 574, 584, -583, -583, -57, -583, -583, - 1061, -583, -583, 680, 680, 2711, -583, -583, -583, -583, - -583, -583, 580, 581, -583, -583, 564, -583, 129, -583, - -583, 155, -583, -583, -583, 467, -583, -583, 216, -583, - -583, 1961, -583, -583, -583, -583, 589, 583, -583, -583, - -583, 588, -583, -583, -583, -583, -583 + 68, 87, 41, 103, 72, 78, 145, 147, 167, 183, + 221, -608, -608, -608, -608, -608, -608, -608, 175, -608, + 201, 78, 82, -608, -608, 2762, -608, -608, 237, 2912, + 56, -608, -608, -608, -608, -608, -608, 224, 100, -608, + 69, 237, 92, 237, 262, -608, -608, 1412, 261, -608, + -608, -608, -608, -608, 143, -608, -608, 278, 292, -608, + 315, 337, -608, -608, 367, -608, -608, -608, -608, 3212, + 371, -608, -608, -608, -608, 2312, -608, -608, 2912, 2912, + 2912, 375, 382, -608, -608, -608, -608, 388, -608, -608, + -608, -608, -608, 391, 3212, 3212, 324, 276, -608, 327, + -608, 58, -608, -608, -608, -608, 395, -608, 2, 402, + -608, 260, -608, -608, 404, -608, 408, -608, 411, -608, + -608, -608, -608, -608, 284, 164, 335, -608, -608, -608, + -608, -608, 45, -608, 255, -608, -608, -608, -608, 64, + -608, -608, -608, -608, -608, -608, -608, 348, -608, 384, + -608, -608, 267, 67, 67, 334, -608, -608, -608, 173, + 417, 445, 201, -608, 364, 435, 455, 262, 47, 396, + 496, 499, 503, 36, -608, -608, -608, 2912, 46, 72, + 72, 962, -608, 2912, 962, -608, 329, -608, 414, 267, + -608, -608, -608, 511, 2912, 2912, 72, -608, -608, 48, + -608, 364, 2912, -608, -608, -608, -608, 1562, 72, 515, + 399, 2912, 2912, 521, 3062, 3062, 3062, 3062, 3062, 3062, + 3062, 3062, 3062, -608, 527, 2912, -608, -608, 449, 47, + 47, -608, 47, -608, 2912, -608, -608, -608, -608, -608, + -608, -608, 551, -608, 560, 498, -608, -608, 425, 238, + -608, 962, 498, -608, -608, -608, 308, -608, -608, 396, + 579, 441, -608, -608, 2912, 457, -608, -608, -608, 574, + 267, 602, 2912, 2912, 2912, 662, 812, 604, 585, 604, + -608, -608, -608, -608, -608, -608, 169, 182, 553, -608, + -608, 460, 55, -608, -608, 2912, -608, -608, -608, -608, + -608, -608, -608, -608, -608, -608, -608, -608, 193, 376, + 3238, 139, 3260, 613, 5, 2912, -608, 514, 962, 525, + -608, 414, -608, 615, 267, -608, -608, 619, 2912, 596, + 622, 90, 54, 611, 580, -608, -608, -608, -608, 575, + -608, -608, 2912, -608, 479, 2912, 364, 235, 624, -608, + 634, -608, -608, -608, -608, 284, 284, 164, 164, 164, + 164, -608, -608, -608, -608, 281, 74, -608, 475, -608, + -608, -608, 358, 618, -608, -608, 614, 625, 496, 642, + -608, 500, -608, 435, -608, -608, 47, 483, -608, 645, + 480, -608, 646, 492, 505, 59, 35, -608, -608, 222, + -608, 583, -608, 650, 2912, 218, 2462, -608, -608, -608, + -608, -608, -608, -608, 585, 962, 2912, 962, -608, 2912, + 2912, -608, -608, 229, 79, -608, 2912, -608, 649, 651, + 652, 81, -608, 559, -608, -608, 2912, 656, 48, -608, + -608, -608, 611, 349, 659, 349, 370, -608, 603, -608, + -608, -608, -608, 380, 594, 606, 636, 621, 665, -608, + 2912, 668, 669, 653, -608, -608, -608, -608, -608, 2912, + 672, -608, -608, -608, 47, 498, 2912, 654, 655, 516, + 618, -608, 684, -608, 683, -608, -608, 509, 2912, 677, + -608, -608, -608, -608, -608, -608, -608, -608, -608, -608, + -608, -608, -608, -608, -608, -608, 666, -608, 689, -608, + -608, -608, -608, -608, 1412, -608, -608, 300, 18, 2912, + 409, -608, -608, -608, -608, 604, 2612, -608, 691, 460, + 656, -608, 89, 1262, 2912, -608, 690, 2912, 694, 580, + 349, -608, 675, 262, 2912, -608, 676, -608, 611, 611, + 48, 643, -608, 48, 2912, 962, 565, -608, -608, -608, + -608, -608, 568, -608, 702, -608, -608, -608, -608, 267, + -608, -608, 502, -608, 238, 523, 685, -608, -608, 549, + 267, 2912, -608, -608, 555, -608, -608, -608, -608, 1712, + 605, 698, 755, -608, -608, -608, 267, 2912, 706, 258, + -608, 2912, -608, -608, -608, -608, -608, -608, -608, -608, + -608, -608, -608, 554, 710, -608, -608, 570, 48, 352, + 709, 500, 653, 644, 681, 644, 2912, 57, -608, -608, + -608, -608, -608, 58, -608, 713, -608, -608, -608, 2912, + 552, 2912, 415, 3212, 120, 557, -608, -608, 714, -608, + 2912, -608, -608, 527, -608, 962, -608, 580, 285, -608, + -608, -608, -608, 715, -608, 692, 687, 626, 47, 140, + -608, -608, -608, 267, -608, 237, 237, -608, 57, -608, + 561, -608, 500, 527, 522, 349, 653, 721, 1112, 3062, + 498, -608, 724, -608, 586, -608, -608, -608, 722, 1862, + -608, -608, -608, -608, 527, 567, -608, -608, -608, -608, + -608, -608, 728, -608, 174, 283, 211, -608, 47, -7, + -608, -608, 2012, 600, 607, 612, -608, -608, -49, -608, + -608, 1112, -608, -608, 707, 707, 3062, -608, -608, -608, + -608, -608, -608, 610, 616, -608, -608, 592, -608, -20, + -608, -608, 177, -608, -608, -608, 537, -608, -608, 335, + -608, -608, 2162, -608, -608, -608, -608, 628, 623, -608, + -608, -608, 627, -608, -608, -608, -608, -608 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1262,134 +1263,135 @@ static const yytype_int16 yydefact[] = 0, 25, 0, 0, 79, 107, 0, 0, 0, 2, 4, 63, 6, 62, 59, 60, 90, 61, 64, 26, 0, 107, 0, 80, 81, 0, 109, 108, 0, 0, - 10, 1, 3, 5, 68, 66, 67, 341, 0, 34, - 0, 0, 0, 0, 42, 423, 422, 0, 0, 470, - 206, 203, 204, 205, 436, 241, 238, 0, 0, 218, - 0, 0, 217, 243, 0, 242, 239, 219, 442, 0, - 0, 397, 399, 398, 240, 0, 202, 419, 0, 0, - 0, 0, 0, 272, 273, 276, 277, 0, 325, 326, - 327, 328, 228, 0, 0, 0, 441, 98, 343, 92, - 199, 215, 371, 214, 222, 372, 0, 223, 221, 0, - 376, 279, 263, 264, 0, 265, 0, 266, 0, 374, - 378, 379, 380, 384, 388, 391, 411, 403, 396, 404, - 405, 413, 211, 412, 414, 416, 420, 415, 201, 369, - 438, 373, 375, 445, 446, 447, 216, 0, 441, 0, - 75, 77, 78, 0, 0, 8, 11, 12, 342, 0, + 10, 1, 3, 5, 68, 66, 67, 344, 0, 34, + 0, 0, 0, 0, 42, 426, 425, 0, 0, 473, + 209, 206, 207, 208, 439, 244, 241, 0, 0, 221, + 0, 0, 220, 246, 0, 245, 242, 222, 445, 0, + 0, 400, 402, 401, 243, 0, 205, 422, 0, 0, + 0, 0, 0, 275, 276, 279, 280, 0, 328, 329, + 330, 331, 231, 0, 0, 0, 444, 98, 346, 92, + 202, 218, 374, 217, 225, 375, 0, 226, 224, 0, + 379, 282, 266, 267, 0, 268, 0, 269, 0, 377, + 381, 382, 383, 387, 391, 394, 414, 406, 399, 407, + 408, 416, 214, 415, 417, 419, 423, 418, 204, 372, + 441, 376, 378, 448, 449, 450, 219, 0, 444, 0, + 75, 77, 78, 0, 0, 8, 11, 12, 345, 0, 0, 0, 0, 35, 87, 0, 0, 42, 0, 0, - 0, 0, 0, 0, 469, 437, 440, 0, 79, 79, - 79, 57, 383, 0, 57, 468, 464, 461, 0, 0, - 400, 402, 401, 0, 0, 0, 79, 382, 381, 110, - 89, 87, 0, 209, 210, 208, 207, 0, 79, 0, + 0, 0, 0, 0, 472, 440, 443, 0, 79, 79, + 79, 57, 386, 0, 57, 471, 467, 464, 0, 0, + 403, 405, 404, 0, 0, 0, 79, 385, 384, 110, + 89, 87, 0, 212, 213, 211, 210, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 444, 0, 0, 421, 213, 0, 0, - 0, 443, 0, 74, 0, 15, 16, 17, 20, 21, - 19, 18, 0, 13, 0, 473, 65, 28, 0, 0, - 33, 57, 473, 88, 427, 426, 427, 424, 425, 0, - 436, 0, 39, 70, 0, 0, 198, 197, 377, 0, - 344, 0, 0, 0, 0, 57, 57, 0, 57, 0, - 166, 167, 163, 162, 165, 164, 0, 57, 138, 140, - 142, 144, 0, 131, 150, 0, 151, 175, 176, 157, - 181, 155, 186, 156, 152, 158, 153, 154, 132, 133, - 135, 136, 134, 0, 0, 0, 462, 0, 57, 464, - 450, 0, 261, 0, 467, 408, 466, 0, 0, 111, - 100, 0, 115, 0, 101, 258, 339, 338, 120, 122, - 200, 224, 0, 409, 0, 0, 0, 0, 268, 274, - 0, 260, 385, 386, 387, 389, 390, 394, 395, 392, - 393, 212, 418, 417, 439, 367, 87, 82, 0, 76, - 14, 22, 9, 0, 7, 474, 0, 0, 0, 0, - 29, 121, 69, 0, 71, 43, 0, 0, 196, 0, - 0, 233, 0, 0, 0, 0, 78, 58, 141, 0, - 194, 168, 195, 0, 0, 0, 0, 170, 173, 174, - 180, 185, 188, 189, 57, 57, 0, 57, 161, 0, - 0, 465, 449, 0, 77, 456, 0, 457, 175, 181, - 186, 0, 453, 0, 451, 267, 0, 236, 110, 114, - 113, 116, 0, 471, 434, 105, 429, 430, 0, 246, - 251, 244, 245, 250, 252, 0, 0, 124, 0, 225, - 0, 0, 0, 292, 281, 282, 259, 283, 284, 0, - 0, 275, 368, 370, 0, 473, 0, 0, 0, 478, - 475, 477, 0, 27, 30, 32, 38, 74, 0, 360, - 351, 350, 352, 353, 347, 348, 354, 349, 355, 359, - 345, 346, 356, 357, 358, 361, 364, 365, 0, 234, - 230, 231, 137, 179, 0, 184, 182, 177, 177, 0, - 0, 192, 191, 193, 160, 0, 0, 143, 0, 145, - 236, 463, 161, 57, 0, 448, 0, 0, 0, 102, - 105, 104, 0, 42, 0, 433, 0, 118, 0, 0, - 110, 0, 253, 110, 0, 57, 285, 226, 410, 232, - 280, 294, 295, 293, 269, 271, 83, 86, 84, 85, - 24, 23, 0, 476, 0, 0, 0, 363, 366, 0, - 406, 0, 172, 171, 0, 227, 190, 221, 187, 110, - 127, 129, 126, 128, 139, 130, 0, 0, 0, 455, - 0, 459, 460, 458, 454, 452, 278, 237, 235, 117, - 472, 119, 0, 40, 432, 431, 254, 110, 250, 123, - 125, 0, 44, 0, 44, 0, 481, 482, 480, 479, - 0, 72, 362, 183, 0, 178, 0, 111, 0, 0, - 147, 0, 229, 0, 159, 435, 0, 106, 57, 255, - 256, 0, 248, 257, 249, 290, 286, 288, 0, 0, - 93, 0, 297, 270, 31, 407, 169, 149, 146, 110, - 220, 0, 37, 247, 0, 335, 105, 0, 0, 57, - 0, 473, 94, 296, 300, 329, 308, 307, 309, 0, - 0, 148, 41, 0, 0, 336, 337, 334, 428, 287, - 289, 45, 46, 50, 50, 95, 99, 0, 0, 301, - 291, 0, 0, 0, 302, 310, 311, 0, 36, 340, - 57, 51, 52, 53, 53, 0, 97, 299, 331, 332, - 333, 330, 0, 0, 317, 320, 0, 319, 0, 312, - 314, 0, 298, 313, 47, 0, 49, 48, 96, 321, - 318, 0, 324, 315, 304, 305, 0, 0, 55, 56, - 54, 0, 322, 316, 306, 303, 323 + 0, 0, 0, 447, 0, 0, 424, 216, 0, 0, + 0, 446, 0, 74, 0, 15, 16, 17, 20, 21, + 19, 18, 0, 13, 0, 476, 65, 28, 0, 0, + 33, 57, 476, 88, 430, 429, 430, 427, 428, 0, + 439, 0, 39, 70, 0, 0, 201, 200, 380, 0, + 347, 0, 0, 0, 0, 57, 57, 0, 57, 0, + 169, 170, 166, 165, 168, 167, 0, 57, 138, 141, + 143, 145, 0, 131, 153, 0, 154, 178, 179, 160, + 184, 158, 189, 159, 155, 161, 156, 157, 132, 133, + 135, 136, 134, 0, 0, 0, 465, 0, 57, 467, + 453, 0, 264, 0, 470, 411, 469, 0, 0, 111, + 100, 0, 115, 0, 101, 261, 342, 341, 120, 122, + 203, 227, 0, 412, 0, 0, 0, 0, 271, 277, + 0, 263, 388, 389, 390, 392, 393, 397, 398, 395, + 396, 215, 421, 420, 442, 370, 87, 82, 0, 76, + 14, 22, 9, 0, 7, 477, 0, 0, 0, 0, + 29, 121, 69, 0, 71, 43, 0, 0, 199, 0, + 0, 236, 0, 0, 0, 0, 78, 58, 142, 0, + 197, 171, 198, 0, 0, 0, 0, 173, 176, 177, + 183, 188, 191, 192, 57, 57, 0, 57, 164, 0, + 0, 468, 452, 0, 77, 459, 0, 460, 178, 184, + 189, 0, 456, 0, 454, 270, 0, 239, 110, 114, + 113, 116, 0, 474, 437, 105, 432, 433, 0, 249, + 254, 247, 248, 253, 255, 0, 0, 124, 0, 228, + 0, 0, 0, 295, 284, 285, 262, 286, 287, 0, + 0, 278, 371, 373, 0, 476, 0, 0, 0, 481, + 478, 480, 0, 27, 30, 32, 38, 74, 0, 363, + 354, 353, 355, 356, 350, 351, 357, 352, 358, 362, + 348, 349, 359, 360, 361, 364, 367, 368, 0, 237, + 233, 234, 137, 182, 0, 187, 185, 180, 180, 0, + 0, 195, 194, 196, 163, 0, 0, 144, 0, 146, + 239, 466, 164, 57, 0, 451, 0, 0, 0, 102, + 105, 104, 0, 42, 0, 436, 0, 118, 0, 0, + 110, 0, 256, 110, 0, 57, 288, 229, 413, 235, + 283, 297, 298, 296, 272, 274, 83, 86, 84, 85, + 24, 23, 0, 479, 0, 0, 0, 366, 369, 0, + 409, 0, 175, 174, 0, 230, 193, 224, 190, 110, + 127, 129, 126, 128, 139, 130, 140, 0, 0, 0, + 458, 0, 462, 463, 461, 457, 455, 281, 240, 238, + 117, 475, 119, 0, 40, 435, 434, 257, 110, 253, + 123, 125, 0, 44, 0, 44, 0, 110, 484, 127, + 129, 126, 485, 483, 482, 0, 72, 365, 186, 0, + 181, 0, 439, 111, 0, 0, 148, 150, 0, 232, + 0, 162, 438, 0, 106, 57, 258, 259, 0, 251, + 260, 252, 293, 289, 291, 0, 0, 93, 0, 300, + 273, 111, 31, 410, 172, 0, 0, 147, 110, 223, + 0, 37, 250, 0, 338, 105, 0, 0, 57, 0, + 476, 94, 299, 303, 332, 311, 310, 312, 0, 0, + 152, 151, 149, 41, 0, 0, 339, 340, 337, 431, + 290, 292, 45, 46, 50, 50, 95, 99, 0, 0, + 304, 294, 0, 0, 0, 305, 313, 314, 0, 36, + 343, 57, 51, 52, 53, 53, 0, 97, 302, 334, + 335, 336, 333, 0, 0, 320, 323, 0, 322, 0, + 315, 317, 0, 301, 316, 47, 0, 49, 48, 96, + 324, 321, 0, 327, 318, 307, 308, 0, 0, 55, + 56, 54, 0, 325, 319, 309, 306, 326 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -583, -583, -583, -583, -583, -583, -583, -583, 569, -583, - -583, -583, 147, 565, -583, 728, 58, -583, -583, -147, - 117, -583, 20, 40, 18, -583, -257, -583, 5, -583, - -583, -583, 365, -97, -248, -23, -74, 162, -583, 271, - -583, -583, -162, -583, -583, -583, -583, -583, -583, -583, - -583, 303, -484, 726, -583, -493, 416, -400, 405, -583, - -583, 177, -583, 474, 337, 340, -168, -583, -583, 89, - -582, -583, -583, -258, 473, -583, -253, 481, -583, 245, - -251, -583, -583, -250, -583, -583, -583, -583, -583, -583, - -583, -583, -252, -583, 586, 189, -583, -153, -583, -583, - -170, -583, -583, 258, 235, -583, -583, 148, -583, 333, - -583, -583, -583, -583, -583, -583, -583, -583, -583, -583, - -583, -583, -583, -277, -583, -583, -583, -583, 110, -583, - 111, -583, -583, -583, -583, -583, 83, -583, -583, -583, - -583, -583, -583, 42, -583, -583, -583, -583, -583, -583, - -583, -583, -583, -583, -583, -149, -583, -583, -583, -583, - -583, -583, -583, -583, 392, 183, 133, 289, 227, -580, - -583, -583, -583, -583, -583, 238, -148, -255, -25, -71, - -583, -583, -583, 571, 614, -26, -583, 637, 633, -583, - -409, -583, -30, -583, -583, 587, 590, -158, -129, -583, - -583, -583, -583, -583, 486, -583, 269, 618, -128, 489, - -291, -583, -583, -583, -583, -240, -583, -583, 324, -583 + -608, -608, -608, -608, -608, -608, -608, -608, 629, -608, + -608, -608, 172, 617, -608, 765, 83, -608, -608, -157, + 142, -608, 37, 62, 43, -608, -250, -608, 7, -608, + -608, -608, 413, -70, -244, -24, -73, 217, -608, 318, + -608, -608, -170, -608, -608, -608, -608, -608, -608, -608, + -608, 350, -492, 773, -523, -608, 463, -414, 450, -608, + -608, 225, -608, 524, 383, 385, -178, -608, -608, 121, + -601, -608, -608, -276, 529, -608, -269, 530, -608, 290, + -266, -608, -608, -251, -608, -608, -608, -608, -608, -608, + -608, -608, -221, -608, 599, 231, -608, -143, -608, -608, + -155, -608, -608, 289, 282, -608, -608, 192, -608, 366, + -608, -608, -608, -608, -608, -608, -608, -608, -608, -608, + -608, -608, -608, -277, -608, -608, -608, -608, 128, -608, + 150, -608, -608, -608, -608, -608, 111, -608, -608, -608, + -608, -608, -608, 76, -608, -608, -608, -608, -608, -608, + -608, -608, -608, -608, -608, -138, -608, -608, -608, -608, + -608, -608, -608, -608, 436, -61, 257, 361, 328, -607, + -608, -608, -608, -608, -608, 287, -150, -257, -25, -65, + -608, -608, -608, 620, 660, -16, -608, 673, 679, -608, + -412, -608, 53, -608, -608, 630, 640, -149, -131, -608, + -608, -608, -608, -608, 526, -608, 316, 670, -122, 531, + -292, -608, -608, -608, -608, -243, -608, -608, 377, -608 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { 0, 8, 9, 10, 245, 155, 156, 157, 242, 372, - 20, 248, 379, 39, 40, 171, 671, 261, 647, 169, - 660, 701, 702, 723, 746, 760, 286, 12, 172, 37, + 20, 248, 379, 39, 40, 171, 680, 261, 654, 169, + 667, 712, 713, 734, 757, 771, 286, 12, 172, 37, 14, 15, 265, 16, 149, 287, 151, 25, 366, 367, - 568, 17, 252, 18, 97, 681, 726, 682, 200, 201, + 568, 17, 252, 18, 97, 690, 737, 691, 200, 201, 330, 546, 547, 28, 331, 332, 333, 334, 253, 457, - 556, 594, 288, 289, 290, 291, 314, 595, 639, 640, + 556, 594, 288, 289, 290, 291, 314, 595, 645, 646, 293, 425, 294, 295, 427, 296, 297, 298, 299, 582, 300, 301, 515, 302, 303, 412, 304, 305, 413, 525, 306, 307, 98, 99, 100, 101, 226, 102, 103, 104, - 105, 106, 107, 108, 538, 109, 454, 649, 653, 455, + 105, 106, 107, 108, 538, 109, 454, 656, 660, 455, 335, 336, 110, 111, 112, 470, 113, 114, 348, 115, - 116, 117, 210, 655, 466, 467, 622, 656, 657, 658, - 468, 562, 563, 624, 689, 683, 684, 742, 690, 714, - 715, 734, 716, 735, 736, 763, 737, 118, 709, 731, - 337, 697, 338, 654, 159, 119, 269, 505, 506, 507, + 116, 117, 210, 662, 466, 467, 623, 663, 664, 665, + 468, 562, 563, 625, 698, 692, 693, 753, 699, 725, + 726, 745, 727, 746, 747, 774, 748, 118, 720, 742, + 337, 708, 338, 661, 159, 119, 269, 505, 506, 507, 508, 120, 473, 231, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 579, 343, 344, 324, 133, - 134, 135, 136, 137, 138, 44, 45, 46, 258, 675, - 445, 446, 447, 545, 176, 139, 140, 141, 672, 142, + 134, 135, 136, 137, 138, 647, 45, 46, 258, 684, + 445, 446, 447, 545, 176, 139, 140, 141, 681, 142, 143, 144, 145, 319, 320, 431, 432, 186, 187, 317, - 325, 326, 188, 146, 543, 374, 375, 480, 481, 629 + 325, 326, 188, 146, 543, 374, 375, 480, 481, 634 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1397,630 +1399,698 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 132, 185, 147, 227, 152, 13, 150, 190, 191, 192, - 262, 309, 382, 292, 309, 164, 387, 167, 393, 394, - 259, 401, 173, 312, 421, 400, 312, 402, 308, 406, - 405, 308, 310, 540, 408, 310, 410, 411, 539, 339, - 268, 260, 268, 512, 399, 163, 323, 327, -112, 416, - 152, 153, 223, 189, 189, 189, 609, -112, 316, 224, - 426, 423, 581, 349, 350, 428, 229, 429, 430, -112, - 465, -455, 263, 533, 368, 23, -159, 743, 42, 725, - 443, 309, 34, 381, 397, 235, 236, 203, 237, 204, - 24, 519, 420, 312, 35, 361, 638, 704, 308, 162, - 705, 165, 310, 474, 68, 309, 309, 395, 166, 728, - 225, 26, 403, 36, 238, 19, 160, 312, 312, 404, - 278, 165, 308, 308, 392, 528, 310, 310, 383, 531, - 439, 21, 239, 22, 219, 220, 221, 222, 704, -91, - 729, 730, 240, -91, 161, 748, -91, 29, 309, 417, - 616, 516, 270, 618, 589, 43, 311, 526, 132, 311, - 312, -455, 384, 534, 246, 308, -159, 30, 4, 310, - 50, 51, 52, 53, 205, 626, 638, 132, 241, 6, - 437, 206, -412, 27, 251, 148, 561, -91, -136, -136, - -91, 417, 698, 316, 458, 225, 417, 461, 637, -91, - 362, 590, 440, 225, 475, 225, 441, 230, 754, 152, - 329, 369, 154, 32, 271, 463, -227, 650, -91, 591, - 280, 281, 282, 283, 284, 285, 311, 519, 486, 592, - 217, 218, 593, 31, 1, 567, 464, -262, 175, 152, - 575, 150, 676, 605, 424, 309, 674, 309, 403, 4, - 396, 311, 182, 589, 380, 404, -78, 312, 76, 312, - 6, 752, 308, 753, 308, -262, 310, 444, 310, 23, - 152, 530, 418, 588, -78, 600, 598, 197, 198, 4, - 601, 4, 602, 603, 24, -78, 755, -371, 536, 612, - 378, 33, 170, 311, 756, 757, 225, 520, -371, 472, - 590, 403, 519, 38, 229, 641, -78, 1, 404, 42, - -78, 585, 558, -78, 686, 687, 368, 55, 591, -371, - 56, 564, 2, 403, 721, 477, -371, 58, 592, 688, - 643, 593, 478, 518, 158, 722, -103, 3, 548, 168, - 272, 273, 274, 541, 174, 549, -78, 352, 353, 354, - 586, 177, 60, 61, 4, -78, 63, 178, 328, 179, - 64, 180, 5, 65, 66, 6, 233, 234, -371, 342, - 345, 219, 220, 221, 222, 181, 70, 376, 377, 189, - 74, 152, 7, 524, 183, 309, 193, 620, 194, 607, - 311, 195, 311, 214, 215, 216, 611, 312, 184, 315, - 196, 152, 308, 532, 581, 449, 310, 385, 386, 450, - -78, -78, -78, -78, -78, -78, 451, 452, 225, -371, - -371, -371, -371, -371, -371, -371, -371, -371, -371, -371, - -371, -371, -371, -371, -371, 92, 388, 389, 93, 459, - 460, 706, 487, 234, 199, 448, 357, 358, 359, 360, - 202, 569, 207, -372, 510, 460, 449, 511, 460, 599, - 450, -73, -73, 152, -372, 150, 208, 451, 452, 631, - 234, 453, 633, 634, 648, 645, 460, 663, 309, 209, - 673, 668, 669, 692, 693, -372, 211, 651, 212, 580, - 312, 213, -372, 228, 152, 308, 584, 695, 696, 310, - 719, 693, 232, 685, 758, 759, 355, 356, 152, 225, - 635, 244, -379, -379, -379, -379, 247, 448, 614, 615, - 249, 254, -379, -379, -379, -379, -379, -379, 449, 580, - 311, 256, 450, 251, -372, 264, 6, -250, 266, 451, - 452, 267, 322, 453, 346, 318, 648, 448, 351, 685, - 347, 223, 370, 77, 371, 390, 189, 391, 449, 373, - 175, 399, 450, 397, 718, 415, 419, -250, 414, 451, - 452, 422, 518, 453, 435, 152, 315, 644, 436, 380, - -116, 438, 456, 444, 469, -372, -372, -372, -372, -372, - -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, - -372, 471, 479, 482, 476, 703, 483, 485, 417, 665, - 488, 152, 667, 666, 275, 513, 509, 48, 189, 49, - 514, -459, 535, 311, -460, -458, 537, 544, 550, 552, - 50, 51, 52, 53, 276, 54, 553, 554, 1, 555, - 557, 55, 559, 560, 56, 565, 703, 464, 572, 570, - 57, 58, 571, 574, 152, 576, 389, 577, 578, 606, - 277, 59, 596, 608, 610, 717, 617, 613, 625, 621, - 278, 632, 636, 623, 642, 646, 60, 61, 634, 62, - 63, 659, 664, 661, 64, 4, 738, 65, 66, 67, - -412, 279, 670, 678, 677, 152, 170, 680, 68, 69, - 70, 71, 72, 73, 74, 75, 679, 463, 707, 708, - 710, 739, 720, 741, 749, 740, 745, 751, 76, 764, - 766, 630, 750, 243, 765, 77, 738, 250, 11, 78, - 79, 80, 694, 81, 82, 83, 84, 85, 86, 87, - 744, 662, 747, 484, 724, 566, 542, 41, 442, 627, - 398, 462, 527, 88, 89, 90, 91, 529, 691, 92, - 407, 628, 93, 583, 275, 597, 652, 48, 409, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 587, 148, - 50, 51, 52, 53, 397, 54, 551, 699, 340, 700, - 727, 55, 619, 762, 56, -58, 517, 313, 255, 363, - 57, 58, 604, 257, 573, 0, 321, 434, 433, 0, - 277, 59, 0, 0, 0, 0, 0, 365, 0, 364, - 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 279, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, + 132, 227, 185, 292, 152, 150, 44, 13, 182, 382, + 259, 406, 147, 190, 191, 192, 393, 394, 408, 262, + 387, 410, 173, 421, 539, 164, 309, 167, 401, 309, + 540, 339, 312, 197, 198, 312, 411, 405, 308, 268, + 268, 308, 426, 310, 323, 327, 310, 163, 610, 428, + 152, -112, 429, 189, 189, 189, 400, 399, 402, 153, + 416, 349, 350, 512, 316, 581, 644, 430, 423, 223, + 465, 260, -112, 381, 162, 23, 224, 229, 203, 474, + 204, 42, 716, 368, -458, 754, 533, 715, 235, 236, + 24, 237, 21, 361, -162, 1, 309, 395, 165, 263, + 420, 23, 312, 160, 644, 166, 42, 26, 308, 739, + 2, 443, 763, 310, 764, 19, 24, 238, 225, 439, + 309, 309, 392, -265, 528, 3, 312, 312, 531, 759, + 715, 161, 308, 308, 68, 239, 617, 310, 310, 619, + 740, 741, 4, 4, -78, 240, -230, 225, 29, 675, + 5, -265, 270, 6, 6, 644, 311, 417, 132, 311, + 251, 22, -78, 309, 526, 205, 246, 31, 175, 312, + 7, 30, 206, -78, -458, 308, 534, 132, 437, 27, + 310, 241, 516, 43, -162, -415, 561, -136, -136, 384, + 32, 440, 458, 709, -78, 461, 475, -77, -78, 316, + 362, -78, 225, 225, 657, 397, 732, 417, -77, 152, + 369, 417, 225, 329, 271, 148, -374, 733, 230, 441, + 154, 676, 671, 34, 403, 38, 311, -374, 33, -77, + 765, 404, 567, -77, -78, 35, -77, 486, 463, 152, + 150, 278, 606, -78, 575, 424, 685, 4, -374, 1, + 396, 311, 519, 158, 36, -374, 380, 601, 6, 464, + 309, 42, 309, 519, 602, 168, 312, 603, 312, 530, + 152, 418, 308, 403, 308, 695, 696, 310, -77, 310, + 404, 177, 604, 599, 403, 174, 536, 613, 683, 472, + 697, 404, 519, 311, 229, 178, 4, -374, -78, -78, + -78, -78, -78, -78, 588, 648, 225, 170, 766, 444, + 558, 736, 4, 403, 165, 732, 767, 768, 179, 564, + 650, 383, 520, 378, -91, 368, 733, 199, -91, 217, + 218, -91, 202, -77, -77, -77, -77, -77, -77, 518, + 180, 280, 281, 282, 283, 284, 285, 581, -374, -374, + -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, + -374, -374, -374, -374, 477, 586, 219, 220, 221, 222, + 181, 478, -91, -103, 183, -91, 548, 621, 193, 189, + 541, 152, 524, 549, -91, 194, 612, 608, 233, 234, + 311, 195, 311, 448, 196, 272, 273, 274, 207, -375, + 309, 152, 532, -91, 449, 208, 312, 211, 450, 209, + -375, 212, 308, 328, 213, 451, 452, 310, -230, 453, + 228, 165, 655, 232, 342, 345, 184, 315, 166, 376, + 377, -375, 449, 585, 225, 658, 450, 244, -375, 55, + 175, 247, 56, 451, 452, 385, 386, 717, 249, 58, + 251, 569, 214, 215, 216, -382, -382, -382, -382, 254, + 600, 388, 389, 152, 150, -382, -382, -382, -382, -382, + -382, 352, 353, 354, 60, 61, 670, 682, 63, 256, + -375, 6, 64, 459, 460, 65, 66, 487, 234, 580, + 219, 220, 221, 222, 152, 584, 510, 460, 70, 264, + 309, 596, 74, 266, 489, 627, 312, 267, 152, 511, + 460, 318, 308, -73, -73, 322, 640, 310, 346, 694, + 347, 50, 51, 52, 53, 351, 628, 636, 234, 580, + 311, -375, -375, -375, -375, -375, -375, -375, -375, -375, + -375, -375, -375, -375, -375, -375, -375, 357, 358, 359, + 360, 223, 629, 638, 639, 370, 189, 92, 652, 460, + 93, 677, 678, 77, 173, 703, 704, 706, 707, 694, + 630, 730, 704, 729, 769, 770, 152, 651, 355, 356, + 631, 380, 197, 593, 371, 518, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 615, 616, 373, 175, 390, 391, 399, 397, 76, + 422, 448, 414, 415, 673, 714, 152, 674, 419, 435, + -116, 448, 449, 315, 436, 189, 450, 438, 456, 469, + 311, -253, 449, 451, 452, 444, 450, 453, 471, 476, + 655, -253, 479, 451, 452, 482, 485, 453, 488, 483, + 509, 513, 417, 514, -462, 535, -463, -461, 714, 700, + 701, 537, 544, 152, 550, 275, 552, 553, 48, 557, + 49, 554, 559, 560, 728, 555, 565, 464, 570, 571, + 572, 50, 51, 52, 53, 276, 54, 574, 389, 1, + 576, 577, 55, 578, 607, 56, 597, 749, 609, 611, + 614, 57, 58, 622, 618, 624, 152, 626, 641, 637, + 649, 277, 59, 653, 639, 666, 668, 672, 679, -415, + 686, 278, 688, 687, 463, 689, 721, 60, 61, 718, + 62, 63, 719, 731, 750, 64, 4, 749, 65, 66, + 67, 752, 279, 756, 760, 762, 635, 170, 751, 68, + 69, 70, 71, 72, 73, 74, 75, 761, 775, 777, + -221, -221, -221, -221, 776, 11, 705, 669, 755, 76, + -221, -221, -221, -221, -221, -221, 77, 735, 758, 250, + 78, 79, 80, 243, 81, 82, 83, 84, 85, 86, + 87, 484, 566, 542, 41, 442, 462, 632, 527, 702, + 398, 340, 529, 633, 88, 89, 90, 91, 583, 587, + 92, 659, 598, 93, 710, 275, 407, 409, 48, 551, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 738, + 148, 50, 51, 52, 53, 397, 54, 711, 773, 257, + 517, 620, 55, 313, 255, 56, -58, 434, 363, 605, + 433, 57, 58, -220, -220, -220, -220, 573, 321, 0, + 365, 277, 59, -220, -220, -220, -220, -220, -220, 364, + 0, 278, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 279, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + -222, -222, -222, -222, 0, 0, 0, 0, 0, 76, + -222, -222, -222, -222, -222, -222, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 275, 0, 0, 48, 0, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, + 148, 50, 51, 52, 53, 276, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 277, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 279, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, + 148, 50, 51, 52, 53, 397, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 277, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 279, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, + 148, 50, 51, 52, 53, 397, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 1, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 4, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 170, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 341, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 23, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 642, 0, 0, 1, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 4, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 170, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 643, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 722, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 723, 0, 0, 0, 0, + 0, 0, 724, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 743, 0, 0, 0, 0, + 0, 0, 744, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 772, 0, 0, 0, 0, + 0, 0, 744, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 521, 522, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 523, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 589, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 590, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 591, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 592, 0, 0, 593, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 96, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 0, 0, 0, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 275, 0, 0, 48, 0, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, - 50, 51, 52, 53, 276, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 277, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 279, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, + 0, 0, 0, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, -377, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -377, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, -376, 0, 64, 0, 0, 65, 66, + 67, 0, 0, -377, -376, 0, 0, 0, 0, 68, + -377, 70, 0, 0, 0, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, -376, 0, 0, 0, 76, + 0, 0, -376, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 82, 83, 84, 85, 86, + 87, 0, -377, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, - 50, 51, 52, 53, 397, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 277, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 279, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, - 50, 51, 52, 53, 397, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 1, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 4, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 170, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 341, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 23, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 24, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 711, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 712, 0, 0, 0, 0, 0, - 0, 713, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 732, 0, 0, 0, 0, 0, - 0, 733, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 761, 0, 0, 0, 0, 0, - 0, 733, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 184, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 521, 522, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 523, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 96, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 0, 0, 0, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, -77, 0, 0, 0, - 0, 55, 0, 0, 56, 721, 0, -77, 0, 0, - 57, 58, 0, 0, 0, 0, 722, 0, 0, 0, - -374, 59, 0, 0, 0, 0, 0, 0, -77, 0, - 0, -374, -77, 0, 0, -77, 60, 61, 0, 62, - 63, 0, -373, 0, 64, 0, 0, 65, 66, 67, - 0, 0, -374, -373, 0, 0, 0, 0, 68, -374, - 70, 0, 0, 0, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, -373, 0, 0, -77, 76, 0, - 0, -373, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 81, 82, 83, 84, 85, 86, 87, - 0, -374, 0, 0, 0, 0, 0, 0, 489, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, -373, 0, 0, 0, 0, 0, 0, - 0, 0, -77, -77, -77, -77, -77, -77, 0, 148, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -374, -374, -374, -374, -374, -374, -374, -374, - -374, -374, -374, -374, -374, -374, -374, -374, 0, 0, - 0, 0, 0, 0, -373, -373, -373, -373, -373, -373, - -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, - 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504 + 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -377, -377, -377, -377, -377, -377, -377, + -377, -377, -377, -377, -377, -377, -377, -377, -377, 0, + 0, 0, 0, 0, 0, -376, -376, -376, -376, -376, + -376, -376, -376, -376, -376, -376, -376, -376, -376, -376, + -376 }; static const yytype_int16 yycheck[] = { - 25, 75, 28, 132, 29, 0, 29, 78, 79, 80, - 168, 181, 252, 181, 184, 41, 264, 43, 273, 274, - 167, 278, 47, 181, 315, 277, 184, 279, 181, 287, - 287, 184, 181, 442, 287, 184, 287, 287, 438, 201, - 4, 24, 4, 4, 3, 40, 194, 195, 3, 5, - 75, 3, 24, 78, 79, 80, 540, 24, 186, 31, - 318, 318, 47, 211, 212, 318, 13, 318, 318, 24, - 347, 5, 169, 5, 232, 29, 5, 134, 24, 100, - 332, 251, 48, 251, 23, 21, 22, 20, 24, 22, - 44, 34, 95, 251, 60, 224, 589, 679, 251, 5, - 680, 6, 251, 5, 87, 275, 276, 275, 13, 116, - 167, 29, 55, 79, 50, 28, 3, 275, 276, 62, - 59, 6, 275, 276, 272, 416, 275, 276, 13, 420, - 29, 51, 68, 58, 155, 156, 157, 158, 720, 0, - 147, 148, 78, 4, 31, 725, 7, 3, 318, 152, - 550, 403, 177, 553, 3, 101, 181, 414, 183, 184, - 318, 95, 259, 95, 159, 318, 95, 24, 74, 318, - 19, 20, 21, 22, 107, 24, 669, 202, 114, 85, - 328, 114, 167, 101, 86, 168, 463, 48, 152, 153, - 51, 152, 676, 321, 342, 167, 152, 345, 165, 60, - 225, 50, 101, 167, 366, 167, 165, 154, 53, 234, - 165, 234, 164, 7, 168, 3, 3, 617, 79, 68, - 159, 160, 161, 162, 163, 164, 251, 34, 386, 78, - 165, 166, 81, 0, 27, 475, 24, 121, 25, 264, - 488, 264, 651, 534, 318, 415, 3, 417, 55, 74, - 275, 276, 69, 3, 249, 62, 5, 415, 107, 417, - 85, 132, 415, 134, 417, 149, 415, 24, 417, 29, - 295, 419, 295, 525, 23, 533, 533, 94, 95, 74, - 533, 74, 533, 533, 44, 34, 131, 23, 436, 544, - 85, 7, 85, 318, 139, 140, 167, 104, 34, 8, - 50, 55, 34, 24, 13, 596, 55, 27, 62, 24, - 59, 24, 460, 62, 135, 136, 474, 30, 68, 55, - 33, 469, 42, 55, 32, 6, 62, 40, 78, 150, - 62, 81, 13, 404, 29, 43, 24, 57, 6, 3, - 178, 179, 180, 31, 24, 13, 95, 214, 215, 216, - 520, 3, 65, 66, 74, 104, 69, 3, 196, 3, - 73, 3, 82, 76, 77, 85, 4, 5, 104, 207, - 208, 155, 156, 157, 158, 3, 89, 4, 5, 404, - 93, 406, 102, 406, 3, 555, 3, 555, 3, 537, - 415, 3, 417, 168, 169, 170, 543, 555, 97, 98, - 3, 426, 555, 426, 47, 52, 555, 4, 5, 56, - 159, 160, 161, 162, 163, 164, 63, 64, 167, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 148, 4, 5, 151, 4, - 5, 681, 4, 5, 51, 41, 219, 220, 221, 222, - 5, 476, 3, 23, 4, 5, 52, 4, 5, 533, - 56, 4, 5, 488, 34, 488, 3, 63, 64, 4, - 5, 67, 4, 5, 70, 4, 5, 625, 648, 149, - 648, 4, 5, 4, 5, 55, 3, 83, 3, 514, - 648, 3, 62, 165, 519, 648, 519, 45, 46, 648, - 4, 5, 75, 661, 37, 38, 217, 218, 533, 167, - 581, 103, 155, 156, 157, 158, 24, 41, 548, 549, - 3, 24, 165, 166, 167, 168, 169, 170, 52, 554, - 555, 24, 56, 86, 104, 3, 85, 61, 4, 63, - 64, 4, 4, 67, 3, 97, 70, 41, 4, 707, - 121, 24, 4, 114, 24, 31, 581, 4, 52, 105, - 25, 3, 56, 23, 693, 153, 5, 61, 59, 63, - 64, 96, 643, 67, 4, 600, 98, 600, 5, 574, - 24, 5, 53, 24, 5, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 4, 24, 31, 164, 679, 24, 4, 152, 634, - 3, 636, 638, 636, 3, 68, 4, 6, 643, 8, - 3, 5, 96, 648, 5, 5, 5, 3, 61, 72, - 19, 20, 21, 22, 23, 24, 61, 35, 27, 54, - 4, 30, 4, 4, 33, 4, 720, 24, 164, 24, - 39, 40, 24, 3, 679, 13, 5, 25, 4, 4, - 49, 50, 5, 4, 24, 690, 61, 24, 5, 138, - 59, 24, 153, 137, 4, 3, 65, 66, 5, 68, - 69, 71, 4, 35, 73, 74, 711, 76, 77, 78, - 167, 80, 4, 31, 5, 720, 85, 99, 87, 88, - 89, 90, 91, 92, 93, 94, 35, 3, 5, 146, - 4, 134, 5, 129, 134, 141, 36, 153, 107, 130, - 132, 574, 141, 154, 141, 114, 751, 162, 0, 118, - 119, 120, 674, 122, 123, 124, 125, 126, 127, 128, - 720, 624, 724, 378, 704, 474, 443, 21, 332, 572, - 276, 346, 415, 142, 143, 144, 145, 417, 669, 148, - 287, 572, 151, 518, 3, 530, 618, 6, 287, 8, - 159, 160, 161, 162, 163, 164, 165, 166, 520, 168, - 19, 20, 21, 22, 23, 24, 453, 677, 202, 678, - 707, 30, 554, 751, 33, 34, 404, 183, 165, 228, - 39, 40, 533, 166, 480, -1, 188, 321, 319, -1, - 49, 50, -1, -1, -1, -1, -1, 230, -1, 229, - 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, 80, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, - 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - 49, 50, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, 80, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, - 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - 49, 50, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, 80, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, - 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, 27, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, 74, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, 85, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, 4, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - 29, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, 44, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, 34, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, 133, -1, -1, -1, -1, -1, - -1, 140, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, 133, -1, -1, -1, -1, -1, - -1, 140, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, 133, -1, -1, -1, -1, -1, - -1, 140, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, 97, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - 29, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, -1, -1, -1, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 122, 123, 124, 125, 126, 127, 128, + 25, 132, 75, 181, 29, 29, 22, 0, 69, 252, + 167, 287, 28, 78, 79, 80, 273, 274, 287, 168, + 264, 287, 47, 315, 438, 41, 181, 43, 278, 184, + 442, 201, 181, 94, 95, 184, 287, 287, 181, 4, + 4, 184, 318, 181, 194, 195, 184, 40, 540, 318, + 75, 3, 318, 78, 79, 80, 277, 3, 279, 3, + 5, 211, 212, 4, 186, 47, 589, 318, 318, 24, + 347, 24, 24, 251, 5, 29, 31, 13, 20, 5, + 22, 24, 689, 232, 5, 134, 5, 688, 21, 22, + 44, 24, 51, 224, 5, 27, 251, 275, 6, 169, + 95, 29, 251, 3, 627, 13, 24, 29, 251, 116, + 42, 332, 132, 251, 134, 28, 44, 50, 167, 29, + 275, 276, 272, 121, 416, 57, 275, 276, 420, 736, + 731, 31, 275, 276, 87, 68, 550, 275, 276, 553, + 147, 148, 74, 74, 5, 78, 3, 167, 3, 29, + 82, 149, 177, 85, 85, 678, 181, 152, 183, 184, + 86, 58, 23, 318, 414, 107, 159, 0, 25, 318, + 102, 24, 114, 34, 95, 318, 95, 202, 328, 101, + 318, 114, 403, 101, 95, 167, 463, 152, 153, 259, + 7, 101, 342, 685, 55, 345, 366, 23, 59, 321, + 225, 62, 167, 167, 618, 23, 32, 152, 34, 234, + 234, 152, 167, 165, 168, 168, 23, 43, 154, 165, + 164, 101, 165, 48, 55, 24, 251, 34, 7, 55, + 53, 62, 475, 59, 95, 60, 62, 386, 3, 264, + 264, 59, 534, 104, 488, 318, 658, 74, 55, 27, + 275, 276, 34, 29, 79, 62, 249, 533, 85, 24, + 415, 24, 417, 34, 533, 3, 415, 533, 417, 419, + 295, 295, 415, 55, 417, 135, 136, 415, 104, 417, + 62, 3, 533, 533, 55, 24, 436, 544, 3, 8, + 150, 62, 34, 318, 13, 3, 74, 104, 159, 160, + 161, 162, 163, 164, 525, 597, 167, 85, 131, 24, + 460, 100, 74, 55, 6, 32, 139, 140, 3, 469, + 62, 13, 104, 85, 0, 474, 43, 51, 4, 165, + 166, 7, 5, 159, 160, 161, 162, 163, 164, 404, + 3, 159, 160, 161, 162, 163, 164, 47, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 6, 520, 155, 156, 157, 158, + 3, 13, 48, 24, 3, 51, 6, 555, 3, 404, + 31, 406, 406, 13, 60, 3, 543, 537, 4, 5, + 415, 3, 417, 41, 3, 178, 179, 180, 3, 23, + 555, 426, 426, 79, 52, 3, 555, 3, 56, 149, + 34, 3, 555, 196, 3, 63, 64, 555, 3, 67, + 165, 6, 70, 75, 207, 208, 97, 98, 13, 4, + 5, 55, 52, 24, 167, 83, 56, 103, 62, 30, + 25, 24, 33, 63, 64, 4, 5, 690, 3, 40, + 86, 476, 168, 169, 170, 155, 156, 157, 158, 24, + 533, 4, 5, 488, 488, 165, 166, 167, 168, 169, + 170, 214, 215, 216, 65, 66, 626, 655, 69, 24, + 104, 85, 73, 4, 5, 76, 77, 4, 5, 514, + 155, 156, 157, 158, 519, 519, 4, 5, 89, 3, + 655, 526, 93, 4, 24, 3, 655, 4, 533, 4, + 5, 97, 655, 4, 5, 4, 581, 655, 3, 668, + 121, 19, 20, 21, 22, 4, 24, 4, 5, 554, + 555, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 219, 220, 221, + 222, 24, 50, 4, 5, 4, 581, 148, 4, 5, + 151, 4, 5, 114, 589, 4, 5, 45, 46, 718, + 68, 4, 5, 704, 37, 38, 601, 601, 217, 218, + 78, 574, 643, 81, 24, 650, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 548, 549, 105, 25, 31, 4, 3, 23, 107, + 96, 41, 59, 153, 639, 688, 641, 641, 5, 4, + 24, 41, 52, 98, 5, 650, 56, 5, 53, 5, + 655, 61, 52, 63, 64, 24, 56, 67, 4, 164, + 70, 61, 24, 63, 64, 31, 4, 67, 3, 24, + 4, 68, 152, 3, 5, 96, 5, 5, 731, 675, + 676, 5, 3, 688, 61, 3, 72, 61, 6, 4, + 8, 35, 4, 4, 699, 54, 4, 24, 24, 24, + 164, 19, 20, 21, 22, 23, 24, 3, 5, 27, + 13, 25, 30, 4, 4, 33, 5, 722, 4, 24, + 24, 39, 40, 138, 61, 137, 731, 5, 153, 24, + 4, 49, 50, 3, 5, 71, 35, 4, 4, 167, + 5, 59, 35, 31, 3, 99, 4, 65, 66, 5, + 68, 69, 146, 5, 134, 73, 74, 762, 76, 77, + 78, 129, 80, 36, 134, 153, 574, 85, 141, 87, + 88, 89, 90, 91, 92, 93, 94, 141, 130, 132, + 155, 156, 157, 158, 141, 0, 683, 625, 731, 107, + 165, 166, 167, 168, 169, 170, 114, 715, 735, 162, + 118, 119, 120, 154, 122, 123, 124, 125, 126, 127, + 128, 378, 474, 443, 21, 332, 346, 572, 415, 678, + 276, 202, 417, 572, 142, 143, 144, 145, 518, 520, + 148, 619, 530, 151, 686, 3, 287, 287, 6, 453, + 8, 159, 160, 161, 162, 163, 164, 165, 166, 718, + 168, 19, 20, 21, 22, 23, 24, 687, 762, 166, + 404, 554, 30, 183, 165, 33, 34, 321, 228, 533, + 319, 39, 40, 155, 156, 157, 158, 480, 188, -1, + 230, 49, 50, 165, 166, 167, 168, 169, 170, 229, + -1, 59, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, 80, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + 155, 156, 157, 158, -1, -1, -1, -1, -1, 107, + 165, 166, 167, 168, 169, 170, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 19, 20, 21, 22, 23, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, 49, 50, -1, -1, -1, -1, -1, -1, -1, + -1, 59, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, 80, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 19, 20, 21, 22, 23, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, 49, 50, -1, -1, -1, -1, -1, -1, -1, + -1, 59, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, 80, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 19, 20, 21, 22, 23, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, 59, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, 27, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, 74, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, 85, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, 4, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, 29, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, 44, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, 27, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, 74, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, 85, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, 34, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, 133, -1, -1, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, 133, -1, -1, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, 133, -1, -1, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, 97, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, 29, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, 81, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, -1, -1, -1, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, 23, -1, -1, -1, - -1, 30, -1, -1, 33, 32, -1, 34, -1, -1, - 39, 40, -1, -1, -1, -1, 43, -1, -1, -1, - 23, 50, -1, -1, -1, -1, -1, -1, 55, -1, - -1, 34, 59, -1, -1, 62, 65, 66, -1, 68, - 69, -1, 23, -1, 73, -1, -1, 76, 77, 78, - -1, -1, 55, 34, -1, -1, -1, -1, 87, 62, - 89, -1, -1, -1, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, 55, -1, -1, 104, 107, -1, - -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 122, 123, 124, 125, 126, 127, 128, - -1, 104, -1, -1, -1, -1, -1, -1, 24, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, 104, -1, -1, -1, -1, -1, -1, - -1, -1, 159, 160, 161, 162, 163, 164, -1, 168, + -1, -1, -1, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, 23, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 34, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, 23, -1, 73, -1, -1, 76, 77, + 78, -1, -1, 55, 34, -1, -1, -1, -1, 87, + 62, 89, -1, -1, -1, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, 55, -1, -1, -1, 107, + -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 122, 123, 124, 125, 126, 127, + 128, -1, 104, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, -1, -1, - -1, -1, -1, -1, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120 + 168, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, -1, + -1, -1, -1, -1, -1, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of @@ -2086,24 +2156,25 @@ static const yytype_int16 yystos[] = 4, 296, 304, 305, 349, 4, 212, 388, 213, 351, 24, 24, 164, 391, 3, 207, 13, 25, 4, 348, 351, 47, 252, 252, 208, 24, 273, 276, 265, 3, - 50, 68, 78, 81, 234, 240, 5, 277, 199, 209, - 246, 249, 253, 256, 379, 383, 4, 349, 4, 225, - 24, 192, 350, 24, 365, 365, 230, 61, 230, 348, - 239, 138, 299, 137, 306, 5, 24, 234, 268, 392, - 185, 4, 24, 4, 5, 352, 153, 165, 228, 241, - 242, 383, 4, 62, 208, 4, 3, 191, 70, 280, - 230, 83, 280, 281, 326, 296, 300, 301, 302, 71, - 193, 35, 193, 349, 4, 351, 208, 358, 4, 5, - 4, 189, 371, 239, 3, 362, 363, 5, 31, 35, - 99, 218, 220, 308, 309, 370, 135, 136, 150, 307, - 311, 242, 4, 5, 189, 45, 46, 324, 225, 301, - 303, 194, 195, 209, 243, 342, 388, 5, 146, 321, - 4, 34, 133, 140, 312, 313, 315, 351, 371, 4, - 5, 32, 43, 196, 196, 100, 219, 309, 116, 147, - 148, 322, 133, 140, 314, 316, 317, 319, 351, 134, - 141, 129, 310, 134, 195, 36, 197, 197, 342, 134, - 141, 153, 132, 134, 53, 131, 139, 140, 37, 38, - 198, 133, 316, 318, 130, 141, 132 + 50, 68, 78, 81, 234, 240, 351, 5, 277, 199, + 209, 246, 249, 253, 256, 379, 383, 4, 349, 4, + 225, 24, 192, 350, 24, 365, 365, 230, 61, 230, + 348, 239, 138, 299, 137, 306, 5, 3, 24, 50, + 68, 78, 234, 268, 392, 185, 4, 24, 4, 5, + 352, 153, 24, 165, 227, 241, 242, 358, 383, 4, + 62, 208, 4, 3, 191, 70, 280, 230, 83, 280, + 281, 326, 296, 300, 301, 302, 71, 193, 35, 193, + 349, 165, 4, 351, 208, 29, 101, 4, 5, 4, + 189, 371, 239, 3, 362, 363, 5, 31, 35, 99, + 218, 220, 308, 309, 370, 135, 136, 150, 307, 311, + 358, 358, 242, 4, 5, 189, 45, 46, 324, 225, + 301, 303, 194, 195, 209, 243, 342, 388, 5, 146, + 321, 4, 34, 133, 140, 312, 313, 315, 351, 371, + 4, 5, 32, 43, 196, 196, 100, 219, 309, 116, + 147, 148, 322, 133, 140, 314, 316, 317, 319, 351, + 134, 141, 129, 310, 134, 195, 36, 197, 197, 342, + 134, 141, 153, 132, 134, 53, 131, 139, 140, 37, + 38, 198, 133, 316, 318, 130, 141, 132 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -2123,41 +2194,41 @@ static const yytype_int16 yyr1[] = 227, 227, 228, 228, 228, 229, 229, 230, 230, 230, 230, 231, 232, 232, 233, 233, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 236, 236, - 237, 237, 238, 238, 239, 239, 240, 241, 241, 242, - 243, 243, 243, 243, 243, 243, 243, 243, 243, 244, - 245, 245, 246, 246, 246, 246, 246, 246, 246, 247, - 248, 249, 250, 251, 251, 251, 251, 252, 252, 253, - 254, 254, 255, 255, 256, 257, 257, 258, 259, 260, - 261, 262, 262, 262, 263, 264, 265, 265, 265, 266, - 266, 267, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 269, 269, 269, 270, 270, 271, 271, 271, 271, - 272, 273, 273, 273, 273, 273, 273, 274, 274, 275, - 276, 276, 276, 276, 276, 276, 277, 277, 278, 278, - 278, 278, 278, 278, 279, 279, 279, 280, 281, 281, - 282, 282, 282, 282, 283, 283, 284, 284, 284, 285, - 286, 286, 286, 286, 286, 286, 286, 287, 288, 288, - 288, 289, 290, 290, 291, 292, 293, 293, 294, 295, - 295, 296, 297, 297, 298, 299, 299, 300, 300, 301, - 302, 303, 304, 304, 305, 306, 306, 307, 307, 308, - 308, 309, 310, 310, 310, 310, 310, 311, 311, 311, - 312, 312, 313, 313, 313, 314, 315, 316, 316, 316, - 317, 317, 318, 318, 319, 320, 320, 320, 320, 321, - 321, 322, 322, 322, 323, 324, 324, 324, 325, 325, - 326, 327, 327, 328, 329, 330, 330, 330, 330, 330, + 236, 237, 237, 238, 238, 239, 239, 240, 241, 241, + 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 244, 245, 245, 246, 246, 246, 246, 246, + 246, 246, 247, 248, 249, 250, 251, 251, 251, 251, + 252, 252, 253, 254, 254, 255, 255, 256, 257, 257, + 258, 259, 260, 261, 262, 262, 262, 263, 264, 265, + 265, 265, 266, 266, 267, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 269, 269, 269, 270, 270, 271, + 271, 271, 271, 272, 273, 273, 273, 273, 273, 273, + 274, 274, 275, 276, 276, 276, 276, 276, 276, 277, + 277, 278, 278, 278, 278, 278, 278, 279, 279, 279, + 280, 281, 281, 282, 282, 282, 282, 283, 283, 284, + 284, 284, 285, 286, 286, 286, 286, 286, 286, 286, + 287, 288, 288, 288, 289, 290, 290, 291, 292, 293, + 293, 294, 295, 295, 296, 297, 297, 298, 299, 299, + 300, 300, 301, 302, 303, 304, 304, 305, 306, 306, + 307, 307, 308, 308, 309, 310, 310, 310, 310, 310, + 311, 311, 311, 312, 312, 313, 313, 313, 314, 315, + 316, 316, 316, 317, 317, 318, 318, 319, 320, 320, + 320, 320, 321, 321, 322, 322, 322, 323, 324, 324, + 324, 325, 325, 326, 327, 327, 328, 329, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 331, 331, 332, 333, 333, 334, 335, 335, 336, - 336, 337, 337, 337, 337, 337, 337, 337, 337, 338, - 339, 339, 339, 339, 340, 340, 340, 340, 341, 341, - 341, 342, 342, 342, 342, 342, 343, 344, 344, 344, - 344, 344, 344, 345, 346, 347, 348, 348, 349, 350, - 350, 351, 351, 351, 352, 353, 353, 354, 354, 355, - 356, 357, 358, 358, 359, 360, 360, 361, 362, 363, - 364, 364, 364, 365, 366, 366, 367, 367, 368, 368, - 369, 369, 369, 370, 371, 372, 373, 373, 374, 375, - 376, 376, 377, 378, 378, 379, 379, 379, 379, 379, - 379, 380, 380, 381, 382, 382, 383, 384, 385, 386, - 386, 387, 387, 388, 388, 389, 390, 390, 391, 391, - 392, 392, 392 + 330, 330, 330, 330, 331, 331, 332, 333, 333, 334, + 335, 335, 336, 336, 337, 337, 337, 337, 337, 337, + 337, 337, 338, 339, 339, 339, 339, 340, 340, 340, + 340, 341, 341, 341, 342, 342, 342, 342, 342, 343, + 344, 344, 344, 344, 344, 344, 345, 346, 347, 348, + 348, 349, 350, 350, 351, 351, 351, 352, 353, 353, + 354, 354, 355, 356, 357, 358, 358, 359, 360, 360, + 361, 362, 363, 364, 364, 364, 365, 366, 366, 367, + 367, 368, 368, 369, 369, 369, 370, 371, 372, 373, + 373, 374, 375, 376, 376, 377, 378, 378, 379, 379, + 379, 379, 379, 379, 380, 380, 381, 382, 382, 383, + 384, 385, 386, 386, 387, 387, 388, 388, 389, 390, + 390, 391, 391, 392, 392, 392 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -2177,41 +2248,41 @@ static const yytype_int8 yyr2[] = 0, 1, 0, 2, 2, 0, 1, 4, 3, 4, 1, 2, 0, 3, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, - 1, 2, 1, 3, 1, 3, 3, 1, 3, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 3, 2, 1, 1, 1, 1, 1, 1, 2, 5, - 2, 4, 4, 2, 2, 1, 1, 0, 2, 3, - 2, 1, 1, 3, 3, 2, 1, 3, 2, 2, - 3, 1, 1, 1, 2, 2, 4, 3, 3, 1, - 3, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 0, 2, 1, 1, 1, 1, 1, 1, 1, - 8, 1, 1, 1, 3, 4, 5, 1, 1, 7, - 5, 5, 5, 4, 5, 6, 0, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, - 0, 1, 1, 2, 4, 5, 5, 5, 1, 4, - 3, 3, 1, 1, 1, 1, 1, 4, 0, 2, - 4, 5, 1, 1, 1, 4, 1, 1, 6, 0, - 4, 1, 1, 1, 1, 0, 2, 3, 1, 3, - 1, 6, 0, 1, 1, 0, 3, 0, 3, 3, - 1, 2, 0, 3, 2, 2, 3, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 4, 1, 2, 1, - 1, 2, 1, 2, 2, 1, 1, 1, 1, 0, - 2, 1, 1, 1, 7, 0, 1, 1, 1, 1, - 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 1, 2, 1, 3, 1, 3, 3, 1, 3, + 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 3, 2, 1, 1, 1, 1, 1, + 1, 2, 5, 2, 4, 4, 2, 2, 1, 1, + 0, 2, 3, 2, 1, 1, 3, 3, 2, 1, + 3, 2, 2, 3, 1, 1, 1, 2, 2, 4, + 3, 3, 1, 3, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 0, 2, 1, 1, 1, 1, + 1, 1, 1, 8, 1, 1, 1, 3, 4, 5, + 1, 1, 7, 5, 5, 5, 4, 5, 6, 0, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 0, 1, 1, 2, 4, 5, 5, + 5, 1, 4, 3, 3, 1, 1, 1, 1, 1, + 4, 0, 2, 4, 5, 1, 1, 1, 4, 1, + 1, 6, 0, 4, 1, 1, 1, 1, 0, 2, + 3, 1, 3, 1, 6, 0, 1, 1, 0, 3, + 0, 3, 3, 1, 2, 0, 3, 2, 2, 3, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, + 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, + 1, 1, 0, 2, 1, 1, 1, 7, 0, 1, + 1, 1, 1, 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 2, 1, 1, 6, 0, 1, 0, - 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, - 1, 2, 2, 2, 1, 3, 3, 3, 1, 3, - 3, 1, 3, 3, 3, 3, 1, 1, 1, 1, - 2, 2, 2, 1, 1, 1, 1, 3, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 3, 3, 1, - 1, 2, 1, 1, 3, 3, 3, 1, 2, 1, - 1, 3, 3, 2, 0, 3, 0, 1, 1, 3, - 2, 1, 1, 2, 1, 1, 1, 1, 5, 4, - 1, 2, 4, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 2, 4, 0, 2, 1, 1, 1, 2, - 1, 0, 2, 0, 1, 2, 2, 1, 1, 3, - 1, 1, 1 + 1, 1, 1, 1, 1, 3, 2, 1, 1, 6, + 0, 1, 0, 3, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 2, 2, 2, 1, 3, 3, + 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, + 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, + 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, + 3, 3, 1, 1, 2, 1, 1, 3, 3, 3, + 1, 2, 1, 1, 3, 3, 2, 0, 3, 0, + 1, 1, 3, 2, 1, 1, 2, 1, 1, 1, + 1, 5, 4, 1, 2, 4, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 2, 4, 0, 2, 1, + 1, 1, 2, 1, 0, 2, 0, 1, 2, 2, + 1, 1, 3, 1, 1, 1 }; @@ -3325,7 +3396,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 141: /* boolean_factor: SQL_TOKEN_NOT boolean_test */ + case 140: /* boolean_test: boolean_primary SQL_TOKEN_IS sql_not value_exp */ + { + (yyval.pParseNode) = SQL_NEW_RULE; + (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); + (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); + (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); + (yyval.pParseNode)->append((yyvsp[0].pParseNode)); + } + break; + + case 142: /* boolean_factor: SQL_TOKEN_NOT boolean_test */ { // boolean_factor: rule 1 (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3333,7 +3414,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 143: /* boolean_term: boolean_term SQL_TOKEN_AND boolean_factor */ + case 144: /* boolean_term: boolean_term SQL_TOKEN_AND boolean_factor */ { (yyval.pParseNode) = SQL_NEW_RULE; // boolean_term: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3342,7 +3423,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 145: /* search_condition: search_condition SQL_TOKEN_OR boolean_term */ + case 146: /* search_condition: search_condition SQL_TOKEN_OR boolean_term */ { (yyval.pParseNode) = SQL_NEW_RULE; // search_condition (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3351,7 +3432,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 146: /* type_predicate: '(' type_list ')' */ + case 147: /* type_predicate: '(' type_list ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3360,29 +3441,51 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 147: /* type_list: type_list_item */ + case 148: /* type_list: type_list_item */ { (yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 148: /* type_list: type_list ',' type_list_item */ + case 149: /* type_list: type_list ',' type_list_item */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 149: /* type_list_item: opt_only table_node */ + case 150: /* type_list_item: table_node */ + { + (yyval.pParseNode) = SQL_NEW_RULE; + (yyval.pParseNode)->append(CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only))); + (yyval.pParseNode)->append((yyvsp[0].pParseNode)); + } + break; + + case 151: /* type_list_item: opt_disqualify_polymorphic_constraint SQL_TOKEN_ONLY table_node */ + { + (yyval.pParseNode) = SQL_NEW_RULE; + OSQLParseNode* pOptOnly = CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only)); + pOptOnly->append((yyvsp[-2].pParseNode)); + pOptOnly->append((yyvsp[-1].pParseNode) = CREATE_NODE("ONLY", SQL_NODE_NAME)); + (yyval.pParseNode)->append(pOptOnly); + (yyval.pParseNode)->append((yyvsp[0].pParseNode)); + } + break; + + case 152: /* type_list_item: opt_disqualify_polymorphic_constraint SQL_TOKEN_ALL table_node */ { (yyval.pParseNode) = SQL_NEW_RULE; - (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); + OSQLParseNode* pOptOnly = CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only)); + pOptOnly->append((yyvsp[-2].pParseNode)); + pOptOnly->append((yyvsp[-1].pParseNode) = CREATE_NODE("ALL", SQL_NODE_NAME)); + (yyval.pParseNode)->append(pOptOnly); (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 159: /* comparison_predicate_part_2: comparison row_value_constructor */ + case 162: /* comparison_predicate_part_2: comparison row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // comparison_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3390,7 +3493,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 160: /* comparison_predicate: row_value_constructor comparison row_value_constructor */ + case 163: /* comparison_predicate: row_value_constructor comparison row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // comparison_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3399,7 +3502,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 161: /* comparison_predicate: comparison row_value_constructor */ + case 164: /* comparison_predicate: comparison row_value_constructor */ { if(context->inPredicateCheck()) // comparison_predicate: rule 2 { @@ -3424,7 +3527,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 168: /* comparison: SQL_TOKEN_IS sql_not */ + case 171: /* comparison: SQL_TOKEN_IS sql_not */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3432,7 +3535,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 169: /* between_predicate_part_2: sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor */ + case 172: /* between_predicate_part_2: sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // between_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3443,7 +3546,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 170: /* between_predicate: row_value_constructor between_predicate_part_2 */ + case 173: /* between_predicate: row_value_constructor between_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // between_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3451,7 +3554,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 171: /* character_like_predicate_part_2: sql_not SQL_TOKEN_LIKE string_value_exp opt_escape */ + case 174: /* character_like_predicate_part_2: sql_not SQL_TOKEN_LIKE string_value_exp opt_escape */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3461,7 +3564,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 172: /* other_like_predicate_part_2: sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape */ + case 175: /* other_like_predicate_part_2: sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3471,7 +3574,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 173: /* like_predicate: row_value_constructor character_like_predicate_part_2 */ + case 176: /* like_predicate: row_value_constructor character_like_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3479,7 +3582,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 174: /* like_predicate: row_value_constructor other_like_predicate_part_2 */ + case 177: /* like_predicate: row_value_constructor other_like_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 3 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3487,7 +3590,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 175: /* like_predicate: character_like_predicate_part_2 */ + case 178: /* like_predicate: character_like_predicate_part_2 */ { if (context->inPredicateCheck()) // like_predicate: rule 5 { @@ -3511,7 +3614,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 176: /* like_predicate: other_like_predicate_part_2 */ + case 179: /* like_predicate: other_like_predicate_part_2 */ { if (context->inPredicateCheck()) // like_predicate: rule 6 { @@ -3535,17 +3638,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 177: /* opt_escape: %empty */ + case 180: /* opt_escape: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 178: /* opt_escape: SQL_TOKEN_ESCAPE string_value_exp */ + case 181: /* opt_escape: SQL_TOKEN_ESCAPE string_value_exp */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 179: /* null_predicate_part_2: SQL_TOKEN_IS sql_not SQL_TOKEN_NULL */ + case 182: /* null_predicate_part_2: SQL_TOKEN_IS sql_not SQL_TOKEN_NULL */ { (yyval.pParseNode) = SQL_NEW_RULE; // test_for_null: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3554,7 +3657,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 180: /* test_for_null: row_value_constructor null_predicate_part_2 */ + case 183: /* test_for_null: row_value_constructor null_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // test_for_null: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3562,7 +3665,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 181: /* test_for_null: null_predicate_part_2 */ + case 184: /* test_for_null: null_predicate_part_2 */ { if (context->inPredicateCheck())// test_for_null: rule 2 { @@ -3578,13 +3681,13 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 182: /* in_predicate_value: subquery */ + case 185: /* in_predicate_value: subquery */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 183: /* in_predicate_value: '(' value_exp_commalist ')' */ + case 186: /* in_predicate_value: '(' value_exp_commalist ')' */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3592,7 +3695,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 184: /* in_predicate_part_2: sql_not SQL_TOKEN_IN in_predicate_value */ + case 187: /* in_predicate_part_2: sql_not SQL_TOKEN_IN in_predicate_value */ { (yyval.pParseNode) = SQL_NEW_RULE;// in_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3601,7 +3704,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 185: /* in_predicate: row_value_constructor in_predicate_part_2 */ + case 188: /* in_predicate: row_value_constructor in_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE;// in_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3609,7 +3712,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 186: /* in_predicate: in_predicate_part_2 */ + case 189: /* in_predicate: in_predicate_part_2 */ { if ( context->inPredicateCheck() )// in_predicate: rule 2 { @@ -3625,7 +3728,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 187: /* quantified_comparison_predicate_part_2: comparison any_all_some subquery */ + case 190: /* quantified_comparison_predicate_part_2: comparison any_all_some subquery */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3634,7 +3737,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 188: /* all_or_any_predicate: row_value_constructor quantified_comparison_predicate_part_2 */ + case 191: /* all_or_any_predicate: row_value_constructor quantified_comparison_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3642,7 +3745,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 189: /* rtreematch_predicate: row_value_constructor rtreematch_predicate_part_2 */ + case 192: /* rtreematch_predicate: row_value_constructor rtreematch_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3650,7 +3753,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 190: /* rtreematch_predicate_part_2: sql_not SQL_TOKEN_MATCH fct_spec */ + case 193: /* rtreematch_predicate_part_2: sql_not SQL_TOKEN_MATCH fct_spec */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3659,7 +3762,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 194: /* existence_test: SQL_TOKEN_EXISTS subquery */ + case 197: /* existence_test: SQL_TOKEN_EXISTS subquery */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3667,13 +3770,13 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 195: /* unique_test: SQL_TOKEN_UNIQUE subquery */ + case 198: /* unique_test: SQL_TOKEN_UNIQUE subquery */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 196: /* subquery: '(' SQL_TOKEN_VALUES values_commalist ')' */ + case 199: /* subquery: '(' SQL_TOKEN_VALUES values_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3683,7 +3786,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 197: /* subquery: '(' select_statement ')' */ + case 200: /* subquery: '(' select_statement ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3692,7 +3795,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 198: /* subquery: '(' cte ')' */ + case 201: /* subquery: '(' cte ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3701,21 +3804,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 199: /* scalar_exp_commalist: select_sublist */ + case 202: /* scalar_exp_commalist: select_sublist */ { (yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 200: /* scalar_exp_commalist: scalar_exp_commalist ',' select_sublist */ + case 203: /* scalar_exp_commalist: scalar_exp_commalist ',' select_sublist */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 207: /* literal: literal SQL_TOKEN_STRING */ + case 210: /* literal: literal SQL_TOKEN_STRING */ { if (context->inPredicateCheck()) { @@ -3729,7 +3832,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 208: /* literal: literal SQL_TOKEN_INT */ + case 211: /* literal: literal SQL_TOKEN_INT */ { if (context->inPredicateCheck()) { @@ -3743,7 +3846,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 209: /* literal: literal SQL_TOKEN_REAL_NUM */ + case 212: /* literal: literal SQL_TOKEN_REAL_NUM */ { if (context->inPredicateCheck()) { @@ -3757,7 +3860,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 210: /* literal: literal SQL_TOKEN_APPROXNUM */ + case 213: /* literal: literal SQL_TOKEN_APPROXNUM */ { if (context->inPredicateCheck()) { @@ -3771,11 +3874,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 211: /* as_clause: %empty */ + case 214: /* as_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 212: /* as_clause: SQL_TOKEN_AS column */ + case 215: /* as_clause: SQL_TOKEN_AS column */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3783,7 +3886,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 220: /* iif_spec: SQL_TOKEN_IIF '(' search_condition ',' result ',' result ')' */ + case 223: /* iif_spec: SQL_TOKEN_IIF '(' search_condition ',' result ',' result ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-7].pParseNode)); @@ -3795,7 +3898,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 224: /* fct_spec: function_name '(' ')' */ + case 227: /* fct_spec: function_name '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3804,7 +3907,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 225: /* fct_spec: function_name '(' function_args_commalist ')' */ + case 228: /* fct_spec: function_name '(' function_args_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3814,7 +3917,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 226: /* fct_spec: function_name '(' opt_all_distinct function_arg ')' */ + case 229: /* fct_spec: function_name '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3825,7 +3928,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 229: /* value_creation_fct: SQL_TOKEN_NAVIGATION_VALUE '(' derived_column ',' function_arg opt_function_arg ')' */ + case 232: /* value_creation_fct: SQL_TOKEN_NAVIGATION_VALUE '(' derived_column ',' function_arg opt_function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-6].pParseNode)); @@ -3838,7 +3941,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 230: /* aggregate_fct: SQL_TOKEN_MAX '(' opt_all_distinct function_args_commalist ')' */ + case 233: /* aggregate_fct: SQL_TOKEN_MAX '(' opt_all_distinct function_args_commalist ')' */ { if((yyvsp[-1].pParseNode)->count() != 1) { @@ -3856,7 +3959,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 231: /* aggregate_fct: SQL_TOKEN_MIN '(' opt_all_distinct function_args_commalist ')' */ + case 234: /* aggregate_fct: SQL_TOKEN_MIN '(' opt_all_distinct function_args_commalist ')' */ { if((yyvsp[-1].pParseNode)->count() != 1) { @@ -3874,7 +3977,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 232: /* aggregate_fct: set_fct_type '(' opt_all_distinct function_arg ')' */ + case 235: /* aggregate_fct: set_fct_type '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3885,7 +3988,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 233: /* aggregate_fct: SQL_TOKEN_COUNT '(' '*' ')' */ + case 236: /* aggregate_fct: SQL_TOKEN_COUNT '(' '*' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3895,7 +3998,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 234: /* aggregate_fct: SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')' */ + case 237: /* aggregate_fct: SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3906,7 +4009,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 235: /* aggregate_fct: SQL_TOKEN_GROUP_CONCAT '(' opt_all_distinct function_arg opt_function_arg ')' */ + case 238: /* aggregate_fct: SQL_TOKEN_GROUP_CONCAT '(' opt_all_distinct function_arg opt_function_arg ')' */ { if ((yyvsp[-3].pParseNode)->isToken() && (yyvsp[-1].pParseNode)->count()!=0) { @@ -3923,11 +4026,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 236: /* opt_function_arg: %empty */ + case 239: /* opt_function_arg: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 237: /* opt_function_arg: ',' function_arg */ + case 240: /* opt_function_arg: ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -3935,28 +4038,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 244: /* outer_join_type: SQL_TOKEN_LEFT */ + case 247: /* outer_join_type: SQL_TOKEN_LEFT */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 245: /* outer_join_type: SQL_TOKEN_RIGHT */ + case 248: /* outer_join_type: SQL_TOKEN_RIGHT */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 246: /* outer_join_type: SQL_TOKEN_FULL */ + case 249: /* outer_join_type: SQL_TOKEN_FULL */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 247: /* join_condition: SQL_TOKEN_ON search_condition */ + case 250: /* join_condition: SQL_TOKEN_ON search_condition */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3964,18 +4067,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 250: /* join_type: %empty */ + case 253: /* join_type: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 251: /* join_type: SQL_TOKEN_INNER */ + case 254: /* join_type: SQL_TOKEN_INNER */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 253: /* join_type: outer_join_type SQL_TOKEN_OUTER */ + case 256: /* join_type: outer_join_type SQL_TOKEN_OUTER */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3983,7 +4086,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 254: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref */ + case 257: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3993,7 +4096,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 255: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref join_condition */ + case 258: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref join_condition */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4004,7 +4107,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 256: /* qualified_join: table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref */ + case 259: /* qualified_join: table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4015,7 +4118,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 257: /* qualified_join: table_ref join_type SQL_TOKEN_JOIN table_ref join_spec */ + case 260: /* qualified_join: table_ref join_type SQL_TOKEN_JOIN table_ref join_spec */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4026,7 +4129,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 259: /* window_function: window_function_type opt_filter_clause SQL_TOKEN_OVER window_name_or_specification */ + case 262: /* window_function: window_function_type opt_filter_clause SQL_TOKEN_OVER window_name_or_specification */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4036,7 +4139,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 260: /* window_function_type: rank_function_type '(' ')' */ + case 263: /* window_function_type: rank_function_type '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4045,7 +4148,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 261: /* window_function_type: SQL_TOKEN_ROW_NUMBER '(' ')' */ + case 264: /* window_function_type: SQL_TOKEN_ROW_NUMBER '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4054,7 +4157,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 267: /* ntile_function: SQL_TOKEN_NTILE '(' function_arg ')' */ + case 270: /* ntile_function: SQL_TOKEN_NTILE '(' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4064,11 +4167,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 268: /* opt_lead_or_lag_function: %empty */ + case 271: /* opt_lead_or_lag_function: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 269: /* opt_lead_or_lag_function: ',' function_arg */ + case 272: /* opt_lead_or_lag_function: ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -4076,7 +4179,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 270: /* opt_lead_or_lag_function: ',' function_arg ',' function_arg */ + case 273: /* opt_lead_or_lag_function: ',' function_arg ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -4086,7 +4189,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 271: /* lead_or_lag_function: lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' */ + case 274: /* lead_or_lag_function: lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4097,7 +4200,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 275: /* first_or_last_value_function: first_or_last_value '(' function_arg ')' */ + case 278: /* first_or_last_value_function: first_or_last_value '(' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4107,7 +4210,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 278: /* nth_value_function: SQL_TOKEN_NTH_VALUE '(' function_arg ',' function_arg ')' */ + case 281: /* nth_value_function: SQL_TOKEN_NTH_VALUE '(' function_arg ',' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode)); @@ -4119,11 +4222,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 279: /* opt_filter_clause: %empty */ + case 282: /* opt_filter_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 280: /* opt_filter_clause: SQL_TOKEN_FILTER '(' where_clause ')' */ + case 283: /* opt_filter_clause: SQL_TOKEN_FILTER '(' where_clause ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4133,11 +4236,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 285: /* opt_window_clause: %empty */ + case 288: /* opt_window_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 286: /* opt_window_clause: SQL_TOKEN_WINDOW window_definition_list */ + case 289: /* opt_window_clause: SQL_TOKEN_WINDOW window_definition_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4145,17 +4248,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 287: /* window_definition_list: window_definition_list ',' window_definition */ + case 290: /* window_definition_list: window_definition_list ',' window_definition */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 288: /* window_definition_list: window_definition */ + case 291: /* window_definition_list: window_definition */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 289: /* window_definition: new_window_name SQL_TOKEN_AS window_specification */ + case 292: /* window_definition: new_window_name SQL_TOKEN_AS window_specification */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4164,7 +4267,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 291: /* window_specification: '(' opt_existing_window_name opt_window_partition_clause opt_order_by_clause opt_window_frame_clause ')' */ + case 294: /* window_specification: '(' opt_existing_window_name opt_window_partition_clause opt_order_by_clause opt_window_frame_clause ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4176,15 +4279,15 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 292: /* opt_existing_window_name: %empty */ + case 295: /* opt_existing_window_name: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 295: /* opt_window_partition_clause: %empty */ + case 298: /* opt_window_partition_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 296: /* opt_window_partition_clause: SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list */ + case 299: /* opt_window_partition_clause: SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4193,11 +4296,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 297: /* opt_window_frame_clause: %empty */ + case 300: /* opt_window_frame_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 298: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ + case 301: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4206,17 +4309,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 299: /* window_partition_column_reference_list: window_partition_column_reference_list ',' window_partition_column_reference */ + case 302: /* window_partition_column_reference_list: window_partition_column_reference_list ',' window_partition_column_reference */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 300: /* window_partition_column_reference_list: window_partition_column_reference */ + case 303: /* window_partition_column_reference_list: window_partition_column_reference */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 301: /* window_partition_column_reference: column_ref opt_collate_clause */ + case 304: /* window_partition_column_reference: column_ref opt_collate_clause */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4224,11 +4327,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 302: /* opt_window_frame_exclusion: %empty */ + case 305: /* opt_window_frame_exclusion: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 303: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 306: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4237,7 +4340,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 304: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP */ + case 307: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4245,7 +4348,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 305: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES */ + case 308: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4253,7 +4356,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 306: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS */ + case 309: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4262,7 +4365,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 312: /* window_frame_start: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ + case 315: /* window_frame_start: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4270,7 +4373,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 313: /* window_frame_start: value_exp SQL_TOKEN_PRECEDING */ + case 316: /* window_frame_start: value_exp SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4278,7 +4381,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 314: /* window_frame_start: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 317: /* window_frame_start: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4286,7 +4389,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 315: /* window_frame_preceding: value_exp SQL_TOKEN_PRECEDING */ + case 318: /* window_frame_preceding: value_exp SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4294,7 +4397,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 316: /* window_frame_between: SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2 */ + case 319: /* window_frame_between: SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4304,7 +4407,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 318: /* window_frame_bound: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 321: /* window_frame_bound: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4312,7 +4415,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 321: /* window_frame_bound_1: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ + case 324: /* window_frame_bound_1: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4320,7 +4423,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 323: /* window_frame_bound_2: SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING */ + case 326: /* window_frame_bound_2: SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4328,7 +4431,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 324: /* window_frame_following: value_exp SQL_TOKEN_FOLLOWING */ + case 327: /* window_frame_following: value_exp SQL_TOKEN_FOLLOWING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4336,11 +4439,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 329: /* opt_collate_clause: %empty */ + case 332: /* opt_collate_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 330: /* opt_collate_clause: SQL_TOKEN_COLLATE collating_function */ + case 333: /* opt_collate_clause: SQL_TOKEN_COLLATE collating_function */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4348,7 +4451,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 334: /* ecrelationship_join: table_ref join_type SQL_TOKEN_JOIN table_ref SQL_TOKEN_USING table_node_ref op_relationship_direction */ + case 337: /* ecrelationship_join: table_ref join_type SQL_TOKEN_JOIN table_ref SQL_TOKEN_USING table_node_ref op_relationship_direction */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-6].pParseNode)); @@ -4361,11 +4464,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 335: /* op_relationship_direction: %empty */ + case 338: /* op_relationship_direction: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 340: /* named_columns_join: SQL_TOKEN_USING '(' column_commalist ')' */ + case 343: /* named_columns_join: SQL_TOKEN_USING '(' column_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4375,18 +4478,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 341: /* all: %empty */ + case 344: /* all: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 361: /* cast_target_scalar: cast_target_primitive_type */ + case 364: /* cast_target_scalar: cast_target_primitive_type */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 362: /* cast_target_scalar: SQL_TOKEN_NAME '.' SQL_TOKEN_NAME */ + case 365: /* cast_target_scalar: SQL_TOKEN_NAME '.' SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4395,7 +4498,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 363: /* cast_target_array: cast_target_scalar SQL_TOKEN_ARRAY_INDEX */ + case 366: /* cast_target_array: cast_target_scalar SQL_TOKEN_ARRAY_INDEX */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4403,7 +4506,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 366: /* cast_spec: SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')' */ + case 369: /* cast_spec: SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode)); @@ -4415,22 +4518,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 367: /* opt_optional_prop: %empty */ + case 370: /* opt_optional_prop: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 368: /* opt_optional_prop: '?' */ + case 371: /* opt_optional_prop: '?' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("?", SQL_NODE_PUNCTUATION)); } break; - case 369: /* opt_extract_value: %empty */ + case 372: /* opt_extract_value: %empty */ { (yyval.pParseNode) = SQL_NEW_RULE; } break; - case 370: /* opt_extract_value: SQL_ARROW property_path opt_optional_prop */ + case 373: /* opt_extract_value: SQL_ARROW property_path opt_optional_prop */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4438,7 +4541,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 377: /* value_exp_primary: '(' value_exp ')' */ + case 380: /* value_exp_primary: '(' value_exp ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4447,7 +4550,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 381: /* factor: '-' num_primary */ + case 384: /* factor: '-' num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("-", SQL_NODE_PUNCTUATION)); @@ -4455,7 +4558,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 382: /* factor: '+' num_primary */ + case 385: /* factor: '+' num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("+", SQL_NODE_PUNCTUATION)); @@ -4463,7 +4566,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 383: /* factor: SQL_BITWISE_NOT num_primary */ + case 386: /* factor: SQL_BITWISE_NOT num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("~", SQL_NODE_PUNCTUATION)); @@ -4471,7 +4574,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 385: /* term: term '*' factor */ + case 388: /* term: term '*' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4480,7 +4583,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 386: /* term: term '/' factor */ + case 389: /* term: term '/' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4489,7 +4592,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 387: /* term: term '%' factor */ + case 390: /* term: term '%' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4498,7 +4601,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 389: /* term_add_sub: term_add_sub '+' term */ + case 392: /* term_add_sub: term_add_sub '+' term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4507,7 +4610,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 390: /* term_add_sub: term_add_sub '-' term */ + case 393: /* term_add_sub: term_add_sub '-' term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4516,7 +4619,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 392: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_LEFT term_add_sub */ + case 395: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_LEFT term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4525,7 +4628,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 393: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_RIGHT term_add_sub */ + case 396: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_RIGHT term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4534,7 +4637,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 394: /* num_value_exp: num_value_exp SQL_BITWISE_OR term_add_sub */ + case 397: /* num_value_exp: num_value_exp SQL_BITWISE_OR term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4543,7 +4646,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 395: /* num_value_exp: num_value_exp SQL_BITWISE_AND term_add_sub */ + case 398: /* num_value_exp: num_value_exp SQL_BITWISE_AND term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4552,35 +4655,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 396: /* datetime_primary: datetime_value_fct */ + case 399: /* datetime_primary: datetime_value_fct */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 397: /* datetime_value_fct: SQL_TOKEN_CURRENT_DATE */ + case 400: /* datetime_value_fct: SQL_TOKEN_CURRENT_DATE */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 398: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIMESTAMP */ + case 401: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIMESTAMP */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 399: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIME */ + case 402: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 400: /* datetime_value_fct: SQL_TOKEN_DATE string_value_exp */ + case 403: /* datetime_value_fct: SQL_TOKEN_DATE string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4588,7 +4691,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 401: /* datetime_value_fct: SQL_TOKEN_TIMESTAMP string_value_exp */ + case 404: /* datetime_value_fct: SQL_TOKEN_TIMESTAMP string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4596,7 +4699,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 402: /* datetime_value_fct: SQL_TOKEN_TIME string_value_exp */ + case 405: /* datetime_value_fct: SQL_TOKEN_TIME string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4604,52 +4707,52 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 403: /* datetime_factor: datetime_primary */ + case 406: /* datetime_factor: datetime_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 404: /* datetime_term: datetime_factor */ + case 407: /* datetime_term: datetime_factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 405: /* datetime_value_exp: datetime_term */ + case 408: /* datetime_value_exp: datetime_term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 406: /* value_exp_commalist: value_exp */ + case 409: /* value_exp_commalist: value_exp */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 407: /* value_exp_commalist: value_exp_commalist ',' value_exp */ + case 410: /* value_exp_commalist: value_exp_commalist ',' value_exp */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 409: /* function_args_commalist: function_arg */ + case 412: /* function_args_commalist: function_arg */ { (yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 410: /* function_args_commalist: function_args_commalist ',' function_arg */ + case 413: /* function_args_commalist: function_args_commalist ',' function_arg */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 417: /* concatenation: char_value_exp '+' char_factor */ + case 420: /* concatenation: char_value_exp '+' char_factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4658,7 +4761,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 418: /* concatenation: value_exp SQL_CONCAT value_exp */ + case 421: /* concatenation: value_exp SQL_CONCAT value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4667,7 +4770,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 421: /* derived_column: value_exp as_clause */ + case 424: /* derived_column: value_exp as_clause */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4675,21 +4778,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 422: /* table_node: qualified_class_name */ + case 425: /* table_node: qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 423: /* table_node: tablespace_qualified_class_name */ + case 426: /* table_node: tablespace_qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 424: /* tablespace_qualified_class_name: SQL_TOKEN_NAME '.' qualified_class_name */ + case 427: /* tablespace_qualified_class_name: SQL_TOKEN_NAME '.' qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4698,7 +4801,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 425: /* qualified_class_name: SQL_TOKEN_NAME '.' class_name */ + case 428: /* qualified_class_name: SQL_TOKEN_NAME '.' class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4707,7 +4810,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 426: /* qualified_class_name: SQL_TOKEN_NAME ':' class_name */ + case 429: /* qualified_class_name: SQL_TOKEN_NAME ':' class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4716,14 +4819,14 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 427: /* class_name: SQL_TOKEN_NAME */ + case 430: /* class_name: SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 428: /* table_node_ref: table_node_with_opt_member_func_call table_primary_as_range_column */ + case 431: /* table_node_ref: table_node_with_opt_member_func_call table_primary_as_range_column */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4731,35 +4834,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 429: /* table_node_with_opt_member_func_call: table_node_path */ + case 432: /* table_node_with_opt_member_func_call: table_node_path */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 430: /* table_node_path: table_node_path_entry */ + case 433: /* table_node_path: table_node_path_entry */ { (yyval.pParseNode) = SQL_NEW_DOTLISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 431: /* table_node_path: table_node_path '.' table_node_path_entry */ + case 434: /* table_node_path: table_node_path '.' table_node_path_entry */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 432: /* table_node_path: table_node_path ':' table_node_path_entry */ + case 435: /* table_node_path: table_node_path ':' table_node_path_entry */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 433: /* table_node_path_entry: SQL_TOKEN_NAME opt_member_function_args */ + case 436: /* table_node_path_entry: SQL_TOKEN_NAME opt_member_function_args */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4767,11 +4870,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 434: /* opt_member_function_args: %empty */ + case 437: /* opt_member_function_args: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 435: /* opt_member_function_args: '(' function_args_commalist ')' */ + case 438: /* opt_member_function_args: '(' function_args_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4780,25 +4883,25 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 436: /* opt_column_array_idx: %empty */ + case 439: /* opt_column_array_idx: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 437: /* opt_column_array_idx: SQL_TOKEN_ARRAY_INDEX */ + case 440: /* opt_column_array_idx: SQL_TOKEN_ARRAY_INDEX */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 438: /* property_path: property_path_entry */ + case 441: /* property_path: property_path_entry */ { (yyval.pParseNode) = SQL_NEW_DOTLISTRULE; (yyval.pParseNode)->append ((yyvsp[0].pParseNode)); } break; - case 439: /* property_path: property_path '.' property_path_entry */ + case 442: /* property_path: property_path '.' property_path_entry */ { auto last = (yyvsp[-2].pParseNode)->getLast(); if (last) @@ -4815,7 +4918,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 440: /* property_path_entry: SQL_TOKEN_NAME opt_column_array_idx */ + case 443: /* property_path_entry: SQL_TOKEN_NAME opt_column_array_idx */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4823,21 +4926,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 441: /* property_path_entry: '*' */ + case 444: /* property_path_entry: '*' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("*", SQL_NODE_PUNCTUATION)); } break; - case 442: /* property_path_entry: SQL_TOKEN_DOLLAR */ + case 445: /* property_path_entry: SQL_TOKEN_DOLLAR */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("$", SQL_NODE_PUNCTUATION)); } break; - case 443: /* column_ref: property_path opt_extract_value */ + case 446: /* column_ref: property_path opt_extract_value */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4845,7 +4948,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 448: /* simple_case: SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END */ + case 451: /* simple_case: SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4856,7 +4959,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 449: /* searched_case: SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END */ + case 452: /* searched_case: SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4866,21 +4969,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 450: /* simple_when_clause_list: simple_when_clause */ + case 453: /* simple_when_clause_list: simple_when_clause */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 451: /* simple_when_clause_list: searched_when_clause_list simple_when_clause */ + case 454: /* simple_when_clause_list: searched_when_clause_list simple_when_clause */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 452: /* simple_when_clause: SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result */ + case 455: /* simple_when_clause: SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4890,31 +4993,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 453: /* when_operand_list: when_operand */ + case 456: /* when_operand_list: when_operand */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 454: /* when_operand_list: when_operand_list ',' when_operand */ + case 457: /* when_operand_list: when_operand_list ',' when_operand */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 461: /* searched_when_clause_list: searched_when_clause */ + case 464: /* searched_when_clause_list: searched_when_clause */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 462: /* searched_when_clause_list: searched_when_clause_list searched_when_clause */ + case 465: /* searched_when_clause_list: searched_when_clause_list searched_when_clause */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 463: /* searched_when_clause: SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result */ + case 466: /* searched_when_clause: SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4924,11 +5027,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 464: /* else_clause: %empty */ + case 467: /* else_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 465: /* else_clause: SQL_TOKEN_ELSE result */ + case 468: /* else_clause: SQL_TOKEN_ELSE result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4936,7 +5039,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 469: /* parameter: ':' SQL_TOKEN_NAME */ + case 472: /* parameter: ':' SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(":", SQL_NODE_PUNCTUATION)); @@ -4944,20 +5047,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 470: /* parameter: '?' */ + case 473: /* parameter: '?' */ { (yyval.pParseNode) = SQL_NEW_RULE; // test (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("?", SQL_NODE_PUNCTUATION)); } break; - case 471: /* range_variable: %empty */ + case 474: /* range_variable: %empty */ { (yyval.pParseNode) = SQL_NEW_RULE; } break; - case 472: /* range_variable: opt_as SQL_TOKEN_NAME */ + case 475: /* range_variable: opt_as SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4965,11 +5068,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 473: /* opt_ecsqloptions_clause: %empty */ + case 476: /* opt_ecsqloptions_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 475: /* ecsqloptions_clause: SQL_TOKEN_ECSQLOPTIONS ecsqloptions_list */ + case 478: /* ecsqloptions_clause: SQL_TOKEN_ECSQLOPTIONS ecsqloptions_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4977,28 +5080,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 476: /* ecsqloptions_list: ecsqloptions_list ecsqloption */ + case 479: /* ecsqloptions_list: ecsqloptions_list ecsqloption */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 477: /* ecsqloptions_list: ecsqloption */ + case 480: /* ecsqloptions_list: ecsqloption */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 478: /* ecsqloption: SQL_TOKEN_NAME */ + case 481: /* ecsqloption: SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 479: /* ecsqloption: SQL_TOKEN_NAME SQL_EQUAL ecsqloptionvalue */ + case 482: /* ecsqloption: SQL_TOKEN_NAME SQL_EQUAL ecsqloptionvalue */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y index 4a86f59dbcf..1d33a45aaa8 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y @@ -912,6 +912,7 @@ boolean_primary: boolean_test: boolean_primary + /* X IS [NOT] NULL|TRUE|FALSE|UNKNOWN, and the X IS [NOT] (ClassName) type predicate. */ | boolean_primary SQL_TOKEN_IS sql_not truth_value { $$ = SQL_NEW_RULE; @@ -920,6 +921,18 @@ boolean_test: $$->append($3); $$->append($4); } + /* X IS [NOT] : SQLite null-safe comparison between two operands. + Any value expression is allowed on the right-hand side. A right-hand operand + that is exactly NULL/TRUE/FALSE/UNKNOWN or the parenthesized (ClassName) form + reduces via 'truth_value' above (it has the lower rule number). */ + | boolean_primary SQL_TOKEN_IS sql_not value_exp + { + $$ = SQL_NEW_RULE; + $$->append($1); + $$->append($2); + $$->append($3); + $$->append($4); + } ; boolean_factor: boolean_test @@ -973,12 +986,42 @@ type_list: } ; +/* 'opt_only' is inlined here (rather than 'opt_only table_node') so that the type predicate + stays reachable: without it, the empty 'opt_only' reduction loses a shift/reduce race + against value_exp's property_path in the 'X IS (...)' context. + A type predicate is reached only for a *qualified* class name (schema.Class), an ONLY/ALL + prefix, or a comma-separated list. A single *unqualified* name in parentheses - e.g. + 'X IS (S2)' - still reduces as a parenthesized value_exp (null-safe comparison), not a + type predicate; so if an identifier is both a class and a property name, the value- + expression (property) reading wins. + A *qualified* name in parentheses - e.g. 'X IS (alias.prop)' - does reduce here as a type + predicate, but the semantic layer (ECSqlParser::TryParseParenthesizedNameAsValueExp) + reinterprets it as a property reference (null-safe comparison) when the name does not resolve + to a class. See ECSqlStatementTests IsAndIsNotOperatorNullSafeSemantics. */ type_list_item: - opt_only table_node + table_node { $$ = SQL_NEW_RULE; + $$->append(CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only))); $$->append($1); - $$->append($2); + } + | opt_disqualify_polymorphic_constraint SQL_TOKEN_ONLY table_node + { + $$ = SQL_NEW_RULE; + OSQLParseNode* pOptOnly = CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only)); + pOptOnly->append($1); + pOptOnly->append($2 = CREATE_NODE("ONLY", SQL_NODE_NAME)); + $$->append(pOptOnly); + $$->append($3); + } + | opt_disqualify_polymorphic_constraint SQL_TOKEN_ALL table_node + { + $$ = SQL_NEW_RULE; + OSQLParseNode* pOptOnly = CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only)); + pOptOnly->append($1); + pOptOnly->append($2 = CREATE_NODE("ALL", SQL_NODE_NAME)); + $$->append(pOptOnly); + $$->append($3); } ; diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l index 9068f2ee43a..b990de105f6 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l @@ -285,7 +285,7 @@ WINDOW {SQL_NEW_KEYWORD(SQL_TOKEN_WINDOW); } [-+*/%:(),.;?{}&|~] { return yytext[0]; } -[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_][A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_0-9]* {return gatherName(yyscanner, yytext);} +(?-i:[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_][A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_0-9]*) {return gatherName(yyscanner, yytext);} ([0-9]+) {SQL_NEW_INTNUM; } (0[Xx][0-9a-fA-F]+) {SQL_NEW_INTNUM; } @@ -296,7 +296,7 @@ WINDOW {SQL_NEW_KEYWORD(SQL_TOKEN_WINDOW); } [0-9]+"."[0-9]*[eE][+-]?[0-9]+ | "."[0-9]+[eE][+-]?[0-9]+ {SQL_NEW_APPROXNUM; } -[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375][A-Za-z0-9_%.,*?\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375]* {return gatherNamePre(yyscanner,yytext);} +(?-i:[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375][A-Za-z0-9_%.,*?\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375]*) {return gatherNamePre(yyscanner,yytext);} ([0-9]+) {SQL_NEW_INTNUM; } ([0-9]{1,3}(","[0-9]{3})+) {SQL_NEW_INTNUM; } diff --git a/iModelCore/ECDb/PublicAPI/ECDb/ECDb.h b/iModelCore/ECDb/PublicAPI/ECDb/ECDb.h index e2d8fee82a3..a5b46f08309 100644 --- a/iModelCore/ECDb/PublicAPI/ECDb/ECDb.h +++ b/iModelCore/ECDb/PublicAPI/ECDb/ECDb.h @@ -323,7 +323,7 @@ struct EXPORT_VTABLE_ATTRIBUTE ECDb : Db // e.g. Remove a sql function or change required argument or format of its return value. // Sub1: Backward compatible change to 'Syntax'. For example adding new syntax/functions but not breaking any existing. // Sub2: Backward compatible change to 'Runtime'. For example adding a new sql function. - static BeVersion GetECSqlVersion() { return BeVersion(2, 0, 3, 2); } + static BeVersion GetECSqlVersion() { return BeVersion(2, 0, 4, 0); } //! Gets the current version of the ECDb profile static ProfileVersion CurrentECDbProfileVersion() { return ProfileVersion(4, 0, 0, 5); } diff --git a/iModelCore/ECDb/Scripts/BuildECSqlParser.bat b/iModelCore/ECDb/Scripts/BuildECSqlParser.bat index fbde0437dc7..b87a9f1de24 100644 --- a/iModelCore/ECDb/Scripts/BuildECSqlParser.bat +++ b/iModelCore/ECDb/Scripts/BuildECSqlParser.bat @@ -38,5 +38,7 @@ ECHO Compiling Lexical Analyzer ... %flex_tool% -i -8 -PSQLyy -L -o%parse_dir%\SqlFlex.cpp %parse_dir%\SQLflex.l ECHO Compiling Parser ... -%bison_tool% -k -l -pSQLyy -bSql -o %parse_dir%\SqlBison.cpp --defines=%parse_dir%\SqlBison.h %parse_dir%\SQlbison.y +REM The inherited SQL grammar has many expected shift/reduce and reduce/reduce conflicts +REM that are resolved by bison defaults; -Wno-conflicts-sr/-rr silence those warnings. +%bison_tool% -k -l -pSQLyy -bSql -Wno-conflicts-sr -Wno-conflicts-rr -o %parse_dir%\SqlBison.cpp --defines=%parse_dir%\SqlBison.h %parse_dir%\SQlbison.y diff --git a/iModelCore/ECDb/Scripts/BuildECSqlParser.sh b/iModelCore/ECDb/Scripts/BuildECSqlParser.sh index a2a45e0ca32..f1421fe89f9 100755 --- a/iModelCore/ECDb/Scripts/BuildECSqlParser.sh +++ b/iModelCore/ECDb/Scripts/BuildECSqlParser.sh @@ -99,15 +99,23 @@ echo "Compiling Lexical Analyzer ..." # --------------------------------------------------------------------------- # Compile Parser (mirrors: win_bison -k -l -pSQLyy -bSql -o ... --defines=...) -# -l / --no-lines suppress #line directives -# -pSQLyy prefix all yy symbols with SQLyy -# -bSql file-prefix (not needed when -o/--defines are explicit, -# but kept for parity with the .bat) +# -l / --no-lines suppress #line directives +# -pSQLyy prefix all yy symbols with SQLyy +# -bSql file-prefix (not needed when -o/--defines are explicit, +# but kept for parity with the .bat) +# -Wno-conflicts-sr silence the grammar's known shift/reduce conflicts +# -Wno-conflicts-rr silence the grammar's known reduce/reduce conflicts # Note: -k (report conflicts as errors) was a very old flag; modern bison # ignores it, so it is omitted here. +# Note: this is an inherited (OpenOffice/LibreOffice) SQL grammar whose many +# shift/reduce and reduce/reduce conflicts are resolved by bison's default +# rules and are expected. They cannot be declared away with %expect / +# %expect-rr (%expect-rr is GLR-only, and %expect makes the reduce/reduce +# conflicts a hard error on this LALR parser), so the warnings are +# suppressed here without altering the generated parser tables. # --------------------------------------------------------------------------- echo "Compiling Parser ..." -"$BISON" -l -pSQLyy -bSql \ +"$BISON" -l -pSQLyy -bSql -Wno-conflicts-sr -Wno-conflicts-rr \ -o "$PARSE_DIR/SqlBison.cpp" \ --defines="$PARSE_DIR/SqlBison.h" \ "$PARSE_DIR/sqlbison.y" diff --git a/iModelCore/ECDb/Tests/NonPublished/ECDbTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECDbTests.cpp index dc5819276e3..6f69f748d94 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECDbTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECDbTests.cpp @@ -689,7 +689,7 @@ TEST_F(ECDbTestFixture, GetAndChangeGUIDForDb) //+---------------+---------------+---------------+---------------+---------------+------ TEST_F(ECDbTestFixture, CurrentECSqlVersion) { - BeVersion expectedVersion (2, 0, 3, 2); + BeVersion expectedVersion (2, 0, 4, 0); ASSERT_EQ(ECDb::GetECSqlVersion(), expectedVersion); } diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp index aec08be534d..6f3579fda56 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp @@ -1719,8 +1719,20 @@ TEST_F(ECSqlSelectPrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE i>=:myParam")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE I IS 123")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B IS TRUE")); + // a parenthesized qualified property reference '(alias.prop)' is a value expression (null-safe + // comparison), not the '(ClassName)' type predicate, when the name does not resolve to a class. + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS (P.I)")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P p WHERE p.I IS (p.I)")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P p WHERE p.I IS NOT (p.I)")); + // a parenthesized qualified name that resolves to neither a class nor an existing property is an + // error: it is not a class (so it is not a type predicate) and it falls through + // TryParseParenthesizedNameAsValueExp to a PropertyNameExp that then fails property resolution - + // it is not silently accepted. + EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE I IS (P.NonExistentProp)")); + EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P p WHERE p.I IS NOT (p.NonExistentProp)")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE 8 % 3 = 2")); @@ -1781,8 +1793,8 @@ TEST_F(ECSqlSelectPrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL = NULL")); // NULL = NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS 123")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS NOT 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS NOT 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL <> 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B = NULL")); // = NULL always returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B <> NULL")); // <> NULL always returns NULL @@ -1794,8 +1806,8 @@ TEST_F(ECSqlSelectPrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE S IS NOT NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B IS NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE I IS ?")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE I IS NOT ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS NOT ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE ? = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL = ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE ? <> NULL")); @@ -2929,7 +2941,8 @@ TEST_F(ECSqlUpdatePrepareTests, WhereBasics) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE i>=:myParam")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS 123")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -2989,8 +3002,8 @@ TEST_F(ECSqlUpdatePrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL = NULL")); // NULL = NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS 123")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS NOT 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS NOT 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL <> 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B = NULL")); // = NULL always returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B <> NULL")); // <> NULL always returns NULL @@ -3002,8 +3015,8 @@ TEST_F(ECSqlUpdatePrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE S IS NOT NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B IS NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS ?")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS NOT ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS NOT ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE ? = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL = ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE ? <> NULL")); @@ -3052,7 +3065,8 @@ TEST_F(ECSqlUpdatePrepareTests, MiscellaneousWithALL) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE i>=:myParam")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE I IS 123")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -3072,7 +3086,7 @@ TEST_F(ECSqlUpdatePrepareTests, MiscellaneousWithALL) EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL = NULL")); // NULL = NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL IS 123")); //Structs EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.PSA SET I=? WHERE PStructProp IS NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.PSA SET I=? WHERE PStructProp IS NOT NULL")); @@ -3420,7 +3434,8 @@ TEST_F(ECSqlDeletePrepareTests, WhereBasics) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE i>=:myParam")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE I IS 123")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -3480,8 +3495,8 @@ TEST_F(ECSqlDeletePrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL = NULL")); // NULL = NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE NULL IS 123")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE NULL IS NOT 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL IS NOT 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL <> 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B = NULL")); // = NULL always returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B <> NULL")); // <> NULL always returns NULL @@ -3493,8 +3508,8 @@ TEST_F(ECSqlDeletePrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE S IS NOT NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B IS NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE I IS ?")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE I IS NOT ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE I IS ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE I IS NOT ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE ? = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL = ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE ? <> NULL")); @@ -3540,7 +3555,8 @@ TEST_F(ECSqlDeletePrepareTests, MiscellaneousWithALL) EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE Glob('*amp*',S)")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NOT Glob('*amp*',S)")); //case insensitive tests - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ALL ecsql.P WHERE I IS 123")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -3568,8 +3584,8 @@ TEST_F(ECSqlDeletePrepareTests, MiscellaneousWithALL) //NULL tests EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS 123")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS NOT 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS NOT 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL <> 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE B = NULL")); // = NULL always returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE B <> NULL")); // <> NULL always returns NULL diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp index 53505a3b27b..89e13983b2e 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp @@ -4207,6 +4207,119 @@ TEST_F(ECSqlStatementTestFixture, WrapWhereClauseInParams) ASSERT_TRUE(nativeSql.find("WHERE ([Customer].[Country]='USA' OR [Customer].[Country]='DUBAI' AND [Customer].[ContactTitle]='AM')") != nativeSql.npos); } +/*---------------------------------------------------------------------------------**//** +* @bsimethod ++---------------+---------------+---------------+---------------+---------------+------*/ +TEST_F(ECSqlStatementTestFixture, IsAndIsNotOperatorNullSafeSemantics) + { + ASSERT_EQ(BentleyStatus::SUCCESS, SetupECDb("IsOperatorSemantics.ecdb", SchemaItem( + R"xml( + + + + + + + + + + + + + + + )xml"))); + + // (S1, S2): equal-nonnull, different, both-null, one-null, the-other-null + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES('a','a',ts.Status.Active,'a')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES('a','b',ts.Status.Inactive,'b')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES(NULL,NULL,ts.Status.Active,NULL)")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES(NULL,'b',NULL,'b')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES('a',NULL,ts.Status.Active,NULL)")); + + auto count = [this](Utf8CP whereClause) -> int + { + ECSqlStatement stmt; + EXPECT_EQ(ECSqlStatus::Success, stmt.Prepare(m_ecdb, Utf8PrintfString("SELECT COUNT(*) FROM ts.Foo WHERE %s", whereClause).c_str())) << whereClause; + EXPECT_EQ(BE_SQLITE_ROW, stmt.Step()) << whereClause; + return stmt.GetValueInt(0); + }; + + // same as 'count' but with an explicit range alias 'f', so 'f.' references can be used + auto countAliased = [this](Utf8CP whereClause) -> int + { + ECSqlStatement stmt; + EXPECT_EQ(ECSqlStatus::Success, stmt.Prepare(m_ecdb, Utf8PrintfString("SELECT COUNT(*) FROM ts.Foo f WHERE %s", whereClause).c_str())) << whereClause; + EXPECT_EQ(BE_SQLITE_ROW, stmt.Step()) << whereClause; + return stmt.GetValueInt(0); + }; + + // null-safe equality: matches ('a','a') and (NULL,NULL) + EXPECT_EQ(2, count("S1 IS S2")); + // null-safe inequality: matches ('a','b'), (NULL,'b'), ('a',NULL) + EXPECT_EQ(3, count("S1 IS NOT S2")); + // contrast: regular '=' treats NULL comparisons as unknown -> only ('a','a') + EXPECT_EQ(1, count("S1 = S2")); + // NULL literal operand on either side + EXPECT_EQ(2, count("S1 IS NULL")); + EXPECT_EQ(3, count("S1 IS NOT NULL")); + EXPECT_EQ(2, count("NULL IS S2")); + + // the operands may be any value expression, not just a column or NULL literal: + // string literal on the right-hand side + EXPECT_EQ(3, count("S1 IS 'a'")); + EXPECT_EQ(2, count("S1 IS NOT 'a'")); + // function call on the right-hand side (LOWER(S2) equals S2 for these lowercase values) + EXPECT_EQ(2, count("S1 IS LOWER(S2)")); + EXPECT_EQ(3, count("S1 IS NOT LOWER(S2)")); + // function call on the left-hand side + EXPECT_EQ(2, count("LOWER(S1) IS S2")); + // a parenthesized unqualified name is a value expression here, not a type predicate + EXPECT_EQ(2, count("S1 IS (S2)")); + // a parenthesized *qualified* property reference '(alias.prop)' is likewise a value expression + // (null-safe comparison), not the '(ClassName)' type predicate: the name does not resolve to a + // class, so it is reread as the property 'alias.prop'. + EXPECT_EQ(2, count("S1 IS (Foo.S2)")); // implicit class-name range qualifier + EXPECT_EQ(3, count("S1 IS NOT (Foo.S2)")); + EXPECT_EQ(2, countAliased("f.S1 IS (f.S2)")); // explicit range alias + EXPECT_EQ(3, countAliased("f.S1 IS NOT (f.S2)")); + // three-part names can also be value expressions: a nested property reference or an enum literal + EXPECT_EQ(2, countAliased("f.S1 IS (f.Info.Code)")); + EXPECT_EQ(3, countAliased("f.S1 IS NOT (f.Info.Code)")); + EXPECT_EQ(3, count("Status IS (ts.Status.Active)")); + EXPECT_EQ(2, count("Status IS NOT (ts.Status.Active)")); + // regression: a parenthesized name that *is* a class keeps the '(ClassName)' type-predicate meaning + EXPECT_EQ(5, count("ECClassId IS (ts.Foo)")); // every row is a ts.Foo instance + EXPECT_EQ(0, count("ECClassId IS NOT (ts.Foo)")); + + // parameter on the right-hand side, bound to a value and to NULL (null-safe both ways) + { + ECSqlStatement stmt; + ASSERT_EQ(ECSqlStatus::Success, stmt.Prepare(m_ecdb, "SELECT COUNT(*) FROM ts.Foo WHERE S1 IS ?")); + ASSERT_EQ(ECSqlStatus::Success, stmt.BindText(1, "a", IECSqlBinder::MakeCopy::No)); + ASSERT_EQ(BE_SQLITE_ROW, stmt.Step()); + EXPECT_EQ(3, stmt.GetValueInt(0)) << "S1 IS ? bound to 'a'"; + stmt.Reset(); + stmt.ClearBindings(); + ASSERT_EQ(ECSqlStatus::Success, stmt.BindNull(1)); + ASSERT_EQ(BE_SQLITE_ROW, stmt.Step()); + EXPECT_EQ(2, stmt.GetValueInt(0)) << "S1 IS ? bound to NULL"; + } + + // operands of incompatible types are rejected (string vs point) + ECSqlStatement bad; + EXPECT_NE(ECSqlStatus::Success, bad.Prepare(m_ecdb, "SELECT 1 FROM ts.Foo WHERE S1 IS P1")); + + // a parenthesized qualified name that resolves to neither a class nor an existing property/enumerator + // is rejected at prepare time (it falls through to a property reference that fails to resolve): + ECSqlStatement badProp; + EXPECT_NE(ECSqlStatus::Success, badProp.Prepare(m_ecdb, "SELECT 1 FROM ts.Foo WHERE S1 IS (Foo.NonExistentProp)")); + // enum whose enumerator does not exist: the enum is found but the enumerator is not, so it is not a + // silent pass either + ECSqlStatement badEnum; + EXPECT_NE(ECSqlStatus::Success, badEnum.Prepare(m_ecdb, "SELECT 1 FROM ts.Foo WHERE Status IS (ts.Status.DoesNotExist)")); + } + //--------------------------------------------------------------------------------------- // @bsimethod //+---------------+---------------+---------------+---------------+---------------+------ diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp index ebae5bb1413..142248d7281 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp @@ -1274,4 +1274,96 @@ TEST_F(ECSqlToSqlGenerationTests, SelectOnlyRequiredPropertiesOnSelfJoin) ASSERT_EQ(BE_SQLITE_ROW, sqlStmt.Step()); } } + +//--------------------------------------------------------------------------------------- +// @bsimethod +//+---------------+---------------+---------------+---------------+---------------+------ +TEST_F(ECSqlToSqlGenerationTests, IsAndIsNotOperatorBetweenOperands) + { + ASSERT_EQ(BentleyStatus::SUCCESS, SetupECDb("IsAndIsNotOperator.ecdb", SchemaItem( + R"xml( + + + + + + + + + + + + + + + + + + + + + )xml"))); + + auto assertWhere = [this](Utf8CP ecsql, Utf8CP expectedWhereClause) + { + Utf8String sql = GetHelper().ECSqlToSql(ecsql); + EXPECT_TRUE(sql.Contains(expectedWhereClause)) << "ECSql: " << ecsql << "\nSql: " << sql.c_str() + << "\nExpected to contain: " << expectedWhereClause; + }; + + // single primitive column operands: IS -> "IS", IS NOT -> "IS NOT" (space wrapped) + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS S2", "WHERE [Foo].[S1] IS [Foo].[S2]"); + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NOT S2", "WHERE [Foo].[S1] IS NOT [Foo].[S2]"); + + // NULL literal on either side (the new general path and the existing test_for_null path) + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NULL", "WHERE [Foo].[S1] IS NULL"); + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NOT NULL", "WHERE [Foo].[S1] IS NOT NULL"); + assertWhere("SELECT 1 FROM ts.Foo WHERE NULL IS S1", "WHERE NULL IS [Foo].[S1]"); + + // multi-column point operands: IS expands column-wise with AND, IS NOT with OR + assertWhere("SELECT 1 FROM ts.Foo WHERE P1 IS P2", + "WHERE ([Foo].[P1_X] IS [Foo].[P2_X] AND [Foo].[P1_Y] IS [Foo].[P2_Y] AND [Foo].[P1_Z] IS [Foo].[P2_Z])"); + assertWhere("SELECT 1 FROM ts.Foo WHERE P1 IS NOT P2", + "WHERE ([Foo].[P1_X] IS NOT [Foo].[P2_X] OR [Foo].[P1_Y] IS NOT [Foo].[P2_Y] OR [Foo].[P1_Z] IS NOT [Foo].[P2_Z])"); + + // multi-column navigation operands: IS expands column-wise with AND, IS NOT with OR + assertWhere("SELECT 1 FROM ts.Foo WHERE ParentA IS ParentB", + "WHERE ([Foo].[ParentAId] IS [Foo].[ParentBId] AND [Foo].[ParentARelECClassId] IS [Foo].[ParentBRelECClassId])"); + assertWhere("SELECT 1 FROM ts.Foo WHERE ParentA IS NOT ParentB", + "WHERE ([Foo].[ParentAId] IS NOT [Foo].[ParentBId] OR [Foo].[ParentARelECClassId] IS NOT [Foo].[ParentBRelECClassId])"); + + // the operands may be any value expression, not just a column or NULL literal + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS 'abc'", "WHERE [Foo].[S1] IS 'abc'"); + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NOT 'abc'", "WHERE [Foo].[S1] IS NOT 'abc'"); + assertWhere("SELECT 1 FROM ts.Foo WHERE 'abc' IS S1", "WHERE 'abc' IS [Foo].[S1]"); + + // regression: the existing IS (ClassName) type predicate is unaffected + EXPECT_TRUE(GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ts.Foo)").Contains("ec_cache_ClassHierarchy")); + + // a parenthesized qualified property reference '(alias.prop)' is a value expression (null-safe + // comparison), not the (ClassName) type predicate, because the name does not resolve to a class + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS (Foo.S2)", "WHERE [Foo].[S1] IS [Foo].[S2]"); + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NOT (Foo.S2)", "WHERE [Foo].[S1] IS NOT [Foo].[S2]"); + // multi-column point operand still expands column-wise through the parenthesized property reference + assertWhere("SELECT 1 FROM ts.Foo WHERE P1 IS (Foo.P2)", + "WHERE ([Foo].[P1_X] IS [Foo].[P2_X] AND [Foo].[P1_Y] IS [Foo].[P2_Y] AND [Foo].[P1_Z] IS [Foo].[P2_Z])"); + + // regression: the type_list_item grammar refactor (opt_only is now inlined into three explicit + // alternatives) must keep the ONLY / ALL and comma-separated type-list forms routing through the + // type-predicate path - not TryParseParenthesizedNameAsValueExp, which would reinterpret the + // parenthesized name as a value expression. An ONLY (non-polymorphic) list is optimized to an + // exact 'IN ()' filter and does not use ec_cache_ClassHierarchy; a polymorphic + // comma-separated list resolves through ec_cache_ClassHierarchy. + { + Utf8String onlySql = GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ONLY ts.Foo)"); + EXPECT_FALSE(onlySql.empty()) << "IS (ONLY ts.Foo) must prepare as a type predicate"; + EXPECT_FALSE(onlySql.Contains("ec_cache_ClassHierarchy")) << "ONLY is a non-polymorphic exact match: " << onlySql; + + Utf8String onlyListSql = GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ONLY ts.Foo, ONLY ts.Bar)"); + EXPECT_FALSE(onlyListSql.empty()) << "IS (ONLY ts.Foo, ONLY ts.Bar) must prepare as a type predicate"; + EXPECT_FALSE(onlyListSql.Contains("ec_cache_ClassHierarchy")) << "an all-exact type list is optimized: " << onlyListSql; + } + EXPECT_TRUE(GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ts.Foo, ts.Bar)").Contains("ec_cache_ClassHierarchy")); + EXPECT_TRUE(GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS NOT (ts.Foo, ts.Bar)").Contains("ec_cache_ClassHierarchy")); + } END_ECDBUNITTESTS_NAMESPACE