From 6fe60302687bacb8c8d0c7b494b29a061f4c99d9 Mon Sep 17 00:00:00 2001 From: leego Date: Sun, 15 Aug 2021 18:37:43 +0800 Subject: [PATCH] [Polish] Support for annotation `@Param` with a single object, and fix few bugs. --- README.ZH_CN.md | 16 +- README.md | 18 +- docs/STARTER_USERGUIDE.ZH_CN.md | 109 - docs/STARTER_USERGUIDE.md | 109 - docs/USERGUIDE.ZH_CN.md | 730 - docs/USERGUIDE.md | 730 - mypages-samples/mypages-sample-java/pom.xml | 37 + .../mypages/sample/MyPagesApplication.java | 72 + .../io/leego/mypages/sample/entity/User.java | 72 + .../mypages/sample/mapper/UserMapper.java | 15 + .../mypages-sample-mybatis-plus/pom.xml | 41 + .../mypages/sample/MyPagesApplication.java | 29 + .../io/leego/mypages/sample/entity/User.java | 72 + .../mypages/sample/mapper/UserMapper.java | 18 + .../src/main/resources/application.properties | 19 + .../pom.xml | 41 + .../mypages/sample/MyPagesApplication.java | 29 + .../io/leego/mypages/sample/entity/User.java | 72 + .../mypages/sample/mapper/UserMapper.java | 17 + .../src/main/resources/application.properties | 19 + .../mypages-sample-spring-boot/pom.xml | 45 + .../mypages/sample/MyPagesApplication.java | 57 + .../io/leego/mypages/sample/entity/User.java | 72 + .../mypages/sample/mapper/UserMapper.java | 17 + .../src/main/resources/application.properties | 11 + mypages-samples/mypages-sample-spring/pom.xml | 69 + .../mypages/sample/MyPagesApplication.java | 27 + .../io/leego/mypages/sample/entity/User.java | 72 + .../mypages/sample/mapper/UserMapper.java | 15 + .../src/main/resources/application.properties | 4 + .../src/main/resources/spring/spring.xml | 49 + mypages-samples/pom.xml | 81 + mypages-samples/resources/ddl.sql | 12 + mypages-samples/resources/dml.sql | 27 + mypages-spring-boot-autoconfigure/pom.xml | 51 + .../MyPagesAutoConfiguration.java | 41 + .../boot/autoconfigure/MyPagesProperties.java | 11 + .../main/resources/META-INF/spring.factories | 1 + mypages-spring-boot-starter/README.ZH_CN.md | 89 + mypages-spring-boot-starter/README.md | 89 + mypages-spring-boot-starter/pom.xml | 18 +- .../MyPagesAutoConfiguration.java | 85 - .../autoconfigure/MyPagesProperties.java | 171 - .../main/resources/META-INF/spring.factories | 1 - mypages-test/pom.xml | 46 + .../mypages/test/MyPagesTestApplication.java | 16 + .../mypages/test/dto/CustomClassParam.java | 67 + .../mypages/test/dto/CustomCountParam.java | 53 + .../mypages/test/dto/CustomMapParam.java | 9 + .../leego/mypages/test/dto/PageableParam.java | 73 + .../test/dto/PaginationFieldParam.java | 78 + .../test/dto/PaginationMethodParam.java | 78 + .../io/leego/mypages/test/entity/User.java | 85 + .../mypages/test/enums/UserStatusEnum.java | 19 + .../leego/mypages/test/mapper/UserMapper.java | 99 + .../src/main/resources/application.properties | 23 + mypages-test/src/main/resources/sql/ddl.sql | 12 + mypages-test/src/main/resources/sql/dml.sql | 27 + .../specification/CollectionMapTests.java | 179 + .../test/specification/CustomClassTests.java | 173 + .../test/specification/CustomCountTests.java | 59 + .../test/specification/CustomMapTests.java | 178 + .../test/specification/MybatisParamTests.java | 116 + .../test/specification/PageableTests.java | 161 + .../specification/PaginationFieldTests.java | 161 + .../specification/PaginationMethodTests.java | 161 + .../io/leego/mypages/test/sql/SqlTests.java | 296 + mypages/README.ZH_CN.md | 787 + mypages/README.md | 787 + mypages/pom.xml | 6 +- .../mypages/dialect/AbstractDialect.java | 140 +- .../io/leego/mypages/dialect/DB2Dialect.java | 6 +- .../io/leego/mypages/dialect/Database.java | 107 + .../leego/mypages/dialect/DerbyDialect.java | 6 +- .../io/leego/mypages/dialect/Dialect.java | 15 +- .../io/leego/mypages/dialect/H2Dialect.java | 22 + .../leego/mypages/dialect/HSQLDBDialect.java | 22 + .../io/leego/mypages/dialect/HiveDialect.java | 24 + .../mypages/dialect/InformixDialect.java | 8 +- .../leego/mypages/dialect/MariaDBDialect.java | 22 + .../leego/mypages/dialect/MySQLDialect.java | 6 +- .../leego/mypages/dialect/OracleDialect.java | 6 +- .../leego/mypages/dialect/PhoenixDialect.java | 22 + .../mypages/dialect/PostgreSQLDialect.java | 6 +- .../mypages/dialect/SQLServerDialect.java | 22 + .../leego/mypages/dialect/SQLiteDialect.java | 22 + .../io/leego/mypages/dialect/SqlDialect.java | 78 - .../io/leego/mypages/dialect/TiDBDialect.java | 22 + .../mypages/exception/DialectException.java | 41 + .../exception/SqlDialectException.java | 41 - .../interceptor/PaginationInterceptor.java | 611 +- .../interceptor/PaginationSettings.java | 224 +- .../src/main/java/io/leego/mypages/sql/SQL.g4 | 1933 ++ .../main/java/io/leego/mypages/sql/SQL.interp | 767 + .../main/java/io/leego/mypages/sql/SQL.tokens | 334 + .../io/leego/mypages/sql/SQLBaseListener.java | 3410 +++ .../io/leego/mypages/sql/SQLBaseVisitor.java | 1980 ++ .../java/io/leego/mypages/sql/SQLLexer.interp | 965 + .../java/io/leego/mypages/sql/SQLLexer.java | 1694 ++ .../java/io/leego/mypages/sql/SQLLexer.tokens | 334 + .../io/leego/mypages/sql/SQLListener.java | 3135 +++ .../java/io/leego/mypages/sql/SQLParser.java | 22587 ++++++++++++++++ .../java/io/leego/mypages/sql/SQLVisitor.java | 1856 ++ .../java/io/leego/mypages/util/BeanUtils.java | 488 - .../main/java/io/leego/mypages/util/Page.java | 22 +- .../java/io/leego/mypages/util/Pageable.java | 8 +- ...edParam.java => PaginationDefinition.java} | 100 +- ...ionParam.java => PaginationParameter.java} | 27 +- .../io/leego/mypages/util/ReflectUtils.java | 489 - .../io/leego/mypages/util/Replacement.java | 39 + .../java/io/leego/mypages/util/SqlUtils.java | 338 +- .../io/leego/mypages/util/StringUtils.java | 50 - pom.xml | 65 +- 113 files changed, 45404 insertions(+), 3819 deletions(-) delete mode 100644 docs/STARTER_USERGUIDE.ZH_CN.md delete mode 100644 docs/STARTER_USERGUIDE.md delete mode 100644 docs/USERGUIDE.ZH_CN.md delete mode 100644 docs/USERGUIDE.md create mode 100644 mypages-samples/mypages-sample-java/pom.xml create mode 100644 mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/MyPagesApplication.java create mode 100644 mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/entity/User.java create mode 100644 mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java create mode 100644 mypages-samples/mypages-sample-mybatis-plus/pom.xml create mode 100644 mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/MyPagesApplication.java create mode 100644 mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/entity/User.java create mode 100644 mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java create mode 100644 mypages-samples/mypages-sample-mybatis-plus/src/main/resources/application.properties create mode 100644 mypages-samples/mypages-sample-spring-boot-starter/pom.xml create mode 100644 mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/MyPagesApplication.java create mode 100644 mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/entity/User.java create mode 100644 mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java create mode 100644 mypages-samples/mypages-sample-spring-boot-starter/src/main/resources/application.properties create mode 100644 mypages-samples/mypages-sample-spring-boot/pom.xml create mode 100644 mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/MyPagesApplication.java create mode 100644 mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/entity/User.java create mode 100644 mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java create mode 100644 mypages-samples/mypages-sample-spring-boot/src/main/resources/application.properties create mode 100644 mypages-samples/mypages-sample-spring/pom.xml create mode 100644 mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/MyPagesApplication.java create mode 100644 mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/entity/User.java create mode 100644 mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java create mode 100644 mypages-samples/mypages-sample-spring/src/main/resources/application.properties create mode 100644 mypages-samples/mypages-sample-spring/src/main/resources/spring/spring.xml create mode 100644 mypages-samples/pom.xml create mode 100644 mypages-samples/resources/ddl.sql create mode 100644 mypages-samples/resources/dml.sql create mode 100644 mypages-spring-boot-autoconfigure/pom.xml create mode 100644 mypages-spring-boot-autoconfigure/src/main/java/io/leego/mypages/spring/boot/autoconfigure/MyPagesAutoConfiguration.java create mode 100644 mypages-spring-boot-autoconfigure/src/main/java/io/leego/mypages/spring/boot/autoconfigure/MyPagesProperties.java create mode 100644 mypages-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories create mode 100644 mypages-spring-boot-starter/README.ZH_CN.md create mode 100644 mypages-spring-boot-starter/README.md delete mode 100644 mypages-spring-boot-starter/src/main/java/io/leego/mypages/autoconfigure/MyPagesAutoConfiguration.java delete mode 100644 mypages-spring-boot-starter/src/main/java/io/leego/mypages/autoconfigure/MyPagesProperties.java delete mode 100644 mypages-spring-boot-starter/src/main/resources/META-INF/spring.factories create mode 100644 mypages-test/pom.xml create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/MyPagesTestApplication.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/dto/CustomClassParam.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/dto/CustomCountParam.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/dto/CustomMapParam.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/dto/PageableParam.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/dto/PaginationFieldParam.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/dto/PaginationMethodParam.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/entity/User.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/enums/UserStatusEnum.java create mode 100644 mypages-test/src/main/java/io/leego/mypages/test/mapper/UserMapper.java create mode 100644 mypages-test/src/main/resources/application.properties create mode 100644 mypages-test/src/main/resources/sql/ddl.sql create mode 100644 mypages-test/src/main/resources/sql/dml.sql create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/specification/CollectionMapTests.java create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/specification/CustomClassTests.java create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/specification/CustomCountTests.java create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/specification/CustomMapTests.java create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/specification/MybatisParamTests.java create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/specification/PageableTests.java create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/specification/PaginationFieldTests.java create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/specification/PaginationMethodTests.java create mode 100644 mypages-test/src/test/java/io/leego/mypages/test/sql/SqlTests.java create mode 100644 mypages/README.ZH_CN.md create mode 100644 mypages/README.md create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/Database.java create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/H2Dialect.java create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/HSQLDBDialect.java create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/HiveDialect.java create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/MariaDBDialect.java create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/PhoenixDialect.java create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/SQLServerDialect.java create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/SQLiteDialect.java delete mode 100644 mypages/src/main/java/io/leego/mypages/dialect/SqlDialect.java create mode 100644 mypages/src/main/java/io/leego/mypages/dialect/TiDBDialect.java create mode 100644 mypages/src/main/java/io/leego/mypages/exception/DialectException.java delete mode 100644 mypages/src/main/java/io/leego/mypages/exception/SqlDialectException.java create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQL.g4 create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQL.interp create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQL.tokens create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQLBaseListener.java create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQLBaseVisitor.java create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQLLexer.interp create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQLLexer.java create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQLLexer.tokens create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQLListener.java create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQLParser.java create mode 100644 mypages/src/main/java/io/leego/mypages/sql/SQLVisitor.java delete mode 100644 mypages/src/main/java/io/leego/mypages/util/BeanUtils.java rename mypages/src/main/java/io/leego/mypages/util/{PaginationUnrefinedParam.java => PaginationDefinition.java} (56%) rename mypages/src/main/java/io/leego/mypages/util/{PaginationParam.java => PaginationParameter.java} (68%) delete mode 100644 mypages/src/main/java/io/leego/mypages/util/ReflectUtils.java create mode 100644 mypages/src/main/java/io/leego/mypages/util/Replacement.java delete mode 100644 mypages/src/main/java/io/leego/mypages/util/StringUtils.java diff --git a/README.ZH_CN.md b/README.ZH_CN.md index 42deacd..bee3df9 100644 --- a/README.ZH_CN.md +++ b/README.ZH_CN.md @@ -20,14 +20,14 @@ $ mvn clean install io.leego mypages - 1.1.2 + 2.0.0 ``` ### Gradle ```xml -implementation 'io.leego:mypages:1.1.2' +implementation 'io.leego:mypages:2.0.0' ``` ## 数据库 @@ -36,18 +36,18 @@ implementation 'io.leego:mypages:1.1.2' |:-:|:-:|:-:|:-:|:-:|:-:| |MySQL|✔|PostgreSQL|✔|Oracle|✔| |MariaDB|✔|SQLite|✔|DB2|✔| -|H2|✔|Phoenix|✔|Apache Derby|✔| +|H2|✔|Apache Phoenix|✔|Apache Derby|✔| |HyperSQL|✔|Informix|✔|TiDB|✔| -|SQL Server|✔|Apache Hive|✔| +|Microsoft SQL Server|✔|Apache Hive|✔| ## 文档 [English Document 英文版](README.md) -> * [用户指南 (中文版)](docs/USERGUIDE.ZH_CN.md) -> * [User Guide (English)](docs/USERGUIDE.md) -> * [mypages-spring-boot-starter (中文版)](docs/STARTER_USERGUIDE.ZH_CN.md) -> * [mypages-spring-boot-starter (English)](docs/STARTER_USERGUIDE.md) +> * [用户指南 (中文版)](mypages/README.ZH_CN.md) +> * [User Guide (English)](mypages/README.md) +> * [mypages-spring-boot-starter (中文版)](mypages-spring-boot-starter/README.ZH_CN.md) +> * [mypages-spring-boot-starter (English)](mypages-spring-boot-starter/README.md) ## 交流 diff --git a/README.md b/README.md index 6866b3d..ed1f2b5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Many databases, one plugin. ## Installation -Please make sure the Java version is 1.8 and above. +Please make sure the Java version is 1.8 or above. ```bash $ git clone https://github.com/yihleego/mypages.git @@ -21,14 +21,14 @@ $ mvn clean install io.leego mypages - 1.1.2 + 2.0.0 ``` ### Gradle ```xml -implementation 'io.leego:mypages:1.1.2' +implementation 'io.leego:mypages:2.0.0' ``` ## Supported @@ -37,18 +37,18 @@ implementation 'io.leego:mypages:1.1.2' |:-:|:-:|:-:|:-:|:-:|:-:| |MySQL|✔|PostgreSQL|✔|Oracle|✔| |MariaDB|✔|SQLite|✔|DB2|✔| -|H2|✔|Phoenix|✔|Apache Derby|✔| +|H2|✔|Apache Phoenix|✔|Apache Derby|✔| |HyperSQL|✔|Informix|✔|TiDB|✔| -|SQL Server|✔|Apache Hive|✔| +|Microsoft SQL Server|✔|Apache Hive|✔| ## Documentation [Chinese Document 中文版](README.ZH_CN.md) -> * [User Guide (English)](docs/USERGUIDE.md) -> * [用户指南 (中文版)](docs/USERGUIDE.ZH_CN.md) -> * [mypages-spring-boot-starter (English)](docs/STARTER_USERGUIDE.md) -> * [mypages-spring-boot-starter (中文版)](docs/STARTER_USERGUIDE.ZH_CN.md) +> * [User Guide (English)](mypages/README.md) +> * [用户指南 (中文版)](mypages/README.ZH_CN.md) +> * [mypages-spring-boot-starter (English)](mypages-spring-boot-starter/README.md) +> * [mypages-spring-boot-starter (中文版)](mypages-spring-boot-starter/README.ZH_CN.md) ## Contact diff --git a/docs/STARTER_USERGUIDE.ZH_CN.md b/docs/STARTER_USERGUIDE.ZH_CN.md deleted file mode 100644 index eec92b7..0000000 --- a/docs/STARTER_USERGUIDE.ZH_CN.md +++ /dev/null @@ -1,109 +0,0 @@ -# 1. 简介 - -MyPages是Java实现基于[MyBatis](https://github.com/mybatis/mybatis-3)的开源分页插件,最大程度简化数据库分页查询操作,支持市面上大部分数据库,如:MySQL、PostgreSQL、Oracle、SQLServer等。 - -# 2. 准备工作 - -请确保您的Java版本在1.8及以上。 - -# 3. 依赖 - -## 3.1 Maven - -```xml - - io.leego - mypages-spring-boot-starter - 1.1.2 - -``` - -## 3.2 Gradle - -```xml -implementation 'io.leego:mypages-spring-boot-starter:1.1.2' -``` - -# 4. 配置 - -|Property|Description| -|:-|:-| -|spring.mypages.enabled|是否启用mypages。| -|spring.mypages.sql-dialect|指定sql dialect,如:`MySQL`、`PostgreSQL`、`Oracle`等。| -|spring.mypages.count-expr|设置count字段名称,默认值为`*`。| -|spring.mypages.page-field|从参数字段中获取`page`值。| -|spring.mypages.size-field|从参数字段中获取`size`值。| -|spring.mypages.offset-field|从参数字段中获取`offset`值。| -|spring.mypages.rows-field|从参数字段中获取`rows`值。| -|spring.mypages.count-expr-field|从参数字段中获取count表达式。| -|spring.mypages.count-method-name-field|从参数字段中获取自定义count方法名称。| -|spring.mypages.enable-count-field|从参数字段中判断是否启用count。| -|spring.mypages.skip-query-if-count-equals-zero|是否跳过查询如果结果数量为`0`。| -|spring.mypages.use-generated-if-count-method-is-missing|是否使用自动生成的count方法如果指定count方法不存在。| -|spring.mypages.default-page|如果`page`为空或小于`1`,则用`default-page`替换`page`。| -|spring.mypages.default-size|如果`size`为空或小于`1`,则用`default-size`替换`size`。| -|spring.mypages.max-page|如果`page`大于`max-page`,则用`max-page`替换`page`。| -|spring.mypages.max-size|如果`size`大于`max-size`,则用`max-size`替换`size`。| - -## 示例 - -使用分页参数定义一个类,并配置参数字段名。 - -```java -public class Pageable { - private Integer page; - private Integer size; - private Integer offset; - private Integer rows; - private String countExpr; - private String countMethodName; - private Boolean enableCount; - /* getter setter */ -} -``` - -**请注意sql-dialect必须被配置。** - -Properties - -```properties -spring.mypages.enabled=true -spring.mypages.sql-dialect=MYSQL -spring.mypages.count-expr=* -spring.mypages.page-field=page -spring.mypages.size-field=size -spring.mypages.offset-field=offset -spring.mypages.rows-field=rows -spring.mypages.count-expr-field=countExpr -spring.mypages.count-method-name-field=countMethodName -spring.mypages.enable-count-field=enableCount -spring.mypages.skip-query-if-count-equals-zero=true -spring.mypages.use-generated-if-count-method-is-missing=true -spring.mypages.default-page=1 -spring.mypages.default-size=10 -spring.mypages.max-page=10000 -spring.mypages.max-size=10000 -``` - -Yaml - -```yaml -spring: - mypages: - enabled: true - sql-dialect: MYSQL - count-expr: '*' - page-field: page - size-field: size - offset-field: offset - rows-field: rows - count-expr-field: countExpr - count-method-name-field: countMethodName - enable-count-field: enableCount - skip-query-if-count-equals-zero: true - use-generated-if-count-method-is-missing: true - default-page: 1 - default-size: 10 - max-page: 10000 - max-size: 10000 -``` \ No newline at end of file diff --git a/docs/STARTER_USERGUIDE.md b/docs/STARTER_USERGUIDE.md deleted file mode 100644 index ec12937..0000000 --- a/docs/STARTER_USERGUIDE.md +++ /dev/null @@ -1,109 +0,0 @@ -# 1. Introduction - -MyPages is a java based, open source pagination plugin for [MyBatis](https://github.com/mybatis/mybatis-3) that simplifies database paging queries. - -# 2. Getting Started - -Please make sure the Java version is 1.8 and above. - -# 3. Dependency - -## 3.1 Maven - -```xml - - io.leego - mypages-spring-boot-starter - 1.1.2 - -``` - -## 3.2 Gradle - -```xml -implementation 'io.leego:mypages-spring-boot-starter:1.1.2' -``` - -# 4. Configuration - -|Property|Description| -|:-|:-| -|spring.mypages.enabled|Whether to enable mypages.| -|spring.mypages.sql-dialect|The sql dialect such as `MySQL`, `PostgreSQL`, `Oracle`, etc.| -|spring.mypages.count-expr|The column name or expression, the default value is `*`.| -|spring.mypages.page-field|The `page` field name of the parameter.| -|spring.mypages.size-field|The `size` field name of the parameter.| -|spring.mypages.offset-field|The `offset` field name of the parameter.| -|spring.mypages.rows-field|The `rows` field name of the parameter.| -|spring.mypages.count-expr-field|The count expression field name of the parameter.| -|spring.mypages.count-method-name-field|The `count-method-name` field name of the parameter.| -|spring.mypages.enable-count-field|The `enable-count` field name of the parameter.| -|spring.mypages.skip-query-if-count-equals-zero|Whether to skip query if total value equals zero.| -|spring.mypages.use-generated-if-count-method-is-missing|Whether to use generated if the specified count method is missing.| -|spring.mypages.default-page|Replaces the `page` with `default-page` if the `page` is `null` or less than `1`.| -|spring.mypages.default-size|Replaces the `size` with `default-size` if the `size` is `null` or less than `1`.| -|spring.mypages.max-page|Replaces the `page` with `max-page` if the `page` is greater than `max-page`.| -|spring.mypages.max-size|Replaces the `size` with `max-size` if the `size` is greater than `max-size`.| - -## For example - -Define a class with paging parameters. - -```java -public class Pageable { - private Integer page; - private Integer size; - private Integer offset; - private Integer rows; - private String countExpr; - private String countMethodName; - private Boolean enableCount; - /* getter setter */ -} -``` - -**Please notice that the sql-dialect is required.** - -Properties - -```properties -spring.mypages.enabled=true -spring.mypages.sql-dialect=MYSQL -spring.mypages.count-expr=* -spring.mypages.page-field=page -spring.mypages.size-field=size -spring.mypages.offset-field=offset -spring.mypages.rows-field=rows -spring.mypages.count-expr-field=countExpr -spring.mypages.count-method-name-field=countMethodName -spring.mypages.enable-count-field=enableCount -spring.mypages.skip-query-if-count-equals-zero=true -spring.mypages.use-generated-if-count-method-is-missing=true -spring.mypages.default-page=1 -spring.mypages.default-size=10 -spring.mypages.max-page=10000 -spring.mypages.max-size=10000 -``` - -Yaml - -```yaml -spring: - mypages: - enabled: true - sql-dialect: MYSQL - count-expr: '*' - page-field: page - size-field: size - offset-field: offset - rows-field: rows - count-expr-field: countExpr - count-method-name-field: countMethodName - enable-count-field: enableCount - skip-query-if-count-equals-zero: true - use-generated-if-count-method-is-missing: true - default-page: 1 - default-size: 10 - max-page: 10000 - max-size: 10000 -``` \ No newline at end of file diff --git a/docs/USERGUIDE.ZH_CN.md b/docs/USERGUIDE.ZH_CN.md deleted file mode 100644 index 90942c1..0000000 --- a/docs/USERGUIDE.ZH_CN.md +++ /dev/null @@ -1,730 +0,0 @@ -# 1. 简介 - -MyPages是Java实现基于[MyBatis](https://github.com/mybatis/mybatis-3)的开源分页插件,最大程度简化数据库分页查询操作,支持市面上大部分数据库,如:MySQL、PostgreSQL、Oracle、SQLServer等。 - -# 2. 准备工作 - -请确保您的Java版本在1.8及以上。 - -# 3. 依赖 - -## 3.1 Maven - -```xml - - io.leego - mypages - 1.1.2 - -``` - -## 3.2 Gradle - -```xml -implementation 'io.leego:mypages:1.1.2' -``` - -# 4. 快速设置 - -请注意sql-dialect必须被配置。 - -## 4.1 MyBatis SqlSessionFactoryBean - -```java -PaginationSettings settings = new PaginationSettings(SqlDialect.MYSQL); -PaginationInterceptor paginationInterceptor = new PaginationInterceptor(settings); -Interceptor[] plugins = new Interceptor[]{paginationInterceptor}; -SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); -sqlSessionFactoryBean.setPlugins(plugins); -``` - -## 4.2 Spring - -要在Spring中使用MyBatis,至少需要在Spring应用程序上下文中定义两个东西:SqlSessionFactory对象和至少一个mapper接口。 - -在MyBatis-Spring中,SqlSessionFactoryBean用于创建SqlSessionFactory。要配置工厂bean,请在Spring配置文件中放入以下内容: - -## 4.3 Spring XML - -```xml - - - - - - - - - - - - -``` - -## 4.4 Spring Boot - -```java -@Configuration -public class MybatisConfiguration { - @Bean - public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { - Interceptor[] plugins = new Interceptor[]{paginationInterceptor()}; - SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); - sqlSessionFactoryBean.setDataSource(dataSource); - sqlSessionFactoryBean.setPlugins(plugins); - return sqlSessionFactoryBean.getObject(); - } - - @Bean - public PaginationInterceptor paginationInterceptor() { - PaginationSettings settings = new PaginationSettings(SqlDialect.MYSQL); - return new PaginationInterceptor(settings); - } -} -``` - -## 4.5 Spring Boot Starter - -> * 请使用: [mypages-spring-boot-starter](STARTER_USERGUIDE.ZH_CN.md) - -# 5. 快速开始 - -假设存在如下定义的类: - -```java -import io.leego.mypages.annotation.Pagination; -import io.leego.mypages.annotation.Page; -import io.leego.mypages.annotation.Size; - -@Pagination -public class Pageable { - @Page - private Integer page; - @Size - private Integer size; - - public Pageable(Integer page, Integer size) { - this.page = page; - this.size = size; - } - /* getter setter */ -} -``` - -假设存在如下定义的Mapper: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(Pageable pageable); -} -``` - -调用查询方法: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - return Page.of(fooMapper.query(new Pageable(1, 10))); - } -} -``` - -# 6. 启用分页 - -## 6.1 注解 (推荐) - -使用 `@Pagination`、`@Page`、`@Size`、`@Offset`、`@Rows` 注解. - -```java -@Pagination -public class Pageable { - @Page - private Integer page; - @Size - private Integer size; - @Offset - private Integer offset; - @Rows - private Integer rows; - /* getter setter */ -} -``` - -更多注解: `@CountExpr`、`@CountMethodName`、`@DisableCount`、`@DisablePagination`. - -## 6.2 PaginationInterceptor配置 (推荐) - -配置拦截器: - -```java -PaginationSettings settings = PaginationSettings.builder() - .sqlDialect(SqlDialect.MYSQL) - .pageField("page") - .sizeField("size") - .build(); -PaginationInterceptor interceptor = new PaginationInterceptor(settings); -``` - -### 6.2.1 定义一个分页类 - -假设存在一个带分页参数的类: - -```java -public class Pageable { - private Integer page; - private Integer size; - - public Pageable(Integer page, Integer size) { - this.page = page; - this.size = size; - } - /* getter setter */ -} -``` - -假设存在如下定义的Mapper: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(Pageable pageable); -} -``` - -调用查询方法: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - return Page.of(fooMapper.query(new Pageable(1, 10))); - } -} -``` - -### 6.2.2 MyBatis `@Param` - -假设存在如下定义的Mapper: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(@Param("page") Integer page, @Param("size") Integer size); -} -``` - -调用查询方法: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - return Page.of(fooMapper.query(1, 10)); - } -} -``` - -### 6.2.3 Map - -假设存在如下定义的Mapper: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(Map map); -} -``` - -调用查询方法: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - Map map = new HashMap<>(); - map.put("size", 1); - map.put("page", 10); - return Page.of(fooMapper.query(map)); - } -} -``` - -### 更多配置 - -```java -PaginationSettings settings = PaginationSettings.builder() - .sqlDialect(SqlDialect.MYSQL) // 指定SqlDialect。 - .countExpr("*") // 设置count字段名称,默认值为"*"。 - .pageField("page") // 从参数字段中获取page值。 - .sizeField("size") // 从参数字段中获取size值。 - .offsetField("offset") // 从参数字段中获取offset值。 - .rowsField("rows") // 从参数字段中获取rows值。 - .countExprField("countExpr") // 从参数字段中获取count表达式。 - .countMethodNameField("countMethodName") // 从参数字段中获取自定义count方法名称。 - .enableCountField("enableCount") // 从参数字段中判断是否启用count。 - .skipQueryIfCountEqualsZero(true) // 是否跳过查询如果总数量为0。 - .useGeneratedIfCountMethodIsMissing(true) // 是否使用自动生成的count方法如果指定count方法不存在。 - .defaultPage(1) // 如果page为空或小于1,则用default-page替换page。 - .defaultSize(10) // 如果size为空或小于1,则用default-size替换size。 - .maxPage(10000) // 如果page大于max-page,则用max-page替换page。 - .maxSize(10000) // 如果size大于max-size,则用max-size替换size。 - .build(); -PaginationInterceptor interceptor = new PaginationInterceptor(settings); -``` - -## 6.3 实现 `io.leego.mypages.util.Pageable` - -定义一个实现 `io.leego.mypages.util.Pageable`接口的类. - -```java -public class PageRequest implements io.leego.mypages.util.Pageable { - private Integer page; - private Integer size; - private Integer offset; - private Integer rows; - - @Override - public Integer getPage() { - return page; - } - - public void setPage(Integer page) { - this.page = page; - } - - @Override - public Integer getSize() { - return size; - } - - public void setSize(Integer size) { - this.size = size; - } - - @Override - public Integer getOffset() { - return offset; - } - - public void setOffset(Integer offset) { - this.offset = offset; - } - - @Override - public Integer getRows() { - return rows; - } - - public void setRows(Integer rows) { - this.rows = rows; - } -} -``` - -# 7. 使用自定义Count方法 - -## 7.1 注解 - -```java -@Pagination -public class Pageable { - @Page - private Integer page; - @Size - private Integer size; - @CountMethodName - private String countMethodName; - - public Pageable(Integer page, Integer size, String countMethodName) { - this.page = page; - this.size = size; - this.countMethodName = countMethodName; - } - /* getter setter */ -} -``` - -## 7.2 PaginationInterceptor配置 - -```java -public class Pageable { - private Integer page; - private Integer size; - private String countMethodName; - - public Pageable(Integer page, Integer size, String countMethodName) { - this.page = page; - this.size = size; - this.countMethodName = countMethodName; - } - /* getter setter */ -} -``` - -```java -PaginationSettings settings = PaginationSettings.builder() - .sqlDialect(SqlDialect.MYSQL) - .pageField("page") - .sizeField("size") - .countMethodNameField("countMethodName") - .build(); -PaginationInterceptor interceptor = new PaginationInterceptor(settings); -``` - -## 7.3 调用Query和Count方法 - -假设存在如下定义的Mapper: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(Pageable pageable); - - @Select("SELECT COUNT(*) FROM foo") - long count(Pageable pageable); -} -``` - -指定Count方法名称: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - // Specifies the count method name. - return Page.of(fooMapper.query(new Pageable(1, 10, "count"))); - } -} -``` - -# 8. 参数合理化 - -如果分页参数无效,需要合理化参数,可以设置以下参数: - -**defaultPage**: 如果page为空或小于1,则用default-page替换page。 -**defaultSize**: 如果size为空或小于1,则用default-size替换size。 -**maxPage**: 如果page大于max-page,则用max-page替换page。 -**maxSize**: 如果size大于max-size,则用max-size替换size。 - -## 8.1 注解配置 - -```java -@Pagination(defaultPage = 1, defaultSize = 10, maxPage = 10000, maxSize = 10000) -public class Pageable { -} -``` - -## 8.2 PaginationInterceptor配置 - -```java -PaginationSettings settings = PaginationSettings.builder() - .sqlDialect(SqlDialect.MYSQL) - .defaultPage(1) - .defaultSize(10) - .maxPage(10000) - .maxSize(10000) - .build(); -PaginationInterceptor interceptor = new PaginationInterceptor(settings); -``` - -# 9. 查询结果 - -如果调用执行成功结束,它将返回一个`PaginationCollection`实例。 - -## 9.1 使用 `io.leego.mypages.util.Page` - -#### 9.1.1 包装 - -```java -Page result = Page.of(fooMapper.query(pageable)); -``` - -#### 9.1.2 转化 - -```java -Page result=Page.of(fooMapper.query(pageable),foo->new Bar(foo)); -``` - -#### 9.1.3 映射 - -```java -Page result=Page.of(fooMapper.query(pageable)).map(foo->new Bar(foo)); -``` - -## 9.2 自定义包装类和工具类 - -#### 9.2.1 包装类 - -定义一个带分页结果的类: - -```java -public class Pagination implements Serializable { - private static final long serialVersionUID = 3214571808482585491L; - /** Data list. */ - protected List list; - /** One-based page index. */ - protected Integer page; - /** The size of the page to be returned. */ - protected Integer size; - /** The quantity of data. */ - protected Long total; - /** The quantity of data pages. */ - protected Long pages; - /** Returns {@code true} if there is a next page. */ - protected Boolean next; - /** Returns {@code true} if there is a previous page. */ - protected Boolean previous; - - public Pagination() { - } - - public Pagination(List list) { - this.list = list; - } - - public Pagination(List list, Long total) { - this.list = list; - this.total = total; - } - - public Pagination(List list, Integer page, Integer size) { - this.list = list; - this.page = page; - this.size = size; - } - - public Pagination(List list, Integer page, Integer size, Long total, Long pages, Boolean next, Boolean previous) { - this.list = list; - this.page = page; - this.size = size; - this.total = total; - this.pages = pages; - this.next = next; - this.previous = previous; - } - - public static Pagination of(List list, Integer page, Integer size, Long total, Long pages, Boolean next, Boolean previous) { - return new Pagination<>(list, page, size, total, pages, next, previous); - } - - public static Pagination of(List list, Integer page, Integer size, Long total) { - if (page == null || size == null) { - return new Pagination<>(list, total); - } - if (total == null) { - return new Pagination<>(list, page, size); - } - boolean next; - boolean previous; - long pages; - if (page > 0 && size > 0) { - next = page.longValue() * size < total; - previous = page != 1; - pages = total % size > 0 ? total / size + 1 : total / size; - } else { - next = false; - previous = false; - pages = 0L; - } - return new Pagination<>(list, page, size, total, pages, next, previous); - } - - public static Pagination of(List list, Integer page, Integer size) { - return new Pagination<>(list, page, size); - } - - public static Pagination of(List list, Long total) { - return new Pagination<>(list, total); - } - - public static Pagination of(List list) { - return new Pagination<>(list); - } - - public static Pagination of(Collection collection) { - if (collection == null) { - return new Pagination<>(new ArrayList<>()); - } - if (collection instanceof List) { - return new Pagination<>((List) collection); - } - return new Pagination<>(new ArrayList<>(collection)); - } - - public static Pagination empty() { - return new Pagination<>(new ArrayList<>()); - } - - public Pagination map(Function converter) { - return new Pagination<>(list == null ? null : list.stream().map(converter).collect(Collectors.toList()), - page, size, total, pages, next, previous); - } - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - - public Integer getPage() { - return page; - } - - public void setPage(Integer page) { - this.page = page; - } - - public Integer getSize() { - return size; - } - - public void setSize(Integer size) { - this.size = size; - } - - public Long getTotal() { - return total; - } - - public void setTotal(Long total) { - this.total = total; - } - - public Long getPages() { - return pages; - } - - public void setPages(Long pages) { - this.pages = pages; - } - - public Boolean getNext() { - return next; - } - - public void setNext(Boolean next) { - this.next = next; - } - - public Boolean getPrevious() { - return previous; - } - - public void setPrevious(Boolean previous) { - this.previous = previous; - } -} -``` - -#### 9.2.2 分页工具类 - -定义一个分页工具类 - -```java -public final class PaginationUtils { - private PaginationUtils() { - } - - public static Pagination of(List source) { - if (source == null) { - return Pagination.empty(); - } - if (!(source instanceof PaginationList)) { - return Pagination.of(source); - } - PaginationList s = (PaginationList) source; - return Pagination.of(source, s.getPage(), s.getSize(), s.getTotal()); - } - - public static Pagination of(Collection source) { - if (source == null) { - return Pagination.empty(); - } - if (!(source instanceof PaginationCollection)) { - return Pagination.of(source); - } - PaginationCollection s = (PaginationCollection) source; - return Pagination.of(toList(source), s.getPage(), s.getSize(), s.getTotal()); - } - - public static Pagination of(Collection source, Function mapper) { - if (source == null) { - return Pagination.empty(); - } - if (!(source instanceof PaginationCollection)) { - return Pagination.of(mapping(source, mapper)); - } - PaginationCollection s = (PaginationCollection) source; - return Pagination.of(mapping(source, mapper), s.getPage(), s.getSize(), s.getTotal()); - } - - public static Pagination transfer(Collection source, Collection target) { - if (source == null || target == null) { - return Pagination.empty(); - } - if (!(source instanceof PaginationCollection)) { - return Pagination.of(toList(target)); - } - PaginationCollection s = (PaginationCollection) source; - return Pagination.of(toList(target), s.getPage(), s.getSize(), s.getTotal()); - } - - private static List mapping(Collection source, Function mapper) { - Objects.requireNonNull(mapper); - if (source == null || source.isEmpty()) { - return new ArrayList<>(); - } - return source.stream().map(mapper).collect(Collectors.toList()); - } - - private static List toList(Collection collection) { - if (collection == null) { - return new ArrayList<>(); - } - if (collection instanceof List) { - return (List) collection; - } - return new ArrayList<>(collection); - } - -} -``` - -使用自定义工具类: - -```java -Pagination result=PaginationUtils.of(fooMapper.query(pageable)); -``` - -```java -Pagination result=PaginationUtils.of(fooMapper.query(pageable),foo->new Bar(foo)); -``` diff --git a/docs/USERGUIDE.md b/docs/USERGUIDE.md deleted file mode 100644 index 9c3c6b3..0000000 --- a/docs/USERGUIDE.md +++ /dev/null @@ -1,730 +0,0 @@ -# 1. Introduction - -MyPages is a java based, open source pagination plugin for [MyBatis](https://github.com/mybatis/mybatis-3) that simplifies database paging queries. - -# 2. Getting Started - -Please make sure the Java version is 1.8 and above. - -# 3. Dependency - -## 3.1 Maven - -```xml - - io.leego - mypages - 1.1.2 - -``` - -## 3.2 Gradle - -```xml -implementation 'io.leego:mypages:1.1.2' -``` - -# 4. Quick Setup - -Please notice that the PaginationInterceptor requires SqlDialect. - -## 4.1 MyBatis SqlSessionFactoryBean - -```java -PaginationSettings settings = new PaginationSettings(SqlDialect.MYSQL); -PaginationInterceptor paginationInterceptor = new PaginationInterceptor(settings); -Interceptor[] plugins = new Interceptor[]{paginationInterceptor}; -SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); -sqlSessionFactoryBean.setPlugins(plugins); -``` - -## 4.2 Spring - -To use MyBatis with Spring you need at least two things defined in the Spring application context: an SqlSessionFactory and at least one mapper interface. - -In MyBatis-Spring, an SqlSessionFactoryBean is used to create an SqlSessionFactory. To configure the factory bean, put the following in the Spring configuration file: - -## 4.3 Spring XML - -```xml - - - - - - - - - - - - -``` - -## 4.4 Spring Boot - -```java -@Configuration -public class MybatisConfiguration { - @Bean - public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { - Interceptor[] plugins = new Interceptor[]{paginationInterceptor()}; - SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); - sqlSessionFactoryBean.setDataSource(dataSource); - sqlSessionFactoryBean.setPlugins(plugins); - return sqlSessionFactoryBean.getObject(); - } - - @Bean - public PaginationInterceptor paginationInterceptor() { - PaginationSettings settings = new PaginationSettings(SqlDialect.MYSQL); - return new PaginationInterceptor(settings); - } -} -``` - -## 4.5 Spring Boot Starter - -> * Please see: [mypages-spring-boot-starter](STARTER_USERGUIDE.md) - -# 5. Quick Start - -Assume there is a class defined like the following: - -```java -import io.leego.mypages.annotation.Pagination; -import io.leego.mypages.annotation.Page; -import io.leego.mypages.annotation.Size; - -@Pagination -public class Pageable { - @Page - private Integer page; - @Size - private Integer size; - - public Pageable(Integer page, Integer size) { - this.page = page; - this.size = size; - } - /* getter setter */ -} -``` - -Assume there is a mapper interface defined like the following: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(Pageable pageable); -} -``` - -Call query method: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - return Page.of(fooMapper.query(new Pageable(1, 10))); - } -} -``` - -# 6. Enable Pagination - -## 6.1 Annotations (Recommended) - -Using `@Pagination`, `@Page`, `@Size`, `@Offset`, `@Rows` annotations. - -```java -@Pagination -public class Pageable { - @Page - private Integer page; - @Size - private Integer size; - @Offset - private Integer offset; - @Rows - private Integer rows; - /* getter setter */ -} -``` - -More annotations: `@CountExpr`, `@CountMethodName`, `@DisableCount`, `@DisablePagination`. - -## 6.2 PaginationInterceptor Configuration (Recommended) - -Configure the interceptor. - -```java -PaginationSettings settings = PaginationSettings.builder() - .sqlDialect(SqlDialect.MYSQL) - .pageField("page") - .sizeField("size") - .build(); -PaginationInterceptor interceptor = new PaginationInterceptor(settings); -``` - -### 6.2.1 Define a class - -Define a class with paging parameters. - -```java -public class Pageable { - private Integer page; - private Integer size; - - public Pageable(Integer page, Integer size) { - this.page = page; - this.size = size; - } - /* getter setter */ -} -``` - -Assume there is a mapper interface defined like the following: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(Pageable pageable); -} -``` - -Call query method: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - return Page.of(fooMapper.query(new Pageable(1, 10))); - } -} -``` - -### 6.2.2 MyBatis `@Param` - -Assume there is a mapper interface defined like the following: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(@Param("page") Integer page, @Param("size") Integer size); -} -``` - -Call query method: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - return Page.of(fooMapper.query(1, 10)); - } -} -``` - -### 6.2.3 Map - -Assume there is a mapper interface defined like the following: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(Map map); -} -``` - -Call query method: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - Map map = new HashMap<>(); - map.put("size", 1); - map.put("page", 10); - return Page.of(fooMapper.query(map)); - } -} -``` - -### More configurations. - -```java -PaginationSettings settings = PaginationSettings.builder() - .sqlDialect(SqlDialect.MYSQL) // Specifies sql-dialect. - .countExpr("*") // The column name or expression, the default value is "*". - .pageField("page") // Obtains the page value from parameter. - .sizeField("size") // Obtains the size value from parameter. - .offsetField("offset") // Obtains the offset value from parameter. - .rowsField("rows") // Obtains the rows value from parameter. - .countExprField("countExpr") // Obtains the count expression from parameter. - .countMethodNameField("countMethodName") // Obtains the count-method-name from parameter. - .enableCountField("enableCount") // Obtains the enable-count from parameter. - .skipQueryIfCountEqualsZero(true) // Whether to skip query if total quantity equals zero. - .useGeneratedIfCountMethodIsMissing(true) // Whether to use generated if the specified count method is missing. - .defaultPage(1) // Replaces the page with default-page if the page is null or less than 1. - .defaultSize(10) // Replaces the size with default-size if the size is null or less than 1. - .maxPage(10000) // Replaces the page with max-page if the page is greater than max-page. - .maxSize(10000) // Replaces the size with max-size if the size is greater than max-size. - .build(); -PaginationInterceptor interceptor = new PaginationInterceptor(settings); -``` - -## 6.3 Implements `io.leego.mypages.util.Pageable` - -Define a class implements `io.leego.mypages.util.Pageable`. - -```java -public class PageRequest implements io.leego.mypages.util.Pageable { - private Integer page; - private Integer size; - private Integer offset; - private Integer rows; - - @Override - public Integer getPage() { - return page; - } - - public void setPage(Integer page) { - this.page = page; - } - - @Override - public Integer getSize() { - return size; - } - - public void setSize(Integer size) { - this.size = size; - } - - @Override - public Integer getOffset() { - return offset; - } - - public void setOffset(Integer offset) { - this.offset = offset; - } - - @Override - public Integer getRows() { - return rows; - } - - public void setRows(Integer rows) { - this.rows = rows; - } -} -``` - -# 7. Using custom count methods - -## 7.1 Annotations - -```java -@Pagination -public class Pageable { - @Page - private Integer page; - @Size - private Integer size; - @CountMethodName - private String countMethodName; - - public Pageable(Integer page, Integer size, String countMethodName) { - this.page = page; - this.size = size; - this.countMethodName = countMethodName; - } - /* getter setter */ -} -``` - -## 7.2 PaginationInterceptor Configuration - -```java -public class Pageable { - private Integer page; - private Integer size; - private String countMethodName; - - public Pageable(Integer page, Integer size, String countMethodName) { - this.page = page; - this.size = size; - this.countMethodName = countMethodName; - } - /* getter setter */ -} -``` - -```java -PaginationSettings settings = PaginationSettings.builder() - .sqlDialect(SqlDialect.MYSQL) - .pageField("page") - .sizeField("size") - .countMethodNameField("countMethodName") - .build(); -PaginationInterceptor interceptor = new PaginationInterceptor(settings); -``` - -## 7.3 Call methods: - -Assume there is a mapper interface defined like the following: - -```java -public interface FooMapper { - @Select("SELECT * FROM foo") - List query(Pageable pageable); - - @Select("SELECT COUNT(*) FROM foo") - long count(Pageable pageable); -} -``` - -Specify the count method name: - -```java -import io.leego.mypages.util.Page; - -@Service -public class QueryTests { - @Autowired - private FooMapper fooMapper; - - public Page query() { - // Specifies the count method name. - return Page.of(fooMapper.query(new Pageable(1, 10, "count"))); - } -} -``` - -# 8. Parameters rationalization - -Rationalize the parameters if the values are invalid, the following parameters can be set: - -**defaultPage**: Replaces the page with default-page if the page is null or less than 1. -**defaultSize**: Replaces the size with default-size if the size is null or less than 1. -**maxPage**: Replaces the page with max-page if the page is greater than max-page. -**maxSize**: Replaces the size with max-size if the size is greater than max-size. - -## 8.1 Annotations - -```java -@Pagination(defaultPage = 1, defaultSize = 10, maxPage = 10000, maxSize = 10000) -public class Pageable { -} -``` - -## 8.2 PaginationInterceptor Configuration - -```java -PaginationSettings settings = PaginationSettings.builder() - .sqlDialect(SqlDialect.MYSQL) - .defaultPage(1) - .defaultSize(10) - .maxPage(10000) - .maxSize(10000) - .build(); -PaginationInterceptor interceptor = new PaginationInterceptor(settings); -``` - -# 9. Query Results - -If the invocation proceed, it will return an instance of the `PaginationCollection`. - -## 9.1 Using `io.leego.mypages.util.Page` - -#### 9.1.1 Wrap - -```java -Page result = Page.of(fooMapper.query(pageable)); -``` - -#### 9.1.2 Convert - -```java -Page result=Page.of(fooMapper.query(pageable),foo->new Bar(foo)); -``` - -#### 9.1.3 Mapping - -```java -Page result=Page.of(fooMapper.query(pageable)).map(foo->new Bar(foo)); -``` - -## 9.2 Using Custom Pagination Class - -For example: - -#### 9.2.1 Custom Pagination Class - -Assume there is a class defined like the following: - -```java -public class Pagination implements Serializable { - private static final long serialVersionUID = 3214571808482585491L; - /** Data list. */ - protected List list; - /** One-based page index. */ - protected Integer page; - /** The size of the page to be returned. */ - protected Integer size; - /** The quantity of data. */ - protected Long total; - /** The quantity of data pages. */ - protected Long pages; - /** Returns {@code true} if there is a next page. */ - protected Boolean next; - /** Returns {@code true} if there is a previous page. */ - protected Boolean previous; - - public Pagination() { - } - - public Pagination(List list) { - this.list = list; - } - - public Pagination(List list, Long total) { - this.list = list; - this.total = total; - } - - public Pagination(List list, Integer page, Integer size) { - this.list = list; - this.page = page; - this.size = size; - } - - public Pagination(List list, Integer page, Integer size, Long total, Long pages, Boolean next, Boolean previous) { - this.list = list; - this.page = page; - this.size = size; - this.total = total; - this.pages = pages; - this.next = next; - this.previous = previous; - } - - public static Pagination of(List list, Integer page, Integer size, Long total, Long pages, Boolean next, Boolean previous) { - return new Pagination<>(list, page, size, total, pages, next, previous); - } - - public static Pagination of(List list, Integer page, Integer size, Long total) { - if (page == null || size == null) { - return new Pagination<>(list, total); - } - if (total == null) { - return new Pagination<>(list, page, size); - } - boolean next; - boolean previous; - long pages; - if (page > 0 && size > 0) { - next = page.longValue() * size < total; - previous = page != 1; - pages = total % size > 0 ? total / size + 1 : total / size; - } else { - next = false; - previous = false; - pages = 0L; - } - return new Pagination<>(list, page, size, total, pages, next, previous); - } - - public static Pagination of(List list, Integer page, Integer size) { - return new Pagination<>(list, page, size); - } - - public static Pagination of(List list, Long total) { - return new Pagination<>(list, total); - } - - public static Pagination of(List list) { - return new Pagination<>(list); - } - - public static Pagination of(Collection collection) { - if (collection == null) { - return new Pagination<>(new ArrayList<>()); - } - if (collection instanceof List) { - return new Pagination<>((List) collection); - } - return new Pagination<>(new ArrayList<>(collection)); - } - - public static Pagination empty() { - return new Pagination<>(new ArrayList<>()); - } - - public Pagination map(Function converter) { - return new Pagination<>(list == null ? null : list.stream().map(converter).collect(Collectors.toList()), - page, size, total, pages, next, previous); - } - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - - public Integer getPage() { - return page; - } - - public void setPage(Integer page) { - this.page = page; - } - - public Integer getSize() { - return size; - } - - public void setSize(Integer size) { - this.size = size; - } - - public Long getTotal() { - return total; - } - - public void setTotal(Long total) { - this.total = total; - } - - public Long getPages() { - return pages; - } - - public void setPages(Long pages) { - this.pages = pages; - } - - public Boolean getNext() { - return next; - } - - public void setNext(Boolean next) { - this.next = next; - } - - public Boolean getPrevious() { - return previous; - } - - public void setPrevious(Boolean previous) { - this.previous = previous; - } -} -``` - -#### 9.2.2 Pagination Utils - -For example: - -```java -public final class PaginationUtils { - private PaginationUtils() { - } - - public static Pagination of(List source) { - if (source == null) { - return Pagination.empty(); - } - if (!(source instanceof PaginationList)) { - return Pagination.of(source); - } - PaginationList s = (PaginationList) source; - return Pagination.of(source, s.getPage(), s.getSize(), s.getTotal()); - } - - public static Pagination of(Collection source) { - if (source == null) { - return Pagination.empty(); - } - if (!(source instanceof PaginationCollection)) { - return Pagination.of(source); - } - PaginationCollection s = (PaginationCollection) source; - return Pagination.of(toList(source), s.getPage(), s.getSize(), s.getTotal()); - } - - public static Pagination of(Collection source, Function mapper) { - if (source == null) { - return Pagination.empty(); - } - if (!(source instanceof PaginationCollection)) { - return Pagination.of(mapping(source, mapper)); - } - PaginationCollection s = (PaginationCollection) source; - return Pagination.of(mapping(source, mapper), s.getPage(), s.getSize(), s.getTotal()); - } - - public static Pagination transfer(Collection source, Collection target) { - if (source == null || target == null) { - return Pagination.empty(); - } - if (!(source instanceof PaginationCollection)) { - return Pagination.of(toList(target)); - } - PaginationCollection s = (PaginationCollection) source; - return Pagination.of(toList(target), s.getPage(), s.getSize(), s.getTotal()); - } - - private static List mapping(Collection source, Function mapper) { - Objects.requireNonNull(mapper); - if (source == null || source.isEmpty()) { - return new ArrayList<>(); - } - return source.stream().map(mapper).collect(Collectors.toList()); - } - - private static List toList(Collection collection) { - if (collection == null) { - return new ArrayList<>(); - } - if (collection instanceof List) { - return (List) collection; - } - return new ArrayList<>(collection); - } - -} -``` - -```java -Pagination result=PaginationUtils.of(fooMapper.query(pageable)); -``` - -```java -Pagination result=PaginationUtils.of(fooMapper.query(pageable),foo->new Bar(foo)); -``` diff --git a/mypages-samples/mypages-sample-java/pom.xml b/mypages-samples/mypages-sample-java/pom.xml new file mode 100644 index 0000000..329c732 --- /dev/null +++ b/mypages-samples/mypages-sample-java/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + + io.leego + mypages-samples + 2.0.0 + + + mypages-sample-java + ${project.artifactId} + + + + io.leego + mypages + + + org.mybatis + mybatis + + + com.zaxxer + HikariCP + + + mysql + mysql-connector-java + + + + \ No newline at end of file diff --git a/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/MyPagesApplication.java b/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/MyPagesApplication.java new file mode 100644 index 0000000..b3c2aa6 --- /dev/null +++ b/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/MyPagesApplication.java @@ -0,0 +1,72 @@ +package io.leego.mypages.sample; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import io.leego.mypages.dialect.Database; +import io.leego.mypages.interceptor.PaginationInterceptor; +import io.leego.mypages.interceptor.PaginationSettings; +import io.leego.mypages.sample.entity.User; +import io.leego.mypages.sample.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.TransactionFactory; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sql.DataSource; +import java.util.List; + +/** + * @author Yihleego + */ +public class MyPagesApplication { + private static final Logger logger = LoggerFactory.getLogger(MyPagesApplication.class); + + public static void main(String[] args) { + new MyPagesApplication().run(); + } + + public void run() { + DataSource dataSource = dataSource(); + SqlSessionFactory sqlSessionFactory = sqlSessionFactory(dataSource); + try (SqlSession session = sqlSessionFactory.openSession(false)) { + UserMapper userMapper = session.getMapper(UserMapper.class); + List list = userMapper.query(1, 10); + Page page = Page.of(list); + logger.info("{}", page); + } + } + + public DataSource dataSource() { + HikariConfig config = new HikariConfig(); + config.setDriverClassName("com.mysql.cj.jdbc.Driver"); + config.setJdbcUrl("jdbc:mysql://localhost:3306/mypages?serverTimezone=GMT%2B8"); + config.setUsername("root"); + config.setPassword("123456"); + return new HikariDataSource(config); + } + + public SqlSessionFactory sqlSessionFactory(DataSource dataSource) { + TransactionFactory transactionFactory = new JdbcTransactionFactory(); + Environment environment = new Environment(SqlSessionFactory.class.getSimpleName(), transactionFactory, dataSource); + Configuration configuration = new Configuration(environment); + configuration.setMapUnderscoreToCamelCase(true); + configuration.addMapper(UserMapper.class); + configuration.addInterceptor(paginationInterceptor(dataSource)); + return new SqlSessionFactoryBuilder().build(configuration); + } + + public PaginationInterceptor paginationInterceptor(DataSource dataSource) { + PaginationSettings settings = PaginationSettings.builder() + .database(Database.fromDataSource(dataSource)) + .pageField("page") + .sizeField("size") + .build(); + return new PaginationInterceptor(settings); + } +} diff --git a/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/entity/User.java b/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/entity/User.java new file mode 100644 index 0000000..f7a6bb5 --- /dev/null +++ b/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/entity/User.java @@ -0,0 +1,72 @@ +package io.leego.mypages.sample.entity; + +import java.time.LocalDateTime; + +/** + * @author Yihleego + */ +public class User { + private Long id; + private LocalDateTime createdTime; + private LocalDateTime updatedTime; + private String username; + private String password; + private String nickname; + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDateTime getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(LocalDateTime createdTime) { + this.createdTime = createdTime; + } + + public LocalDateTime getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(LocalDateTime updatedTime) { + this.updatedTime = updatedTime; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java b/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java new file mode 100644 index 0000000..5070f15 --- /dev/null +++ b/mypages-samples/mypages-sample-java/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java @@ -0,0 +1,15 @@ +package io.leego.mypages.sample.mapper; + +import io.leego.mypages.sample.entity.User; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * @author Yihleego + */ +public interface UserMapper { + @Select("select * from user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} diff --git a/mypages-samples/mypages-sample-mybatis-plus/pom.xml b/mypages-samples/mypages-sample-mybatis-plus/pom.xml new file mode 100644 index 0000000..ace711b --- /dev/null +++ b/mypages-samples/mypages-sample-mybatis-plus/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + + io.leego + mypages-samples + 2.0.0 + + + mypages-sample-mybatis-plus + ${project.artifactId} + + + + io.leego + mypages-spring-boot-starter + + + com.baomidou + mybatis-plus-boot-starter + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + + + + \ No newline at end of file diff --git a/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/MyPagesApplication.java b/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/MyPagesApplication.java new file mode 100644 index 0000000..663d7f7 --- /dev/null +++ b/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/MyPagesApplication.java @@ -0,0 +1,29 @@ +package io.leego.mypages.sample; + +import io.leego.mypages.sample.entity.User; +import io.leego.mypages.sample.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +import java.util.List; + +/** + * @author Yihleego + */ +@SpringBootApplication +public class MyPagesApplication { + private static final Logger logger = LoggerFactory.getLogger(MyPagesApplication.class); + + public static void main(String[] args) { + ApplicationContext applicationContext = SpringApplication.run(MyPagesApplication.class, args); + UserMapper userMapper = applicationContext.getBean(UserMapper.class); + List list = userMapper.query(1, 10); + Page page = Page.of(list); + logger.info("{}", page); + } + +} diff --git a/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/entity/User.java b/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/entity/User.java new file mode 100644 index 0000000..f7a6bb5 --- /dev/null +++ b/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/entity/User.java @@ -0,0 +1,72 @@ +package io.leego.mypages.sample.entity; + +import java.time.LocalDateTime; + +/** + * @author Yihleego + */ +public class User { + private Long id; + private LocalDateTime createdTime; + private LocalDateTime updatedTime; + private String username; + private String password; + private String nickname; + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDateTime getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(LocalDateTime createdTime) { + this.createdTime = createdTime; + } + + public LocalDateTime getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(LocalDateTime updatedTime) { + this.updatedTime = updatedTime; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java b/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java new file mode 100644 index 0000000..444ea67 --- /dev/null +++ b/mypages-samples/mypages-sample-mybatis-plus/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java @@ -0,0 +1,18 @@ +package io.leego.mypages.sample.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import io.leego.mypages.sample.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * @author Yihleego + */ +@Mapper +public interface UserMapper extends BaseMapper { + @Select("select * from user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} diff --git a/mypages-samples/mypages-sample-mybatis-plus/src/main/resources/application.properties b/mypages-samples/mypages-sample-mybatis-plus/src/main/resources/application.properties new file mode 100644 index 0000000..e11d076 --- /dev/null +++ b/mypages-samples/mypages-sample-mybatis-plus/src/main/resources/application.properties @@ -0,0 +1,19 @@ +# port +server.port=10000 +# name +spring.application.name=mypages-sample-spring-boot-starter +# logging +logging.level.io.leego=debug +# datasource +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/mypages?serverTimezone=GMT%2B8 +spring.datasource.username=root +spring.datasource.password=123456 +# mybatis +mybatis-plus.configuration.cache-enabled=false +mybatis-plus.configuration.local-cache-scope=STATEMENT +mybatis-plus.configuration.jdbc-type-for-null=NULL +mybatis-plus.configuration.map-underscore-to-camel-case=true +# mypages +mypages.page-field=page +mypages.size-field=size \ No newline at end of file diff --git a/mypages-samples/mypages-sample-spring-boot-starter/pom.xml b/mypages-samples/mypages-sample-spring-boot-starter/pom.xml new file mode 100644 index 0000000..d8f3f92 --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot-starter/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + + io.leego + mypages-samples + 2.0.0 + + + mypages-sample-spring-boot-starter + ${project.artifactId} + + + + io.leego + mypages-spring-boot-starter + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + + + + \ No newline at end of file diff --git a/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/MyPagesApplication.java b/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/MyPagesApplication.java new file mode 100644 index 0000000..663d7f7 --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/MyPagesApplication.java @@ -0,0 +1,29 @@ +package io.leego.mypages.sample; + +import io.leego.mypages.sample.entity.User; +import io.leego.mypages.sample.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +import java.util.List; + +/** + * @author Yihleego + */ +@SpringBootApplication +public class MyPagesApplication { + private static final Logger logger = LoggerFactory.getLogger(MyPagesApplication.class); + + public static void main(String[] args) { + ApplicationContext applicationContext = SpringApplication.run(MyPagesApplication.class, args); + UserMapper userMapper = applicationContext.getBean(UserMapper.class); + List list = userMapper.query(1, 10); + Page page = Page.of(list); + logger.info("{}", page); + } + +} diff --git a/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/entity/User.java b/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/entity/User.java new file mode 100644 index 0000000..f7a6bb5 --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/entity/User.java @@ -0,0 +1,72 @@ +package io.leego.mypages.sample.entity; + +import java.time.LocalDateTime; + +/** + * @author Yihleego + */ +public class User { + private Long id; + private LocalDateTime createdTime; + private LocalDateTime updatedTime; + private String username; + private String password; + private String nickname; + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDateTime getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(LocalDateTime createdTime) { + this.createdTime = createdTime; + } + + public LocalDateTime getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(LocalDateTime updatedTime) { + this.updatedTime = updatedTime; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java b/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java new file mode 100644 index 0000000..106a5f2 --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot-starter/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java @@ -0,0 +1,17 @@ +package io.leego.mypages.sample.mapper; + +import io.leego.mypages.sample.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * @author Yihleego + */ +@Mapper +public interface UserMapper { + @Select("select * from user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} diff --git a/mypages-samples/mypages-sample-spring-boot-starter/src/main/resources/application.properties b/mypages-samples/mypages-sample-spring-boot-starter/src/main/resources/application.properties new file mode 100644 index 0000000..5346ab7 --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot-starter/src/main/resources/application.properties @@ -0,0 +1,19 @@ +# port +server.port=10000 +# name +spring.application.name=mypages-sample-spring-boot-starter +# logging +logging.level.io.leego=debug +# datasource +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/mypages?serverTimezone=GMT%2B8 +spring.datasource.username=root +spring.datasource.password=123456 +# mybatis +mybatis.configuration.cache-enabled=false +mybatis.configuration.local-cache-scope=STATEMENT +mybatis.configuration.jdbc-type-for-null=NULL +mybatis.configuration.map-underscore-to-camel-case=true +# mypages +mypages.page-field=page +mypages.size-field=size \ No newline at end of file diff --git a/mypages-samples/mypages-sample-spring-boot/pom.xml b/mypages-samples/mypages-sample-spring-boot/pom.xml new file mode 100644 index 0000000..e4cb28e --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + + io.leego + mypages-samples + 2.0.0 + + + mypages-sample-spring-boot + ${project.artifactId} + + + + io.leego + mypages + + + org.mybatis + mybatis + + + org.mybatis + mybatis-spring + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + + + + \ No newline at end of file diff --git a/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/MyPagesApplication.java b/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/MyPagesApplication.java new file mode 100644 index 0000000..9177621 --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/MyPagesApplication.java @@ -0,0 +1,57 @@ +package io.leego.mypages.sample; + +import io.leego.mypages.dialect.Database; +import io.leego.mypages.interceptor.PaginationInterceptor; +import io.leego.mypages.interceptor.PaginationSettings; +import io.leego.mypages.sample.entity.User; +import io.leego.mypages.sample.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.annotation.MapperScan; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; +import java.util.List; + +/** + * @author Yihleego + */ +@MapperScan("io.leego.mypages.sample") +@SpringBootApplication +public class MyPagesApplication { + private static final Logger logger = LoggerFactory.getLogger(MyPagesApplication.class); + + public static void main(String[] args) { + ApplicationContext applicationContext = SpringApplication.run(MyPagesApplication.class, args); + UserMapper userMapper = applicationContext.getBean(UserMapper.class); + List list = userMapper.query(1, 10); + Page page = Page.of(list); + logger.info("{}", page); + } + + @Bean + public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { + Interceptor[] plugins = new Interceptor[]{paginationInterceptor(dataSource)}; + SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); + sqlSessionFactoryBean.setDataSource(dataSource); + sqlSessionFactoryBean.setPlugins(plugins); + return sqlSessionFactoryBean.getObject(); + } + + @Bean + public PaginationInterceptor paginationInterceptor(DataSource dataSource) { + PaginationSettings settings = PaginationSettings.builder() + .database(Database.fromDataSource(dataSource)) + .pageField("page") + .sizeField("size") + .build(); + return new PaginationInterceptor(settings); + } +} diff --git a/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/entity/User.java b/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/entity/User.java new file mode 100644 index 0000000..f7a6bb5 --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/entity/User.java @@ -0,0 +1,72 @@ +package io.leego.mypages.sample.entity; + +import java.time.LocalDateTime; + +/** + * @author Yihleego + */ +public class User { + private Long id; + private LocalDateTime createdTime; + private LocalDateTime updatedTime; + private String username; + private String password; + private String nickname; + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDateTime getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(LocalDateTime createdTime) { + this.createdTime = createdTime; + } + + public LocalDateTime getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(LocalDateTime updatedTime) { + this.updatedTime = updatedTime; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java b/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java new file mode 100644 index 0000000..106a5f2 --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java @@ -0,0 +1,17 @@ +package io.leego.mypages.sample.mapper; + +import io.leego.mypages.sample.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * @author Yihleego + */ +@Mapper +public interface UserMapper { + @Select("select * from user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} diff --git a/mypages-samples/mypages-sample-spring-boot/src/main/resources/application.properties b/mypages-samples/mypages-sample-spring-boot/src/main/resources/application.properties new file mode 100644 index 0000000..e671ccc --- /dev/null +++ b/mypages-samples/mypages-sample-spring-boot/src/main/resources/application.properties @@ -0,0 +1,11 @@ +# port +server.port=10000 +# name +spring.application.name=mypages-sample-spring-boot +# logging +logging.level.io.leego=debug +# datasource +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/mypages?serverTimezone=GMT%2B8 +spring.datasource.username=root +spring.datasource.password=123456 \ No newline at end of file diff --git a/mypages-samples/mypages-sample-spring/pom.xml b/mypages-samples/mypages-sample-spring/pom.xml new file mode 100644 index 0000000..e1b2713 --- /dev/null +++ b/mypages-samples/mypages-sample-spring/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + + io.leego + mypages-samples + 2.0.0 + + + mypages-sample-spring + ${project.artifactId} + + + + io.leego + mypages + + + org.mybatis + mybatis + + + org.mybatis + mybatis-spring + + + com.zaxxer + HikariCP + + + mysql + mysql-connector-java + + + org.springframework + spring-core + + + org.springframework + spring-beans + + + org.springframework + spring-context + + + org.springframework + spring-context-support + + + org.springframework + spring-oxm + + + org.springframework + spring-tx + + + org.springframework + spring-jdbc + + + + \ No newline at end of file diff --git a/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/MyPagesApplication.java b/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/MyPagesApplication.java new file mode 100644 index 0000000..99bd5a0 --- /dev/null +++ b/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/MyPagesApplication.java @@ -0,0 +1,27 @@ +package io.leego.mypages.sample; + +import io.leego.mypages.sample.entity.User; +import io.leego.mypages.sample.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.List; + +/** + * @author Yihleego + */ +public class MyPagesApplication { + private static final Logger logger = LoggerFactory.getLogger(MyPagesApplication.class); + + public static void main(String[] args) { + ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/spring.xml"); + UserMapper userMapper = applicationContext.getBean(UserMapper.class); + List list = userMapper.query(1, 10); + Page page = Page.of(list); + logger.info("{}", page); + } + +} diff --git a/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/entity/User.java b/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/entity/User.java new file mode 100644 index 0000000..f7a6bb5 --- /dev/null +++ b/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/entity/User.java @@ -0,0 +1,72 @@ +package io.leego.mypages.sample.entity; + +import java.time.LocalDateTime; + +/** + * @author Yihleego + */ +public class User { + private Long id; + private LocalDateTime createdTime; + private LocalDateTime updatedTime; + private String username; + private String password; + private String nickname; + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDateTime getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(LocalDateTime createdTime) { + this.createdTime = createdTime; + } + + public LocalDateTime getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(LocalDateTime updatedTime) { + this.updatedTime = updatedTime; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java b/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java new file mode 100644 index 0000000..5070f15 --- /dev/null +++ b/mypages-samples/mypages-sample-spring/src/main/java/io/leego/mypages/sample/mapper/UserMapper.java @@ -0,0 +1,15 @@ +package io.leego.mypages.sample.mapper; + +import io.leego.mypages.sample.entity.User; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * @author Yihleego + */ +public interface UserMapper { + @Select("select * from user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} diff --git a/mypages-samples/mypages-sample-spring/src/main/resources/application.properties b/mypages-samples/mypages-sample-spring/src/main/resources/application.properties new file mode 100644 index 0000000..723e058 --- /dev/null +++ b/mypages-samples/mypages-sample-spring/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/mypages?serverTimezone=GMT%2B8 +spring.datasource.username=root +spring.datasource.password=123456 \ No newline at end of file diff --git a/mypages-samples/mypages-sample-spring/src/main/resources/spring/spring.xml b/mypages-samples/mypages-sample-spring/src/main/resources/spring/spring.xml new file mode 100644 index 0000000..572501c --- /dev/null +++ b/mypages-samples/mypages-sample-spring/src/main/resources/spring/spring.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + classpath:application.properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mypages-samples/pom.xml b/mypages-samples/pom.xml new file mode 100644 index 0000000..12d3b21 --- /dev/null +++ b/mypages-samples/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + + io.leego + mypages-parent + 2.0.0 + + + mypages-samples + ${project.artifactId} + pom + + + mypages-sample-java + mypages-sample-spring + mypages-sample-spring-boot + mypages-sample-spring-boot-starter + mypages-sample-mybatis-plus + + + + 1.8 + UTF-8 + 2.0.0 + 2.0.0 + 3.5.7 + 2.0.6 + 2.2.0 + 3.4.3 + 2.5.3 + + + + + + io.leego + mypages + ${mypages.version} + + + io.leego + mypages-spring-boot-starter + ${mypages-spring-boot-starter.version} + + + org.mybatis + mybatis + ${mybatis.version} + + + org.mybatis + mybatis-spring + ${mybatis-spring.version} + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot-starter.version} + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus-boot-starter.version} + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + \ No newline at end of file diff --git a/mypages-samples/resources/ddl.sql b/mypages-samples/resources/ddl.sql new file mode 100644 index 0000000..99e82ee --- /dev/null +++ b/mypages-samples/resources/ddl.sql @@ -0,0 +1,12 @@ +create table if not exists user +( + id bigint primary key auto_increment not null, + created_time datetime not null, + updated_time datetime null, + username varchar(20) not null, + password varchar(40) not null, + nickname varchar(20) not null, + status tinyint default 1 not null +); +create unique index uk_user_username on user (username); +create index idx_user_nickname on user (nickname); \ No newline at end of file diff --git a/mypages-samples/resources/dml.sql b/mypages-samples/resources/dml.sql new file mode 100644 index 0000000..10c4f27 --- /dev/null +++ b/mypages-samples/resources/dml.sql @@ -0,0 +1,27 @@ +insert into user (username, password, nickname, created_time) +values ('jack', '123456', 'Jack', now()), + ('charles', '123456', 'Charles', now()), + ('bill', '123456', 'Bill', now()), + ('vincent', '123456', 'Vincent', now()), + ('william', '123456', 'William', now()), + ('joseph', '123456', 'Joseph', now()), + ('james', '123456', 'James', now()), + ('henry', '123456', 'Henry', now()), + ('gary', '123456', 'Gary', now()), + ('martin', '123456', 'Martin', now()), + ('malcolm', '123456', 'Malcolm', now()), + ('joan', '123456', 'Joan', now()), + ('niki', '123456', 'Niki', now()), + ('betty', '123456', 'Betty', now()), + ('linda', '123456', 'Linda', now()), + ('whitney', '123456', 'Whitney', now()), + ('lily', '123456', 'Lily', now()), + ('fred', '123456', 'Fred', now()), + ('karl', '123456', 'Karl', now()), + ('barbara', '123456', 'Barbara', now()), + ('elizabeth', '123456', 'Elizabeth', now()), + ('helen', '123456', 'Helen', now()), + ('katharine', '123456', 'Katharine', now()), + ('diana', '123456', 'Diana', now()), + ('bob', '123456', 'Bob', now()) +on duplicate key update updated_time = now(); diff --git a/mypages-spring-boot-autoconfigure/pom.xml b/mypages-spring-boot-autoconfigure/pom.xml new file mode 100644 index 0000000..3d0756a --- /dev/null +++ b/mypages-spring-boot-autoconfigure/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + + io.leego + mypages-parent + 2.0.0 + + + mypages-spring-boot-autoconfigure + ${project.artifactId} + MyPages is a java based, open source pagination plugin for MyBatis that simplifies database paging queries. + https://github.com/yihleego/mypages + + + + io.leego + mypages + + + org.mybatis + mybatis + true + + + org.mybatis.spring.boot + mybatis-spring-boot-autoconfigure + true + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-autoconfigure-processor + true + + + + \ No newline at end of file diff --git a/mypages-spring-boot-autoconfigure/src/main/java/io/leego/mypages/spring/boot/autoconfigure/MyPagesAutoConfiguration.java b/mypages-spring-boot-autoconfigure/src/main/java/io/leego/mypages/spring/boot/autoconfigure/MyPagesAutoConfiguration.java new file mode 100644 index 0000000..e9481d7 --- /dev/null +++ b/mypages-spring-boot-autoconfigure/src/main/java/io/leego/mypages/spring/boot/autoconfigure/MyPagesAutoConfiguration.java @@ -0,0 +1,41 @@ +package io.leego.mypages.spring.boot.autoconfigure; + +import io.leego.mypages.dialect.Database; +import io.leego.mypages.dialect.Dialect; +import io.leego.mypages.interceptor.PaginationInterceptor; +import org.apache.ibatis.plugin.Interceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +/** + * @author Yihleego + */ +@Configuration +@ConditionalOnClass(Interceptor.class) +@ConditionalOnProperty(value = "mypages.enabled", matchIfMissing = true) +@EnableConfigurationProperties(MyPagesProperties.class) +public class MyPagesAutoConfiguration { + + @Bean + @ConditionalOnMissingBean(PaginationInterceptor.class) + public PaginationInterceptor paginationInterceptor( + MyPagesProperties properties, + @Autowired(required = false) Dialect dialect, + @Autowired(required = false) DataSource dataSource) { + if (properties.getDatabase() == null && dataSource != null) { + properties.setDatabase(Database.fromDataSource(dataSource)); + } + if (properties.getDatabase() == null && dialect == null) { + throw new IllegalArgumentException("Please specify a database type."); + } + return new PaginationInterceptor(dialect != null ? dialect : properties.getDatabase().newDialect(), properties); + } + +} diff --git a/mypages-spring-boot-autoconfigure/src/main/java/io/leego/mypages/spring/boot/autoconfigure/MyPagesProperties.java b/mypages-spring-boot-autoconfigure/src/main/java/io/leego/mypages/spring/boot/autoconfigure/MyPagesProperties.java new file mode 100644 index 0000000..8fbfb42 --- /dev/null +++ b/mypages-spring-boot-autoconfigure/src/main/java/io/leego/mypages/spring/boot/autoconfigure/MyPagesProperties.java @@ -0,0 +1,11 @@ +package io.leego.mypages.spring.boot.autoconfigure; + +import io.leego.mypages.interceptor.PaginationSettings; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Yihleego + */ +@ConfigurationProperties("mypages") +public class MyPagesProperties extends PaginationSettings { +} diff --git a/mypages-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/mypages-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..bfda226 --- /dev/null +++ b/mypages-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=io.leego.mypages.spring.boot.autoconfigure.MyPagesAutoConfiguration \ No newline at end of file diff --git a/mypages-spring-boot-starter/README.ZH_CN.md b/mypages-spring-boot-starter/README.ZH_CN.md new file mode 100644 index 0000000..37ebcf1 --- /dev/null +++ b/mypages-spring-boot-starter/README.ZH_CN.md @@ -0,0 +1,89 @@ +# 1. 简介 + +MyPages是Java实现基于[MyBatis](https://github.com/mybatis/mybatis-3)的开源分页插件,最大程度简化数据库分页查询操作,支持市面上大部分数据库,如:MySQL、PostgreSQL、Oracle、SQLServer等。 + +# 2. 准备工作 + +请确保您的Java版本在1.8及以上。 + +# 3. Maven 依赖 + +```xml + + io.leego + mypages-spring-boot-starter + ${mypages-spring-boot-starter.version} + +``` + +# 4. 配置 + +|Property|Description|Default| +|:-|:-|:-| +|mypages.enabled|是否启用分页插件|`true`| +|mypages.database|指定数据库类型,如:`MySQL`、`PostgreSQL`、`Oracle`等|| +|mypages.count-expr|设置count表达式|`*`| +|mypages.page-field|从参数字段中获取`page`值|| +|mypages.size-field|从参数字段中获取`size`值|| +|mypages.offset-field|从参数字段中获取`offset`值|| +|mypages.rows-field|从参数字段中获取`rows`值|| +|mypages.count-expr-field|从参数字段中获取count表达式|| +|mypages.count-method-name-field|从参数字段中获取自定义count方法名称|| +|mypages.enable-count-field|从参数字段中判断是否启用count|| +|mypages.skip-query-if-count-equals-zero|是否跳过查询如果结果数量为`0`|`true`| +|mypages.use-generated-if-count-method-is-missing|是否使用自动生成的count方法如果指定count方法不存在|`true`| +|mypages.use-graceful-count-sql|是否使用优雅的Count-SQL|`true`| +|mypages.keep-sorting|是否保留排序|`false`| +|mypages.default-page|如果`page`为空或小于`1`,则用`default-page`替换`page`,`-1`表示不启用|`-1`| +|mypages.default-size|如果`size`为空或小于`1`,则用`default-size`替换`size`,`-1`表示不启用|`-1`| +|mypages.max-page|如果`page`大于`max-page`,则用`max-page`替换`page`,`-1`表示不启用|`-1`| +|mypages.max-size|如果`size`大于`max-size`,则用`max-size`替换`size`,`-1`表示不启用|`-1`| + +### 示例 + +Properties + +```properties +mypages.enabled=true +mypages.database=MYSQL +mypages.count-expr=* +mypages.page-field=page +mypages.size-field=size +mypages.offset-field=offset +mypages.rows-field=rows +mypages.count-expr-field=countExpr +mypages.count-method-name-field=countMethodName +mypages.enable-count-field=enableCount +mypages.skip-query-if-count-equals-zero=true +mypages.use-generated-if-count-method-is-missing=true +mypages.use-graceful-count-sql=true +mypages.keep-sorting=false +mypages.default-page=1 +mypages.default-size=10 +mypages.max-page=10000 +mypages.max-size=10000 +``` + +Yaml + +```yaml +mypages: + enabled: true + database: MYSQL + count-expr: '*' + page-field: page + size-field: size + offset-field: offset + rows-field: rows + count-expr-field: countExpr + count-method-name-field: countMethodName + enable-count-field: enableCount + skip-query-if-count-equals-zero: true + use-generated-if-count-method-is-missing: true + use-graceful-count-sql: true + keep-sorting: false + default-page: 1 + default-size: 10 + max-page: 10000 + max-size: 10000 +``` \ No newline at end of file diff --git a/mypages-spring-boot-starter/README.md b/mypages-spring-boot-starter/README.md new file mode 100644 index 0000000..c9fdd6e --- /dev/null +++ b/mypages-spring-boot-starter/README.md @@ -0,0 +1,89 @@ +# 1. Introduction + +MyPages is a java based, open source pagination plugin for [MyBatis](https://github.com/mybatis/mybatis-3) that simplifies database paging queries. + +# 2. Getting Started + +Please make sure the Java version is 1.8 or above. + +# 3. Maven Dependency + +```xml + + io.leego + mypages-spring-boot-starter + ${mypages-spring-boot-starter.version} + +``` + +# 4. Configuration + +|Property|Description|Default| +|:-|:-|:-| +|mypages.enabled|Whether to enable the plugin|`true`| +|mypages.database|The database type such as `MySQL`, `PostgreSQL`, `Oracle`, etc|| +|mypages.count-expr|The column name or expression|`*`| +|mypages.page-field|The `page` field name of the parameter|| +|mypages.size-field|The `size` field name of the parameter|| +|mypages.offset-field|The `offset` field name of the parameter|| +|mypages.rows-field|The `rows` field name of the parameter|| +|mypages.count-expr-field|The count expression field name of the parameter|| +|mypages.count-method-name-field|The `count-method-name` field name of the parameter|| +|mypages.enable-count-field|The `enable-count` field name of the parameter|| +|mypages.skip-query-if-count-equals-zero|Whether to skip query if total value equals zero|`true`| +|mypages.use-generated-if-count-method-is-missing|Whether to use generated if the specified count method is missing|`true`| +|mypages.use-graceful-count-sql|Whether to use graceful count-sql|`true`| +|mypages.keep-sorting|Whether to keep sorting|`false`| +|mypages.default-page|Replaces the `page` with `default-page` if the `page` is `null` or less than `1`|`-1`| +|mypages.default-size|Replaces the `size` with `default-size` if the `size` is `null` or less than `1`|`-1`| +|mypages.max-page|Replaces the `page` with `max-page` if the `page` is greater than `max-page`|`-1`| +|mypages.max-size|Replaces the `size` with `max-size` if the `size` is greater than `max-size`|`-1`| + +### Example + +Properties + +```properties +mypages.enabled=true +mypages.database=MYSQL +mypages.count-expr=* +mypages.page-field=page +mypages.size-field=size +mypages.offset-field=offset +mypages.rows-field=rows +mypages.count-expr-field=countExpr +mypages.count-method-name-field=countMethodName +mypages.enable-count-field=enableCount +mypages.skip-query-if-count-equals-zero=true +mypages.use-generated-if-count-method-is-missing=true +mypages.use-graceful-count-sql=true +mypages.keep-sorting=false +mypages.default-page=1 +mypages.default-size=10 +mypages.max-page=10000 +mypages.max-size=10000 +``` + +Yaml + +```yaml +mypages: + enabled: true + database: MYSQL + count-expr: '*' + page-field: page + size-field: size + offset-field: offset + rows-field: rows + count-expr-field: countExpr + count-method-name-field: countMethodName + enable-count-field: enableCount + skip-query-if-count-equals-zero: true + use-generated-if-count-method-is-missing: true + use-graceful-count-sql: true + keep-sorting: false + default-page: 1 + default-size: 10 + max-page: 10000 + max-size: 10000 +``` \ No newline at end of file diff --git a/mypages-spring-boot-starter/pom.xml b/mypages-spring-boot-starter/pom.xml index 40a6497..b7b5b16 100644 --- a/mypages-spring-boot-starter/pom.xml +++ b/mypages-spring-boot-starter/pom.xml @@ -9,7 +9,7 @@ io.leego mypages-parent - 1.1.2 + 2.0.0 mypages-spring-boot-starter @@ -20,21 +20,7 @@ io.leego - mypages - - - org.mybatis - mybatis - true - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-configuration-processor - true + mypages-spring-boot-autoconfigure diff --git a/mypages-spring-boot-starter/src/main/java/io/leego/mypages/autoconfigure/MyPagesAutoConfiguration.java b/mypages-spring-boot-starter/src/main/java/io/leego/mypages/autoconfigure/MyPagesAutoConfiguration.java deleted file mode 100644 index 33f365f..0000000 --- a/mypages-spring-boot-starter/src/main/java/io/leego/mypages/autoconfigure/MyPagesAutoConfiguration.java +++ /dev/null @@ -1,85 +0,0 @@ -package io.leego.mypages.autoconfigure; - -import io.leego.mypages.dialect.Dialect; -import io.leego.mypages.interceptor.PaginationInterceptor; -import io.leego.mypages.interceptor.PaginationSettings; -import org.apache.ibatis.plugin.Interceptor; -import org.apache.ibatis.session.SqlSessionFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -/** - * @author Yihleego - */ -@Configuration -@ConditionalOnProperty(value = "spring.mypages.enabled", matchIfMissing = true) -@EnableConfigurationProperties(MyPagesProperties.class) -public class MyPagesAutoConfiguration { - - @Bean - @ConditionalOnMissingBean(PaginationInterceptor.class) - public PaginationInterceptor paginationInterceptor(MyPagesProperties properties, @Autowired(required = false) Dialect dialect) { - if (properties.getSqlDialect() == null && dialect == null) { - throw new IllegalArgumentException("SqlDialect is required."); - } - PaginationSettings settings = PaginationSettings.builder() - .dialect(dialect) - .sqlDialect(properties.getSqlDialect()) - .countExpr(properties.getCountExpr()) - .pageField(properties.getPageField()) - .sizeField(properties.getSizeField()) - .offsetField(properties.getOffsetField()) - .rowsField(properties.getRowsField()) - .countExprField(properties.getCountExprField()) - .countMethodNameField(properties.getCountMethodNameField()) - .enableCountField(properties.getEnableCountField()) - .skipQueryIfCountEqualsZero(properties.isSkipQueryIfCountEqualsZero()) - .useGeneratedIfCountMethodIsMissing(properties.isUseGeneratedIfCountMethodIsMissing()) - .defaultPage(properties.getDefaultPage()) - .defaultSize(properties.getDefaultSize()) - .maxPage(properties.getMaxPage()) - .maxSize(properties.getMaxSize()) - .build(); - return new PaginationInterceptor(settings); - } - - @Configuration - @ConditionalOnBean(SqlSessionFactory.class) - public static class PaginationInterceptorConfiguration implements InitializingBean { - @Autowired(required = false) - private List sqlSessionFactories; - @Autowired(required = false) - private PaginationInterceptor paginationInterceptor; - - @Override - public void afterPropertiesSet() { - if (sqlSessionFactories == null || paginationInterceptor == null) { - return; - } - for (SqlSessionFactory sqlSessionFactory : sqlSessionFactories) { - List interceptors = sqlSessionFactory.getConfiguration().getInterceptors(); - if (isAbsent(interceptors)) { - sqlSessionFactory.getConfiguration().addInterceptor(paginationInterceptor); - } - } - } - - private boolean isAbsent(List interceptors) { - for (Interceptor interceptor : interceptors) { - if (interceptor instanceof PaginationInterceptor) { - return false; - } - } - return true; - } - } - -} diff --git a/mypages-spring-boot-starter/src/main/java/io/leego/mypages/autoconfigure/MyPagesProperties.java b/mypages-spring-boot-starter/src/main/java/io/leego/mypages/autoconfigure/MyPagesProperties.java deleted file mode 100644 index 5f4d0b9..0000000 --- a/mypages-spring-boot-starter/src/main/java/io/leego/mypages/autoconfigure/MyPagesProperties.java +++ /dev/null @@ -1,171 +0,0 @@ -package io.leego.mypages.autoconfigure; - -import io.leego.mypages.dialect.SqlDialect; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * @author Yihleego - */ -@ConfigurationProperties("spring.mypages") -public class MyPagesProperties { - /** Enabled */ - private boolean enabled = true; - /** The specified SQL dialect. */ - private SqlDialect sqlDialect; - /** The column name or expression, the default value is "*". */ - private String countExpr; - /** The page field name. */ - private String pageField; - /** The size field name. */ - private String sizeField; - /** The offset field name. */ - private String offsetField; - /** The rows field name. */ - private String rowsField; - /** The count expression field name. */ - private String countExprField; - /** The count method name field name. */ - private String countMethodNameField; - /** The enable count field name. */ - private String enableCountField; - /** Whether to skip query if total value equals zero. */ - private boolean skipQueryIfCountEqualsZero = true; - /** Whether to use generated if the specified count method is missing. */ - private boolean useGeneratedIfCountMethodIsMissing = true; - /** Replaces page with defaultPage if page is invalid. */ - private int defaultPage = -1; - /** Replaces size with defaultSize if size is invalid. */ - private int defaultSize = -1; - /** Replaces page with maxPage if page is invalid. */ - private int maxPage = -1; - /** Replaces size with maxSize if size is invalid. */ - private int maxSize = -1; - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public SqlDialect getSqlDialect() { - return sqlDialect; - } - - public void setSqlDialect(SqlDialect sqlDialect) { - this.sqlDialect = sqlDialect; - } - - public String getCountExpr() { - return countExpr; - } - - public void setCountExpr(String countExpr) { - this.countExpr = countExpr; - } - - public String getPageField() { - return pageField; - } - - public void setPageField(String pageField) { - this.pageField = pageField; - } - - public String getSizeField() { - return sizeField; - } - - public void setSizeField(String sizeField) { - this.sizeField = sizeField; - } - - public String getOffsetField() { - return offsetField; - } - - public void setOffsetField(String offsetField) { - this.offsetField = offsetField; - } - - public String getRowsField() { - return rowsField; - } - - public void setRowsField(String rowsField) { - this.rowsField = rowsField; - } - - public String getCountExprField() { - return countExprField; - } - - public void setCountExprField(String countExprField) { - this.countExprField = countExprField; - } - - public String getCountMethodNameField() { - return countMethodNameField; - } - - public void setCountMethodNameField(String countMethodNameField) { - this.countMethodNameField = countMethodNameField; - } - - public String getEnableCountField() { - return enableCountField; - } - - public void setEnableCountField(String enableCountField) { - this.enableCountField = enableCountField; - } - - public boolean isSkipQueryIfCountEqualsZero() { - return skipQueryIfCountEqualsZero; - } - - public void setSkipQueryIfCountEqualsZero(boolean skipQueryIfCountEqualsZero) { - this.skipQueryIfCountEqualsZero = skipQueryIfCountEqualsZero; - } - - public boolean isUseGeneratedIfCountMethodIsMissing() { - return useGeneratedIfCountMethodIsMissing; - } - - public void setUseGeneratedIfCountMethodIsMissing(boolean useGeneratedIfCountMethodIsMissing) { - this.useGeneratedIfCountMethodIsMissing = useGeneratedIfCountMethodIsMissing; - } - - public int getDefaultPage() { - return defaultPage; - } - - public void setDefaultPage(int defaultPage) { - this.defaultPage = defaultPage; - } - - public int getDefaultSize() { - return defaultSize; - } - - public void setDefaultSize(int defaultSize) { - this.defaultSize = defaultSize; - } - - public int getMaxPage() { - return maxPage; - } - - public void setMaxPage(int maxPage) { - this.maxPage = maxPage; - } - - public int getMaxSize() { - return maxSize; - } - - public void setMaxSize(int maxSize) { - this.maxSize = maxSize; - } -} diff --git a/mypages-spring-boot-starter/src/main/resources/META-INF/spring.factories b/mypages-spring-boot-starter/src/main/resources/META-INF/spring.factories deleted file mode 100644 index da7ee24..0000000 --- a/mypages-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=io.leego.mypages.autoconfigure.MyPagesAutoConfiguration \ No newline at end of file diff --git a/mypages-test/pom.xml b/mypages-test/pom.xml new file mode 100644 index 0000000..f905437 --- /dev/null +++ b/mypages-test/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + + io.leego + mypages-parent + 2.0.0 + + + mypages-test + ${project.artifactId} + + + + io.leego + mypages-spring-boot-starter + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-test + test + + + mysql + mysql-connector-java + + + + \ No newline at end of file diff --git a/mypages-test/src/main/java/io/leego/mypages/test/MyPagesTestApplication.java b/mypages-test/src/main/java/io/leego/mypages/test/MyPagesTestApplication.java new file mode 100644 index 0000000..c626b9c --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/MyPagesTestApplication.java @@ -0,0 +1,16 @@ +package io.leego.mypages.test; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author Yihleego + */ +@SpringBootApplication +public class MyPagesTestApplication { + + public static void main(String[] args) { + SpringApplication.run(MyPagesTestApplication.class, args); + } + +} diff --git a/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomClassParam.java b/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomClassParam.java new file mode 100644 index 0000000..de3bd28 --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomClassParam.java @@ -0,0 +1,67 @@ +package io.leego.mypages.test.dto; + +/** + * @author Yihleego + */ +public class CustomClassParam { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; + + public CustomClassParam() { + } + + public CustomClassParam(Integer page, Integer size, Integer status) { + this.page = page; + this.size = size; + this.status = status; + } + + public CustomClassParam(Long offset, Integer rows, Integer status) { + this.offset = offset; + this.rows = rows; + this.status = status; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Long getOffset() { + return offset; + } + + public void setOffset(Long offset) { + this.offset = offset; + } + + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomCountParam.java b/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomCountParam.java new file mode 100644 index 0000000..8727b98 --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomCountParam.java @@ -0,0 +1,53 @@ +package io.leego.mypages.test.dto; + +/** + * @author Yihleego + */ +public class CustomCountParam { + private Integer page; + private Integer size; + private String countMethodName; + private Integer status; + + public CustomCountParam() { + } + + public CustomCountParam(Integer page, Integer size, String countMethodName, Integer status) { + this.page = page; + this.size = size; + this.countMethodName = countMethodName; + this.status = status; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public String getCountMethodName() { + return countMethodName; + } + + public void setCountMethodName(String countMethodName) { + this.countMethodName = countMethodName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomMapParam.java b/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomMapParam.java new file mode 100644 index 0000000..56e526e --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/dto/CustomMapParam.java @@ -0,0 +1,9 @@ +package io.leego.mypages.test.dto; + +import java.util.HashMap; + +/** + * @author Yihleego + */ +public class CustomMapParam extends HashMap { +} diff --git a/mypages-test/src/main/java/io/leego/mypages/test/dto/PageableParam.java b/mypages-test/src/main/java/io/leego/mypages/test/dto/PageableParam.java new file mode 100644 index 0000000..2b0f3d4 --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/dto/PageableParam.java @@ -0,0 +1,73 @@ +package io.leego.mypages.test.dto; + +import io.leego.mypages.util.Pageable; + +/** + * @author Yihleego + */ +public class PageableParam implements Pageable { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; + + public PageableParam() { + } + + public PageableParam(Integer page, Integer size, Integer status) { + this.page = page; + this.size = size; + this.status = status; + } + + public PageableParam(Long offset, Integer rows, Integer status) { + this.offset = offset; + this.rows = rows; + this.status = status; + } + + @Override + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + @Override + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + @Override + public Long getOffset() { + return offset; + } + + public void setOffset(Long offset) { + this.offset = offset; + } + + @Override + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-test/src/main/java/io/leego/mypages/test/dto/PaginationFieldParam.java b/mypages-test/src/main/java/io/leego/mypages/test/dto/PaginationFieldParam.java new file mode 100644 index 0000000..6c06c2a --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/dto/PaginationFieldParam.java @@ -0,0 +1,78 @@ +package io.leego.mypages.test.dto; + +import io.leego.mypages.annotation.Offset; +import io.leego.mypages.annotation.Page; +import io.leego.mypages.annotation.Pagination; +import io.leego.mypages.annotation.Rows; +import io.leego.mypages.annotation.Size; + +/** + * @author Yihleego + */ +@Pagination +public class PaginationFieldParam { + @Page + private Integer page; + @Size + private Integer size; + @Offset + private Long offset; + @Rows + private Integer rows; + private Integer status; + + public PaginationFieldParam() { + } + + public PaginationFieldParam(Integer page, Integer size, Integer status) { + this.page = page; + this.size = size; + this.status = status; + } + + public PaginationFieldParam(Long offset, Integer rows, Integer status) { + this.offset = offset; + this.rows = rows; + this.status = status; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Long getOffset() { + return offset; + } + + public void setOffset(Long offset) { + this.offset = offset; + } + + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-test/src/main/java/io/leego/mypages/test/dto/PaginationMethodParam.java b/mypages-test/src/main/java/io/leego/mypages/test/dto/PaginationMethodParam.java new file mode 100644 index 0000000..fe8cb7e --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/dto/PaginationMethodParam.java @@ -0,0 +1,78 @@ +package io.leego.mypages.test.dto; + +import io.leego.mypages.annotation.Offset; +import io.leego.mypages.annotation.Page; +import io.leego.mypages.annotation.Pagination; +import io.leego.mypages.annotation.Rows; +import io.leego.mypages.annotation.Size; + +/** + * @author Yihleego + */ +@Pagination +public class PaginationMethodParam { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; + + public PaginationMethodParam() { + } + + public PaginationMethodParam(Integer page, Integer size, Integer status) { + this.page = page; + this.size = size; + this.status = status; + } + + public PaginationMethodParam(Long offset, Integer rows, Integer status) { + this.offset = offset; + this.rows = rows; + this.status = status; + } + + @Page + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + @Size + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + @Offset + public Long getOffset() { + return offset; + } + + public void setOffset(Long offset) { + this.offset = offset; + } + + @Rows + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/mypages-test/src/main/java/io/leego/mypages/test/entity/User.java b/mypages-test/src/main/java/io/leego/mypages/test/entity/User.java new file mode 100644 index 0000000..f50e35a --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/entity/User.java @@ -0,0 +1,85 @@ +package io.leego.mypages.test.entity; + +import java.time.LocalDateTime; + +/** + * @author Yihleego + */ +public class User { + private Long id; + private LocalDateTime createdTime; + private LocalDateTime updatedTime; + private String username; + private String password; + private String nickname; + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDateTime getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(LocalDateTime createdTime) { + this.createdTime = createdTime; + } + + public LocalDateTime getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(LocalDateTime updatedTime) { + this.updatedTime = updatedTime; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", createdTime=" + createdTime + + ", updatedTime=" + updatedTime + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", nickname='" + nickname + '\'' + + ", status=" + status + + '}'; + } +} \ No newline at end of file diff --git a/mypages-test/src/main/java/io/leego/mypages/test/enums/UserStatusEnum.java b/mypages-test/src/main/java/io/leego/mypages/test/enums/UserStatusEnum.java new file mode 100644 index 0000000..2c0903a --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/enums/UserStatusEnum.java @@ -0,0 +1,19 @@ +package io.leego.mypages.test.enums; + +/** + * @author Yihleego + */ +public enum UserStatusEnum { + DISABLED(0), + ENABLED(1); + + private final int code; + + UserStatusEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/mypages-test/src/main/java/io/leego/mypages/test/mapper/UserMapper.java b/mypages-test/src/main/java/io/leego/mypages/test/mapper/UserMapper.java new file mode 100644 index 0000000..37e9922 --- /dev/null +++ b/mypages-test/src/main/java/io/leego/mypages/test/mapper/UserMapper.java @@ -0,0 +1,99 @@ +package io.leego.mypages.test.mapper; + +import io.leego.mypages.test.dto.CustomClassParam; +import io.leego.mypages.test.dto.CustomCountParam; +import io.leego.mypages.test.dto.CustomMapParam; +import io.leego.mypages.test.dto.PageableParam; +import io.leego.mypages.test.dto.PaginationFieldParam; +import io.leego.mypages.test.dto.PaginationMethodParam; +import io.leego.mypages.test.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + * @author Yihleego + */ +@Mapper +public interface UserMapper { + + @Select("select * from user where status = #{status}") + List findByStatus(@Param("status") Integer status); + + @Select("select count(*) as total from user where status = #{status}") + long countByStatus(@Param("status") Integer status); + + + @Select("select * from user where status = #{status}") + List findByStatusWithPageSizeParam(@Param("page") Integer page, @Param("size") Integer size, @Param("status") Integer status); + + @Select("select * from user where status = #{status}") + List findByStatusOffsetRowsWithParam(@Param("offset") Long offset, @Param("rows") Integer rows, @Param("status") Integer status); + + + @Select("select * from user where status = #{status}") + List findByPaginationField(PaginationFieldParam param); + + @Select("select * from user where status = #{param.status}") + List findByPaginationFieldWithParam0(@Param("param") PaginationFieldParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPaginationFieldWithParam1(@Param("param1") PaginationFieldParam param); + + + @Select("select * from user where status = #{status}") + List findByPaginationMethod(PaginationMethodParam param); + + @Select("select * from user where status = #{param.status}") + List findByPaginationMethodWithParam0(@Param("param") PaginationMethodParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPaginationMethodWithParam1(@Param("param1") PaginationMethodParam param); + + + @Select("select * from user where status = #{status}") + List findByPageable(PageableParam param); + + @Select("select * from user where status = #{param.status}") + List findByPageableWithParam0(@Param("param") PageableParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPageableWithParam1(@Param("param1") PageableParam param); + + + @Select("select * from user where status = #{status}") + List findByCustomClass(CustomClassParam param); + + @Select("select * from user where status = #{param.status}") + List findByCustomClassWithParam0(@Param("param") CustomClassParam param); + + @Select("select * from user where status = #{param1.status}") + List findByCustomClassWithParam1(@Param("param1") CustomClassParam param); + + + @Select("select * from user where status = #{status}") + List findByCustomMap(CustomMapParam param); + + @Select("select * from user where status = #{param.status}") + List findByCustomMapWithParam0(@Param("param") CustomMapParam param); + + @Select("select * from user where status = #{param1.status}") + List findByCustomMapWithParam1(@Param("param1") CustomMapParam param); + + + @Select("select * from user where status = #{status}") + List findByCollectionMap(Map param); + + @Select("select * from user where status = #{map.status}") + List findByCollectionMapWithParam0(@Param("map") Map map); + + @Select("select * from user where status = #{param1.status}") + List findByCollectionMapWithParam1(@Param("param1") Map map); + + + @Select("select * from user where status = #{status}") + List findByCustomCount(CustomCountParam param); +} diff --git a/mypages-test/src/main/resources/application.properties b/mypages-test/src/main/resources/application.properties new file mode 100644 index 0000000..3b66b93 --- /dev/null +++ b/mypages-test/src/main/resources/application.properties @@ -0,0 +1,23 @@ +# port +server.port=10000 +# name +spring.application.name=mypages-test +# logging +logging.level.io.leego=debug +# datasource +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/mypages?serverTimezone=GMT%2B8 +spring.datasource.username=root +spring.datasource.password=123456 +# mybatis +mybatis.configuration.cache-enabled=false +mybatis.configuration.local-cache-scope=STATEMENT +mybatis.configuration.jdbc-type-for-null=NULL +mybatis.configuration.map-underscore-to-camel-case=true +# sql init +spring.sql.init.mode=ALWAYS +spring.sql.init.username=root +spring.sql.init.password=${spring.datasource.password} +spring.sql.init.schema-locations=classpath*:sql/ddl.sql +spring.sql.init.data-locations=classpath*:sql/dml.sql +spring.sql.init.continue-on-error=true \ No newline at end of file diff --git a/mypages-test/src/main/resources/sql/ddl.sql b/mypages-test/src/main/resources/sql/ddl.sql new file mode 100644 index 0000000..99e82ee --- /dev/null +++ b/mypages-test/src/main/resources/sql/ddl.sql @@ -0,0 +1,12 @@ +create table if not exists user +( + id bigint primary key auto_increment not null, + created_time datetime not null, + updated_time datetime null, + username varchar(20) not null, + password varchar(40) not null, + nickname varchar(20) not null, + status tinyint default 1 not null +); +create unique index uk_user_username on user (username); +create index idx_user_nickname on user (nickname); \ No newline at end of file diff --git a/mypages-test/src/main/resources/sql/dml.sql b/mypages-test/src/main/resources/sql/dml.sql new file mode 100644 index 0000000..10c4f27 --- /dev/null +++ b/mypages-test/src/main/resources/sql/dml.sql @@ -0,0 +1,27 @@ +insert into user (username, password, nickname, created_time) +values ('jack', '123456', 'Jack', now()), + ('charles', '123456', 'Charles', now()), + ('bill', '123456', 'Bill', now()), + ('vincent', '123456', 'Vincent', now()), + ('william', '123456', 'William', now()), + ('joseph', '123456', 'Joseph', now()), + ('james', '123456', 'James', now()), + ('henry', '123456', 'Henry', now()), + ('gary', '123456', 'Gary', now()), + ('martin', '123456', 'Martin', now()), + ('malcolm', '123456', 'Malcolm', now()), + ('joan', '123456', 'Joan', now()), + ('niki', '123456', 'Niki', now()), + ('betty', '123456', 'Betty', now()), + ('linda', '123456', 'Linda', now()), + ('whitney', '123456', 'Whitney', now()), + ('lily', '123456', 'Lily', now()), + ('fred', '123456', 'Fred', now()), + ('karl', '123456', 'Karl', now()), + ('barbara', '123456', 'Barbara', now()), + ('elizabeth', '123456', 'Elizabeth', now()), + ('helen', '123456', 'Helen', now()), + ('katharine', '123456', 'Katharine', now()), + ('diana', '123456', 'Diana', now()), + ('bob', '123456', 'Bob', now()) +on duplicate key update updated_time = now(); diff --git a/mypages-test/src/test/java/io/leego/mypages/test/specification/CollectionMapTests.java b/mypages-test/src/test/java/io/leego/mypages/test/specification/CollectionMapTests.java new file mode 100644 index 0000000..3b1c604 --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/specification/CollectionMapTests.java @@ -0,0 +1,179 @@ +package io.leego.mypages.test.specification; + +import io.leego.mypages.interceptor.PaginationInterceptor; +import io.leego.mypages.test.entity.User; +import io.leego.mypages.test.enums.UserStatusEnum; +import io.leego.mypages.test.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; + +/** + * @author Yihleego + */ +@SpringBootTest +public class CollectionMapTests { + private static final Logger logger = LoggerFactory.getLogger(CollectionMapTests.class); + @Autowired + private PaginationInterceptor interceptor; + @Autowired + private UserMapper userMapper; + private List users; + + @BeforeEach + public void before() { + /* Configuration: + mypages.page-field=page + mypages.size-field=size + mypages.offset-field=offset + mypages.rows-field=rows*/ + interceptor.getSettings().setPageField("page"); + interceptor.getSettings().setSizeField("size"); + interceptor.getSettings().setOffsetField("offset"); + interceptor.getSettings().setRowsField("rows"); + users = userMapper.findByStatus(UserStatusEnum.ENABLED.getCode()); + } + + + @Test + public void findByCollectionMapPageSize() { + pageSizeFind(userMapper::findByCollectionMap, pageSizeMap()); + } + + @Test + public void findByCollectionMapWithParam0PageSize() { + pageSizeFind(userMapper::findByCollectionMapWithParam0, pageSizeMap()); + } + + @Test + public void findByCollectionMapWithParam1PageSize() { + pageSizeFind(userMapper::findByCollectionMapWithParam1, pageSizeMap()); + } + + + @Test + public void findByCollectionMapOffsetRows() { + offsetRowsFind(userMapper::findByCollectionMap, offsetRowsMap()); + } + + @Test + public void findByCollectionMapWithParam0OffsetRows() { + offsetRowsFind(userMapper::findByCollectionMapWithParam0, offsetRowsMap()); + } + + @Test + public void findByCollectionMapWithParam1OffsetRows() { + offsetRowsFind(userMapper::findByCollectionMapWithParam1, offsetRowsMap()); + } + + + @Test + public void findByCollectionMapPageSizeLoop() { + pageSizeLoop(userMapper::findByCollectionMap, pageSizeMap()); + } + + @Test + public void findByCollectionMapWithParam0PageSizeLoop() { + pageSizeLoop(userMapper::findByCollectionMapWithParam0, pageSizeMap()); + } + + @Test + public void findByCollectionMapWithParam1PageSizeLoop() { + pageSizeLoop(userMapper::findByCollectionMapWithParam1, pageSizeMap()); + } + + + @Test + public void findByCollectionMapOffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCollectionMap, offsetRowsMap()); + } + + @Test + public void findByCollectionMapWithParam0OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCollectionMapWithParam0, offsetRowsMap()); + } + + @Test + public void findByCollectionMapWithParam1OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCollectionMapWithParam1, offsetRowsMap()); + } + + + public Page pageSizeFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.get("size"), page.getList().size()) + : Objects.equals(param.get("size"), page.getSize())); + Assertions.assertEquals(page.getPage(), param.get("page")); + return page; + } + + public Page offsetRowsFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.get("rows"), page.getList().size()) + : Objects.equals(param.get("rows"), page.getSize())); + Assertions.assertEquals((long) (page.getPage() - 1) * page.getSize(), param.get("offset")); + return page; + } + + public void pageSizeLoop(Function> function, T param) { + int i = 1; + while (true) { + param.put("page", i); + Page page = pageSizeFind(function, param); + if (!page.getNext()) { + break; + } + i++; + } + } + + public void offsetRowsLoop(Function> function, T param) { + long i = 0; + while (true) { + param.put("offset", i); + Page page = offsetRowsFind(function, param); + if (!page.getNext()) { + break; + } + i += (int) param.get("rows"); + } + } + + public Map pageSizeMap() { + Map map = new HashMap<>(); + map.put("page", 1); + map.put("size", 10); + map.put("status", UserStatusEnum.ENABLED.getCode()); + return map; + } + + public Map offsetRowsMap() { + Map map = new HashMap<>(); + map.put("offset", 0L); + map.put("rows", 10); + map.put("status", UserStatusEnum.ENABLED.getCode()); + return map; + } + +} diff --git a/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomClassTests.java b/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomClassTests.java new file mode 100644 index 0000000..88b3d87 --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomClassTests.java @@ -0,0 +1,173 @@ +package io.leego.mypages.test.specification; + +import io.leego.mypages.interceptor.PaginationInterceptor; +import io.leego.mypages.test.dto.CustomClassParam; +import io.leego.mypages.test.entity.User; +import io.leego.mypages.test.enums.UserStatusEnum; +import io.leego.mypages.test.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +/** + * @author Yihleego + */ +@SpringBootTest +public class CustomClassTests { + private static final Logger logger = LoggerFactory.getLogger(CustomClassTests.class); + @Autowired + private PaginationInterceptor interceptor; + @Autowired + private UserMapper userMapper; + private List users; + + @BeforeEach + public void before() { + /* Configuration: + mypages.page-field=page + mypages.size-field=size + mypages.offset-field=offset + mypages.rows-field=rows*/ + interceptor.getSettings().setPageField("page"); + interceptor.getSettings().setSizeField("size"); + interceptor.getSettings().setOffsetField("offset"); + interceptor.getSettings().setRowsField("rows"); + users = userMapper.findByStatus(UserStatusEnum.ENABLED.getCode()); + } + + + @Test + public void findByCustomClassPageSize() { + pageSizeFind(userMapper::findByCustomClass, + new CustomClassParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByCustomClassWithParam0PageSize() { + pageSizeFind(userMapper::findByCustomClassWithParam0, + new CustomClassParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByCustomClassWithParam1PageSize() { + pageSizeFind(userMapper::findByCustomClassWithParam1, + new CustomClassParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByCustomClassOffsetRows() { + offsetRowsFind(userMapper::findByCustomClass, + new CustomClassParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByCustomClassWithParam0OffsetRows() { + offsetRowsFind(userMapper::findByCustomClassWithParam0, + new CustomClassParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByCustomClassWithParam1OffsetRows() { + offsetRowsFind(userMapper::findByCustomClassWithParam1, + new CustomClassParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByCustomClassPageSizeLoop() { + pageSizeLoop(userMapper::findByCustomClass, + new CustomClassParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByCustomClassWithParam0PageSizeLoop() { + pageSizeLoop(userMapper::findByCustomClassWithParam0, + new CustomClassParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByCustomClassWithParam1PageSizeLoop() { + pageSizeLoop(userMapper::findByCustomClassWithParam1, + new CustomClassParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByCustomClassOffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCustomClass, + new CustomClassParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByCustomClassWithParam0OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCustomClassWithParam0, + new CustomClassParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByCustomClassWithParam1OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCustomClassWithParam1, + new CustomClassParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + + public Page pageSizeFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getSize(), page.getList().size()) + : Objects.equals(param.getSize(), page.getSize())); + Assertions.assertEquals(page.getPage(), param.getPage()); + return page; + } + + public Page offsetRowsFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getRows(), page.getList().size()) + : Objects.equals(param.getRows(), page.getSize())); + Assertions.assertEquals((long) (page.getPage() - 1) * page.getSize(), param.getOffset()); + return page; + } + + public void pageSizeLoop(Function> function, T param) { + int i = 1; + while (true) { + param.setPage(i); + Page page = pageSizeFind(function, param); + if (!page.getNext()) { + break; + } + i++; + } + } + + public void offsetRowsLoop(Function> function, T param) { + long i = 0; + while (true) { + param.setOffset(i); + Page page = offsetRowsFind(function, param); + if (!page.getNext()) { + break; + } + i += param.getRows(); + } + } +} diff --git a/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomCountTests.java b/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomCountTests.java new file mode 100644 index 0000000..d2e0c92 --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomCountTests.java @@ -0,0 +1,59 @@ +package io.leego.mypages.test.specification; + +import io.leego.mypages.interceptor.PaginationInterceptor; +import io.leego.mypages.test.dto.CustomCountParam; +import io.leego.mypages.test.entity.User; +import io.leego.mypages.test.enums.UserStatusEnum; +import io.leego.mypages.test.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Objects; + +/** + * @author Yihleego + */ +@SpringBootTest +public class CustomCountTests { + private static final Logger logger = LoggerFactory.getLogger(CustomClassTests.class); + @Autowired + private PaginationInterceptor interceptor; + @Autowired + private UserMapper userMapper; + private List users; + + @BeforeEach + public void before() { + /* Configuration: + mypages.page-field=page + mypages.size-field=size + mypages.count-method-name-field=countMethodName*/ + interceptor.getSettings().setPageField("page"); + interceptor.getSettings().setSizeField("size"); + interceptor.getSettings().setCountMethodNameField("countMethodName"); + users = userMapper.findByStatus(UserStatusEnum.ENABLED.getCode()); + } + + + @Test + public void findByCustomCount() { + CustomCountParam param = new CustomCountParam(1, 10, "countByStatus", UserStatusEnum.ENABLED.getCode()); + List list = userMapper.findByCustomCount(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getSize(), page.getList().size()) + : Objects.equals(param.getSize(), page.getSize())); + Assertions.assertEquals(page.getPage(), param.getPage()); + } + +} diff --git a/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomMapTests.java b/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomMapTests.java new file mode 100644 index 0000000..e5c28dc --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/specification/CustomMapTests.java @@ -0,0 +1,178 @@ +package io.leego.mypages.test.specification; + +import io.leego.mypages.interceptor.PaginationInterceptor; +import io.leego.mypages.test.dto.CustomMapParam; +import io.leego.mypages.test.entity.User; +import io.leego.mypages.test.enums.UserStatusEnum; +import io.leego.mypages.test.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +/** + * @author Yihleego + */ +@SpringBootTest +public class CustomMapTests { + private static final Logger logger = LoggerFactory.getLogger(CustomMapTests.class); + @Autowired + private PaginationInterceptor interceptor; + @Autowired + private UserMapper userMapper; + private List users; + + @BeforeEach + public void before() { + /* Configuration: + mypages.page-field=page + mypages.size-field=size + mypages.offset-field=offset + mypages.rows-field=rows*/ + interceptor.getSettings().setPageField("page"); + interceptor.getSettings().setSizeField("size"); + interceptor.getSettings().setOffsetField("offset"); + interceptor.getSettings().setRowsField("rows"); + users = userMapper.findByStatus(UserStatusEnum.ENABLED.getCode()); + } + + + @Test + public void findByCustomMapPageSize() { + pageSizeFind(userMapper::findByCustomMap, pageSizeMap()); + } + + @Test + public void findByCustomMapWithParam0PageSize() { + pageSizeFind(userMapper::findByCustomMapWithParam0, pageSizeMap()); + } + + @Test + public void findByCustomMapWithParam1PageSize() { + pageSizeFind(userMapper::findByCustomMapWithParam1, pageSizeMap()); + } + + + @Test + public void findByCustomMapOffsetRows() { + offsetRowsFind(userMapper::findByCustomMap, offsetRowsMap()); + } + + @Test + public void findByCustomMapWithParam0OffsetRows() { + offsetRowsFind(userMapper::findByCustomMapWithParam0, offsetRowsMap()); + } + + @Test + public void findByCustomMapWithParam1OffsetRows() { + offsetRowsFind(userMapper::findByCustomMapWithParam1, offsetRowsMap()); + } + + + @Test + public void findByCustomMapPageSizeLoop() { + pageSizeLoop(userMapper::findByCustomMap, pageSizeMap()); + } + + @Test + public void findByCustomMapWithParam0PageSizeLoop() { + pageSizeLoop(userMapper::findByCustomMapWithParam0, pageSizeMap()); + } + + @Test + public void findByCustomMapWithParam1PageSizeLoop() { + pageSizeLoop(userMapper::findByCustomMapWithParam1, pageSizeMap()); + } + + + @Test + public void findByCustomMapOffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCustomMap, offsetRowsMap()); + } + + @Test + public void findByCustomMapWithParam0OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCustomMapWithParam0, offsetRowsMap()); + } + + @Test + public void findByCustomMapWithParam1OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByCustomMapWithParam1, offsetRowsMap()); + } + + + public Page pageSizeFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.get("size"), page.getList().size()) + : Objects.equals(param.get("size"), page.getSize())); + Assertions.assertEquals(page.getPage(), param.get("page")); + return page; + } + + public Page offsetRowsFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.get("rows"), page.getList().size()) + : Objects.equals(param.get("rows"), page.getSize())); + Assertions.assertEquals((long) (page.getPage() - 1) * page.getSize(), param.get("offset")); + return page; + } + + public void pageSizeLoop(Function> function, T param) { + int i = 1; + while (true) { + param.put("page", i); + Page page = pageSizeFind(function, param); + if (!page.getNext()) { + break; + } + i++; + } + } + + public void offsetRowsLoop(Function> function, T param) { + long i = 0; + while (true) { + param.put("offset", i); + Page page = offsetRowsFind(function, param); + if (!page.getNext()) { + break; + } + i += (int) param.get("rows"); + } + } + + public CustomMapParam pageSizeMap() { + CustomMapParam map = new CustomMapParam(); + map.put("page", 1); + map.put("size", 10); + map.put("status", UserStatusEnum.ENABLED.getCode()); + return map; + } + + public CustomMapParam offsetRowsMap() { + CustomMapParam map = new CustomMapParam(); + map.put("offset", 0L); + map.put("rows", 10); + map.put("status", UserStatusEnum.ENABLED.getCode()); + return map; + } + +} diff --git a/mypages-test/src/test/java/io/leego/mypages/test/specification/MybatisParamTests.java b/mypages-test/src/test/java/io/leego/mypages/test/specification/MybatisParamTests.java new file mode 100644 index 0000000..ca5be85 --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/specification/MybatisParamTests.java @@ -0,0 +1,116 @@ +package io.leego.mypages.test.specification; + +import io.leego.mypages.interceptor.PaginationInterceptor; +import io.leego.mypages.test.dto.PageableParam; +import io.leego.mypages.test.entity.User; +import io.leego.mypages.test.enums.UserStatusEnum; +import io.leego.mypages.test.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Objects; + +/** + * @author Yihleego + */ +@SpringBootTest +public class MybatisParamTests { + private static final Logger logger = LoggerFactory.getLogger(MybatisParamTests.class); + @Autowired + private PaginationInterceptor interceptor; + @Autowired + private UserMapper userMapper; + private List users; + + @BeforeEach + public void before() { + /* Configuration: + mypages.page-field=page + mypages.size-field=size + mypages.offset-field=offset + mypages.rows-field=rows*/ + interceptor.getSettings().setPageField("page"); + interceptor.getSettings().setSizeField("size"); + interceptor.getSettings().setOffsetField("offset"); + interceptor.getSettings().setRowsField("rows"); + users = userMapper.findByStatus(UserStatusEnum.ENABLED.getCode()); + } + + + @Test + public void findByStatusWithPageSizeParam() { + pageSizeFind(1, 10); + } + + @Test + public void findByStatusOffsetRowsWithParam() { + offsetRowsFind(0L, 10); + } + + + @Test + public void findByStatusWithPageSizeParamLoop() { + pageSizeLoop(); + } + + @Test + public void findByStatusOffsetRowsWithParamLoop() { + offsetRowsLoop(); + } + + + public Page pageSizeFind(Integer paramPage, Integer paramSize) { + List list = userMapper.findByStatusWithPageSizeParam(paramPage, paramSize, UserStatusEnum.ENABLED.getCode()); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(paramSize, page.getList().size()) + : Objects.equals(paramSize, page.getSize())); + Assertions.assertEquals(page.getPage(), paramPage); + return page; + } + + public Page offsetRowsFind(Long paramOffset, Integer paramRows) { + List list = userMapper.findByStatusOffsetRowsWithParam(paramOffset, paramRows, UserStatusEnum.ENABLED.getCode()); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(paramRows, page.getList().size()) + : Objects.equals(paramRows, page.getSize())); + Assertions.assertEquals((long) (page.getPage() - 1) * page.getSize(), paramOffset); + return page; + } + + public void pageSizeLoop() { + int i = 1; + while (true) { + Page page = pageSizeFind(i, 10); + if (!page.getNext()) { + break; + } + i++; + } + } + + public void offsetRowsLoop() { + long i = 0; + while (true) { + Page page = offsetRowsFind(i, 10); + if (!page.getNext()) { + break; + } + i += 10; + } + } +} diff --git a/mypages-test/src/test/java/io/leego/mypages/test/specification/PageableTests.java b/mypages-test/src/test/java/io/leego/mypages/test/specification/PageableTests.java new file mode 100644 index 0000000..0e16731 --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/specification/PageableTests.java @@ -0,0 +1,161 @@ +package io.leego.mypages.test.specification; + +import io.leego.mypages.test.dto.PageableParam; +import io.leego.mypages.test.entity.User; +import io.leego.mypages.test.enums.UserStatusEnum; +import io.leego.mypages.test.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +/** + * @author Yihleego + */ +@SpringBootTest +public class PageableTests { + private static final Logger logger = LoggerFactory.getLogger(PageableTests.class); + @Autowired + private UserMapper userMapper; + private List users; + + @BeforeEach + public void before() { + users = userMapper.findByStatus(UserStatusEnum.ENABLED.getCode()); + } + + + @Test + public void findByPageablePageSize() { + pageSizeFind(userMapper::findByPageable, + new PageableParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPageableWithParam0PageSize() { + pageSizeFind(userMapper::findByPageableWithParam0, + new PageableParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPageableWithParam1PageSize() { + pageSizeFind(userMapper::findByPageableWithParam1, + new PageableParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPageableOffsetRows() { + offsetRowsFind(userMapper::findByPageable, + new PageableParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPageableWithParam0OffsetRows() { + offsetRowsFind(userMapper::findByPageableWithParam0, + new PageableParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPageableWithParam1OffsetRows() { + offsetRowsFind(userMapper::findByPageableWithParam1, + new PageableParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPageablePageSizeLoop() { + pageSizeLoop(userMapper::findByPageable, + new PageableParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPageableWithParam0PageSizeLoop() { + pageSizeLoop(userMapper::findByPageableWithParam0, + new PageableParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPageableWithParam1PageSizeLoop() { + pageSizeLoop(userMapper::findByPageableWithParam1, + new PageableParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPageableOffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPageable, + new PageableParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPageableWithParam0OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPageableWithParam0, + new PageableParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPageableWithParam1OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPageableWithParam1, + new PageableParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + + public Page pageSizeFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getSize(), page.getList().size()) + : Objects.equals(param.getSize(), page.getSize())); + Assertions.assertEquals(page.getPage(), param.getPage()); + return page; + } + + public Page offsetRowsFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getRows(), page.getList().size()) + : Objects.equals(param.getRows(), page.getSize())); + Assertions.assertEquals((long) (page.getPage() - 1) * page.getSize(), param.getOffset()); + return page; + } + + public void pageSizeLoop(Function> function, T param) { + int i = 1; + while (true) { + param.setPage(i); + Page page = pageSizeFind(function, param); + if (!page.getNext()) { + break; + } + i++; + } + } + + public void offsetRowsLoop(Function> function, T param) { + long i = 0; + while (true) { + param.setOffset(i); + Page page = offsetRowsFind(function, param); + if (!page.getNext()) { + break; + } + i += param.getRows(); + } + } +} diff --git a/mypages-test/src/test/java/io/leego/mypages/test/specification/PaginationFieldTests.java b/mypages-test/src/test/java/io/leego/mypages/test/specification/PaginationFieldTests.java new file mode 100644 index 0000000..58daafd --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/specification/PaginationFieldTests.java @@ -0,0 +1,161 @@ +package io.leego.mypages.test.specification; + +import io.leego.mypages.test.dto.PaginationFieldParam; +import io.leego.mypages.test.entity.User; +import io.leego.mypages.test.enums.UserStatusEnum; +import io.leego.mypages.test.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +/** + * @author Yihleego + */ +@SpringBootTest +public class PaginationFieldTests { + private static final Logger logger = LoggerFactory.getLogger(PaginationFieldTests.class); + @Autowired + private UserMapper userMapper; + private List users; + + @BeforeEach + public void before() { + users = userMapper.findByStatus(UserStatusEnum.ENABLED.getCode()); + } + + + @Test + public void findByPaginationFieldPageSize() { + pageSizeFind(userMapper::findByPaginationField, + new PaginationFieldParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationFieldWithParam0PageSize() { + pageSizeFind(userMapper::findByPaginationFieldWithParam0, + new PaginationFieldParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationFieldWithParam1PageSize() { + pageSizeFind(userMapper::findByPaginationFieldWithParam1, + new PaginationFieldParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPaginationFieldOffsetRows() { + offsetRowsFind(userMapper::findByPaginationField, + new PaginationFieldParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationFieldWithParam0OffsetRows() { + offsetRowsFind(userMapper::findByPaginationFieldWithParam0, + new PaginationFieldParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationFieldWithParam1OffsetRows() { + offsetRowsFind(userMapper::findByPaginationFieldWithParam1, + new PaginationFieldParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPaginationFieldPageSizeLoop() { + pageSizeLoop(userMapper::findByPaginationField, + new PaginationFieldParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationFieldWithParam0PageSizeLoop() { + pageSizeLoop(userMapper::findByPaginationFieldWithParam0, + new PaginationFieldParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationFieldWithParam1PageSizeLoop() { + pageSizeLoop(userMapper::findByPaginationFieldWithParam1, + new PaginationFieldParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPaginationFieldOffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPaginationField, + new PaginationFieldParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationFieldWithParam0OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPaginationFieldWithParam0, + new PaginationFieldParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationFieldWithParam1OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPaginationFieldWithParam1, + new PaginationFieldParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + + public Page pageSizeFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getSize(), page.getList().size()) + : Objects.equals(param.getSize(), page.getSize())); + Assertions.assertEquals(page.getPage(), param.getPage()); + return page; + } + + public Page offsetRowsFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getRows(), page.getList().size()) + : Objects.equals(param.getRows(), page.getSize())); + Assertions.assertEquals((long) (page.getPage() - 1) * page.getSize(), param.getOffset()); + return page; + } + + public void pageSizeLoop(Function> function, T param) { + int i = 1; + while (true) { + param.setPage(i); + Page page = pageSizeFind(function, param); + if (!page.getNext()) { + break; + } + i++; + } + } + + public void offsetRowsLoop(Function> function, T param) { + long i = 0; + while (true) { + param.setOffset(i); + Page page = offsetRowsFind(function, param); + if (!page.getNext()) { + break; + } + i += param.getRows(); + } + } +} diff --git a/mypages-test/src/test/java/io/leego/mypages/test/specification/PaginationMethodTests.java b/mypages-test/src/test/java/io/leego/mypages/test/specification/PaginationMethodTests.java new file mode 100644 index 0000000..7e6d135 --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/specification/PaginationMethodTests.java @@ -0,0 +1,161 @@ +package io.leego.mypages.test.specification; + +import io.leego.mypages.test.dto.PaginationMethodParam; +import io.leego.mypages.test.entity.User; +import io.leego.mypages.test.enums.UserStatusEnum; +import io.leego.mypages.test.mapper.UserMapper; +import io.leego.mypages.util.Page; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +/** + * @author Yihleego + */ +@SpringBootTest +public class PaginationMethodTests { + private static final Logger logger = LoggerFactory.getLogger(PaginationMethodTests.class); + @Autowired + private UserMapper userMapper; + private List users; + + @BeforeEach + public void before() { + users = userMapper.findByStatus(UserStatusEnum.ENABLED.getCode()); + } + + + @Test + public void findByPaginationMethodPageSize() { + pageSizeFind(userMapper::findByPaginationMethod, + new PaginationMethodParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationMethodWithParam0PageSize() { + pageSizeFind(userMapper::findByPaginationMethodWithParam0, + new PaginationMethodParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationMethodWithParam1PageSize() { + pageSizeFind(userMapper::findByPaginationMethodWithParam1, + new PaginationMethodParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPaginationMethodOffsetRows() { + offsetRowsFind(userMapper::findByPaginationMethod, + new PaginationMethodParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationMethodWithParam0OffsetRows() { + offsetRowsFind(userMapper::findByPaginationMethodWithParam0, + new PaginationMethodParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationMethodWithParam1OffsetRows() { + offsetRowsFind(userMapper::findByPaginationMethodWithParam1, + new PaginationMethodParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPaginationMethodPageSizeLoop() { + pageSizeLoop(userMapper::findByPaginationMethod, + new PaginationMethodParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationMethodWithParam0PageSizeLoop() { + pageSizeLoop(userMapper::findByPaginationMethodWithParam0, + new PaginationMethodParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationMethodWithParam1PageSizeLoop() { + pageSizeLoop(userMapper::findByPaginationMethodWithParam1, + new PaginationMethodParam(1, 10, UserStatusEnum.ENABLED.getCode())); + } + + + @Test + public void findByPaginationMethodOffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPaginationMethod, + new PaginationMethodParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationMethodWithParam0OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPaginationMethodWithParam0, + new PaginationMethodParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + @Test + public void findByPaginationMethodWithParam1OffsetRowsLoop() { + offsetRowsLoop(userMapper::findByPaginationMethodWithParam1, + new PaginationMethodParam(0L, 10, UserStatusEnum.ENABLED.getCode())); + } + + + public Page pageSizeFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getSize(), page.getList().size()) + : Objects.equals(param.getSize(), page.getSize())); + Assertions.assertEquals(page.getPage(), param.getPage()); + return page; + } + + public Page offsetRowsFind(Function> function, T param) { + List list = function.apply(param); + Page page = Page.of(list); + logger.debug("{}", page); + Assertions.assertEquals(users.size(), page.getTotal()); + Assertions.assertTrue(page.isPaged() && !page.isEmpty()); + Assertions.assertTrue(page.getNext() + ? Objects.equals(param.getRows(), page.getList().size()) + : Objects.equals(param.getRows(), page.getSize())); + Assertions.assertEquals((long) (page.getPage() - 1) * page.getSize(), param.getOffset()); + return page; + } + + public void pageSizeLoop(Function> function, T param) { + int i = 1; + while (true) { + param.setPage(i); + Page page = pageSizeFind(function, param); + if (!page.getNext()) { + break; + } + i++; + } + } + + public void offsetRowsLoop(Function> function, T param) { + long i = 0; + while (true) { + param.setOffset(i); + Page page = offsetRowsFind(function, param); + if (!page.getNext()) { + break; + } + i += param.getRows(); + } + } +} diff --git a/mypages-test/src/test/java/io/leego/mypages/test/sql/SqlTests.java b/mypages-test/src/test/java/io/leego/mypages/test/sql/SqlTests.java new file mode 100644 index 0000000..de2975f --- /dev/null +++ b/mypages-test/src/test/java/io/leego/mypages/test/sql/SqlTests.java @@ -0,0 +1,296 @@ +package io.leego.mypages.test.sql; + +import io.leego.mypages.util.SqlUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Objects; + +/** + * @author Yihleego + */ +@SpringBootTest +public class SqlTests { + private static final Logger logger = LoggerFactory.getLogger(SqlTests.class); + + @Test + public void testSimple() { + String original = "select id, name"; + String expected = "select COUNT(*)"; + test(original, expected); + } + + @Test + public void testAsterisk() { + String original = "select * from foo"; + String expected = "select COUNT(*) from foo"; + test(original, expected); + } + + @Test + public void testColumnReference() { + String original = "select id, name from foo"; + String expected = "select COUNT(*) from foo"; + test(original, expected); + } + + @Test + public void testSemicolon() { + String original = "select id, name from foo;"; + String expected = "select COUNT(*) from foo;"; + test(original, expected); + } + + @Test + public void testWhitespace() { + String original = " select id, name from foo "; + String expected = " select COUNT(*) from foo "; + test(original, expected); + } + + @Test + public void testUpperCaseKeyword() { + String original = "SELECT id, name FROM foo"; + String expected = "SELECT COUNT(*) FROM foo"; + test(original, expected); + } + + @Test + public void testUpperCaseAll() { + String original = "SELECT ID, NAME FROM FOO"; + String expected = "SELECT COUNT(*) FROM FOO"; + test(original, expected); + } + + @Test + public void testWhere() { + String original = "select id, name from foo where id = 1 and name = 'name'"; + String expected = "select COUNT(*) from foo where id = 1 and name = 'name'"; + test(original, expected); + } + + @Test + public void testOrderBy() { + String original = "select id, name from foo where id = 1 and name = 'name' order by name"; + String expected = "select COUNT(*) from foo where id = 1 and name = 'name' "; + test(original, expected); + } + + @Test + public void testLimit1() { + String original = "select id, name from foo where id = 1 and name = 'name' limit 1, 1"; + String expected = "select COUNT(*) from foo where id = 1 and name = 'name' "; + test(original, expected); + } + + @Test + public void testLimit2() { + String original = "select id, name from foo where id = 1 and name = 'name' limit 1 offset 1"; + String expected = "select COUNT(*) from foo where id = 1 and name = 'name' "; + test(original, expected); + } + + @Test + public void testOrderByLimit1() { + String original = "select id, name from foo where id = 1 and name = 'name' order by name limit 1, 1"; + String expected = "select COUNT(*) from foo where id = 1 and name = 'name' "; + test(original, expected); + } + + @Test + public void testOrderByLimit2() { + String original = "select id, name from foo where id = 1 and name = 'name' order by name limit 1 offset 1"; + String expected = "select COUNT(*) from foo where id = 1 and name = 'name' "; + test(original, expected); + } + + @Test + public void testOrderByLimitKeepSorting() { + String original = "select id, name from foo where id = 1 and name = 'name' order by name limit 1 offset 1"; + String expected = "select COUNT(*) from foo where id = 1 and name = 'name' order by name "; + test(original, expected, true); + } + + @Test + public void testGroupBy() { + String original = "select name from foo where id = 1 and name = 'name' group by name"; + String expected = null; + test(original, expected); + } + + @Test + public void testWithAs() { + String original = "with temp as (select id, name from foo where name like 'name%')\n" + + "select id, name from temp where id = 1"; + String expected = "with temp as (select id, name from foo where name like 'name%')\n" + + "select COUNT(*) from temp where id = 1"; + test(original, expected); + } + + @Test + public void testMultipleWithAs() { + String original = "with temp1 as (SELECT * FROM foo),\n" + + "temp2 as (SELECT * FROM bar)\n" + + "select temp1.id, temp1.name, temp2.id, temp2.name from temp1, temp2"; + String expected = "with temp1 as (SELECT * FROM foo),\n" + + "temp2 as (SELECT * FROM bar)\n" + + "select COUNT(*) from temp1, temp2"; + test(original, expected); + } + + @Test + public void testInsert() { + String original = "insert into foo values(?, ?)"; + String expected = null; + test(original, expected); + } + + @Test + public void testUpdate() { + String original = "update foo set name = 'name' where id = 1"; + String expected = null; + test(original, expected); + } + + @Test + public void testDelete() { + String original = "delete from foo where id = 1"; + String expected = null; + test(original, expected); + } + + @Test + public void testExample() { + String original = "with u as (SELECT user.* FROM user),\n" + + " ue as (SELECT user_external.* FROM user_external),\n" + + " up as (SELECT user_profile.* FROM user_profile)\n" + + "select u.id as userId,\n" + + " u.username,\n" + + " ue.open_id as openId,\n" + + " up.gender,\n" + + " up.avatar\n" + + "from u\n" + + " join ue on ue.user_id = u.id\n" + + " join up on up.user_id = u.id\n" + + "where u.username = 'username'\n" + + "order by u.id\n" + + "limit 0,10"; + String expected = "with u as (SELECT user.* FROM user),\n" + + " ue as (SELECT user_external.* FROM user_external),\n" + + " up as (SELECT user_profile.* FROM user_profile)\n" + + "select COUNT(*)\n" + + "from u\n" + + " join ue on ue.user_id = u.id\n" + + " join up on up.user_id = u.id\n" + + "where u.username = 'username'\n"; + test(original, expected); + } + + @Test + public void testExampleGroupBy() { + String original = "with u as (SELECT user.* FROM user),\n" + + " ue as (SELECT user_external.* FROM user_external),\n" + + " up as (SELECT user_profile.* FROM user_profile)\n" + + "select u.id as userId,\n" + + " u.username,\n" + + " ue.open_id as openId,\n" + + " up.gender,\n" + + " up.avatar\n" + + "from u\n" + + " join ue on ue.user_id = u.id\n" + + " join up on up.user_id = u.id\n" + + "where u.username = 'username'\n" + + "group by u.id, u.username, ue.open_id, up.gender, up.avatar\n" + + "order by u.id\n" + + "limit 0,10"; + String expected = null; + test(original, expected); + } + + @Test + public void testSubQuery() { + String original = "select u.id as id, u.name\n" + + "from (select id, name from foo) u\n" + + "where u.name = 'name'\n"; + String expected = "select COUNT(*)\n" + + "from (select id, name from foo) u\n" + + "where u.name = 'name'\n"; + test(original, expected); + } + + @Test + public void testSubQueryOrderBy() { + String original = "select u.id as id, u.name\n" + + "from (select id, name from foo) u\n" + + "where u.name = 'name'\n" + + "order by u.id"; + String expected = "select COUNT(*)\n" + + "from (select id, name from foo) u\n" + + "where u.name = 'name'\n"; + test(original, expected); + } + + @Test + public void testSubQueryOrderByLimit() { + String original = "select u.id as id, u.name\n" + + "from (select id, name from foo) u\n" + + "where u.name = 'name'\n" + + "order by u.id\n" + + "limit 0, 10"; + String expected = "select COUNT(*)\n" + + "from (select id, name from foo) u\n" + + "where u.name = 'name'\n"; + test(original, expected); + } + + @Test + public void testSubQueryGroupByOrderByLimit() { + String original = "select u.id as id, u.name\n" + + "from (select id, name from foo) u\n" + + "where u.name = 'name'\n" + + "group by u.id, u.name\n" + + "order by u.id\n" + + "limit 0, 10"; + String expected = null; + test(original, expected); + } + + @Test + public void testFunctionCall() { + String original = "select max(id), avg(id), sum(id) from foo"; + String expected = null; + test(original, expected); + } + + @Test + public void testSubQueryExpression() { + String original = "(select id, name from foo where id = 1 and name = 'name')"; + String expected = "(select COUNT(*) from foo where id = 1 and name = 'name')"; + test(original, expected); + } + + private void test(String original, String expected) { + test(original, expected, false); + } + + private void test(String original, String expected, boolean keepSorting) { + String generated = SqlUtils.toCountSql(original, keepSorting); + String color = Objects.equals(expected, generated) ? "\033[32;40m" : "\033[31;40m"; + logger.info("\n\n" + + "==================== original sql ====================\n\033[40m{}\033[0m\n" + + "==================== expected sql ====================\n\033[40m{}\033[0m\n" + + "==================== generated sql ===================\n{}{}\033[0m\n" + + "======================================================\n", toNull(original), toNull(expected), color, toNull(generated)); + Assertions.assertEquals(expected, generated); + } + + private String toNull(String s) { + if (s == null) { + return ""; + } + return s; + } +} diff --git a/mypages/README.ZH_CN.md b/mypages/README.ZH_CN.md new file mode 100644 index 0000000..027a081 --- /dev/null +++ b/mypages/README.ZH_CN.md @@ -0,0 +1,787 @@ +# 1. 简介 + +MyPages是Java实现基于[MyBatis](https://github.com/mybatis/mybatis-3)的开源分页插件,最大程度简化数据库分页查询操作,支持市面上大部分数据库,如:MySQL、PostgreSQL、Oracle、SQLServer等。 + +# 2. 准备工作 + +请确保您的Java版本在1.8及以上。 + +# 3. Maven 依赖 + +```xml + + io.leego + mypages + ${mypages.version} + +``` + +# 4. 快速开始 + +假设存在基于`MySQL`的数据库和表: + +```sql +create database mypages; +use mypages; +create table user +( + id bigint primary key auto_increment, + username varchar(20), + password varchar(40), + nickname varchar(20), + status tinyint default 1 +); +``` + +假设存在如下定义的Mapper: + +```java +public interface UserMapper { + @Select("select * from user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} +``` + +## 4.1. Java + +```java +public void query() { + DataSource dataSource = dataSource(); + SqlSessionFactory sqlSessionFactory = sqlSessionFactory(dataSource); + try (SqlSession session = sqlSessionFactory.openSession(false)) { + UserMapper userMapper = session.getMapper(UserMapper.class); + List list = userMapper.query(1, 10); + Page page = Page.of(list); + } +} + +public DataSource dataSource() { + HikariConfig config = new HikariConfig(); + config.setDriverClassName("com.mysql.cj.jdbc.Driver"); + config.setJdbcUrl("jdbc:mysql://localhost:3306/mypages?serverTimezone=GMT%2B8"); + config.setUsername("root"); + config.setPassword("123456"); + return new HikariDataSource(config); +} + +public SqlSessionFactory sqlSessionFactory(DataSource dataSource) { + TransactionFactory transactionFactory = new JdbcTransactionFactory(); + Environment environment = new Environment(SqlSessionFactory.class.getSimpleName(), transactionFactory, dataSource); + Configuration configuration = new Configuration(environment); + configuration.setMapUnderscoreToCamelCase(true); + configuration.addMapper(UserMapper.class); + configuration.addInterceptor(paginationInterceptor(dataSource)); + return new SqlSessionFactoryBuilder().build(configuration); +} + +public PaginationInterceptor paginationInterceptor(DataSource dataSource) { + PaginationSettings settings = PaginationSettings.builder() + .database(Database.fromDataSource(dataSource)) + .pageField("page") + .sizeField("size") + .build(); + return new PaginationInterceptor(settings); +} +``` + +## 4.2. Spring + +```xml + + + + + + + + + + + + + + + + + + + + + +``` + +```java +@Service +public class UserService { + @Autowired + private UserMapper userMapper; + + public Page query(int page, int size) { + List list = userMapper.query(page, size); + return Page.of(list); + } +} +``` + +## 4.3. Spring Boot + +```java +@Configuration +public class MybatisConfiguration { + @Bean + public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { + Interceptor[] plugins = new Interceptor[]{paginationInterceptor(dataSource)}; + SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); + sqlSessionFactoryBean.setDataSource(dataSource); + sqlSessionFactoryBean.setPlugins(plugins); + return sqlSessionFactoryBean.getObject(); + } + + @Bean + public PaginationInterceptor paginationInterceptor(DataSource dataSource) { + PaginationSettings settings = PaginationSettings.builder() + .database(Database.fromDataSource(dataSource)) + .pageField("page") + .sizeField("size") + .build(); + return new PaginationInterceptor(settings); + } +} +``` + +```java +@Service +public class UserService { + @Autowired + private UserMapper userMapper; + + public Page query(int page, int size) { + List list = userMapper.query(page, size); + return Page.of(list); + } +} +``` + +## 4.4. Spring Boot Starter + +> * 请使用:[mypages-spring-boot-starter](../mypages-spring-boot-starter/README.ZH_CN.md) + +# 5. 启用分页 + +## 5.1. 注解 (推荐) + +使用 `@Pagination`、`@Page`、`@Size`、`@Offset`、`@Rows` 等注解. + +```java +@Pagination +public class QueryParam { + @Page + private Integer page; + @Size + private Integer size; + @Offset + private Integer offset; + @Rows + private Integer rows; + /* getter setter */ +} +``` + +更多注解: `@CountExpr`、`@CountMethodName`、`@DisableCount`、`@DisablePagination` + +## 5.2. PaginationInterceptor配置 (推荐) + +通过反射获取分页参数 + +```java +PaginationSettings settings = PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .build(); +PaginationInterceptor interceptor = new PaginationInterceptor(settings); +``` + +### 5.2.1. 定义类 + +假设存在如下定义的类和Mapper: + +```java +public class QueryParam { + private Integer page; + private Integer size; + + public QueryParam(Integer page, Integer size) { + this.page = page; + this.size = size; + } + /* getter setter */ +} +``` + +```java +public interface UserMapper { + @Select("SELECT * FROM user") + List query(QueryParam param); +} +``` + +### 5.2.2. MyBatis `@Param` + +假设存在如下定义的Mapper: + +```java +public interface UserMapper { + @Select("SELECT * FROM user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} +``` + +### 5.2.3. `Map` + +假设存在如下定义的Mapper: + +```java +public interface UserMapper { + @Select("SELECT * FROM user") + List query(Map map); +} +``` + +调用查询方法: + +```java +@Service +public class UserService { + @Autowired + private UserMapper userMapper; + + public Page query() { + Map map = new HashMap<>(); + map.put("size", 1); + map.put("page", 10); + return Page.of(userMapper.query(map)); + } +} +``` + +### 更多配置 + +```java +PaginationSettings settings = PaginationSettings.builder() + .database(Database.MYSQL) // 指定数据库类型,如:`MySQL`、`PostgreSQL`、`Oracle`等 + .countExpr("*") // 设置count表达式,默认值为`*` + .pageField("page") // 从参数字段中获取`page`值 + .sizeField("size") // 从参数字段中获取`size`值 + .offsetField("offset") // 从参数字段中获取`offset`值 + .rowsField("rows") // 从参数字段中获取`rows`值 + .countExprField("countExpr") // 从参数字段中获取count表达式 + .countMethodNameField("countMethodName") // 从参数字段中获取自定义count方法名称 + .enableCountField("enableCount") // 从参数字段中判断是否启用count + .skipQueryIfCountEqualsZero(true) // 是否跳过查询如果结果数量为`0` + .useGeneratedIfCountMethodIsMissing(true) // 是否使用自动生成的count方法如果指定count方法不存在 + .useGracefulCountSql(true) // 是否使用优雅的Count-SQL + .keepSorting(false) // 是否保留排序 + .defaultPage(1) // 如果`page`为空或小于`1`,则用`default-page`替换`page` + .defaultSize(10) // 如果`size`为空或小于`1`,则用`default-size`替换`size` + .maxPage(10000) // 如果`page`大于`max-page`,则用`max-page`替换`page` + .maxSize(10000) // 如果`size`大于`max-size`,则用`max-size`替换`size` + .build(); +``` + +## 5.3. 使用 `io.leego.mypages.util.Pageable`接口 + +定义一个实现 `io.leego.mypages.util.Pageable`接口的类. + +```java +public class QueryParam implements io.leego.mypages.util.Pageable { + private Integer page; + private Integer size; + private Integer offset; + private Integer rows; + + @Override + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + @Override + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + @Override + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + + @Override + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } +} +``` + +# 6. 使用优雅Count SQL + +详情请看:`io.leego.mypages.util.SqlUtils#toCountSql` + +## 6.1. 简单查询 + +输入: +```sql +select * from user where status = ? +``` +输出: +```sql +select count(*) from user where status = ? +``` + +## 6.2. 排序查询 + +输入: +```sql +select * from user where status = ? order by username desc +``` +输出: +```sql +select count(*) from user where status = ? +``` + +## 6.3. 保留排序 + +输入: +```sql +select * from user where status = ? order by username desc +``` +输出: +```sql +select count(*) from user where status = ? order by username desc +``` + +## 6.4. 聚合查询 + +输入: +```sql +select nickname from user where status = ? group by nickname +``` +输出: +```sql +select count(*) from (select nickname from user where status = ? group by nickname) mp_cta +``` + +## 6.5. With-As + +输入: +```sql +with temp as (select * from user where status = ?) +select * from temp +``` +输出: +```sql +with temp as (select * from user where status = ?) +select count(*) from temp +``` + +## 6.6. 子查询 + +输入: +```sql +select * +from (select * from user) u +where u.status = ? +``` +输出: +```sql +select count(*) +from (select * from user) u +where u.status = ? +``` + +# 7. 使用自定义Count方法 + +## 7.1. 注解 + +```java +@Pagination +public class QueryParam { + @Page + private Integer page; + @Size + private Integer size; + @CountMethodName + private String countMethodName; + + public QueryParam(Integer page, Integer size, String countMethodName) { + this.page = page; + this.size = size; + this.countMethodName = countMethodName; + } + /* getter setter */ +} +``` + +## 7.2. PaginationInterceptor配置 + +```java +public class QueryParam { + private Integer page; + private Integer size; + private String countMethodName; + + public QueryParam(Integer page, Integer size, String countMethodName) { + this.page = page; + this.size = size; + this.countMethodName = countMethodName; + } + /* getter setter */ +} +``` + +```java +PaginationSettings settings = PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .countMethodNameField("countMethodName") + .build(); +PaginationInterceptor interceptor = new PaginationInterceptor(settings); +``` + +## 7.3. 调用Query和Count方法 + +假设存在如下定义的Mapper: + +```java +public interface UserMapper { + @Select("SELECT * FROM user") + List query(QueryParam param); + + @Select("SELECT COUNT(*) FROM user") + long count(QueryParam param); +} +``` + +指定Count方法名称: + +```java +import io.leego.mypages.util.Page; + +@Service +public class UserService { + @Autowired + private UserMapper userMapper; + + public Page query() { + // Specifies the count method name. + return Page.of(userMapper.query(new QueryParam(1, 10, "count"))); + } +} +``` + +# 8. 参数合理化 + +如果分页参数无效,需要合理化参数,可以设置以下参数: + +**defaultPage**: 如果page为空或小于1,则用default-page替换page。 +**defaultSize**: 如果size为空或小于1,则用default-size替换size。 +**maxPage**: 如果page大于max-page,则用max-page替换page。 +**maxSize**: 如果size大于max-size,则用max-size替换size。 + +## 8.1. 注解配置 + +```java +@Pagination(defaultPage = 1, defaultSize = 10, maxPage = 10000, maxSize = 10000) +public class QueryParam { +} +``` + +## 8.2. PaginationInterceptor配置 + +```java +PaginationSettings settings = PaginationSettings.builder() + .database(Database.MYSQL) + .defaultPage(1) + .defaultSize(10) + .maxPage(10000) + .maxSize(10000) + .build(); +PaginationInterceptor interceptor = new PaginationInterceptor(settings); +``` + +# 9. 查询结果 + +## 9.1. 使用 `io.leego.mypages.util.Page` + +#### 9.1.1. 包装 + +```java +Page page = Page.of(mapper.query(param)); +``` + +#### 9.1.2. 转化 + +```java +Page page = Page.of(mapper.query(param), foo -> new Bar(foo)); +``` + +#### 9.1.3. 映射 + +```java +Page page = Page.of(mapper.query(param)).map(foo -> new Bar(foo)); +``` + +## 9.2. 使用 `io.leego.mypages.util.PaginationCollection` + +```java +List list = mapper.query(param); +PaginationCollection pc = (PaginationCollection) list; +long total = pc.getTotal(); +int page = pc.getPage(); +int size = pc.getSize(); +``` + +# 10. 分页编码规范 + +## 10.1. 使用`org.apache.ibatis.annotations.Param`注解 + +假设存在以下配置: + +```java +PaginationInterceptor interceptor = new PaginationInterceptor(PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .sizeField("size") + .offsetField("offset") + .build()); +``` + +```java +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByStatusWithPageSizeParam(@Param("page") Integer page, @Param("size") Integer size, @Param("status") Integer status); + + @Select("select * from user where status = #{status}") + List findByStatusOffsetRowsWithParam(@Param("offset") Long offset, @Param("rows") Integer rows, @Param("status") Integer status); +} +``` + +## 10.2. 使用`@Pagination`注解 + +### 10.2.1. Field注解 + +```java +@Pagination +public class PaginationFieldParam { + @Page + private Integer page; + @Size + private Integer size; + @Offset + private Long offset; + @Rows + private Integer rows; + private Integer status; +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByPaginationField(PaginationFieldParam param); + + @Select("select * from user where status = #{param.status}") + List findByPaginationFieldWithParam0(@Param("param") PaginationFieldParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPaginationFieldWithParam1(@Param("param1") PaginationFieldParam param); +} +``` + +### 10.2.2. Method注解 + +```java +@Pagination +public class PaginationMethodParam { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; + + @Page + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + @Size + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + @Offset + public Long getOffset() { + return offset; + } + + public void setOffset(Long offset) { + this.offset = offset; + } + + @Rows + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByPaginationMethod(PaginationMethodParam param); + + @Select("select * from user where status = #{param.status}") + List findByPaginationMethodWithParam0(@Param("param") PaginationMethodParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPaginationMethodWithParam1(@Param("param1") PaginationMethodParam param); +} +``` + +## 10.3. 使用`io.leego.mypages.util.Pageable`接口 + +```java +public class PageableParam implements Pageable { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByPageable(PageableParam param); + + @Select("select * from user where status = #{param.status}") + List findByPageableWithParam0(@Param("param") PageableParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPageableWithParam1(@Param("param1") PageableParam param); +} +``` + +## 10.4. 使用自定义类 + +假设存在以下配置: + +```java +PaginationInterceptor interceptor = new PaginationInterceptor(PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .sizeField("size") + .offsetField("offset") + .build()); +``` + +```java +public class CustomClassParam { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByCustomClass(CustomClassParam param); + + @Select("select * from user where status = #{param.status}") + List findByCustomClassWithParam0(@Param("param") CustomClassParam param); + + @Select("select * from user where status = #{param1.status}") + List findByCustomClassWithParam1(@Param("param1") CustomClassParam param); +} +``` + +## 10.5. 使用`Map`类 + +假设存在以下配置: + +```java +PaginationInterceptor interceptor = new PaginationInterceptor(PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .sizeField("size") + .offsetField("offset") + .build()); +``` + +## 10.5.1. 使用`java.util.Map`类 + +```java +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByCollectionMap(Map param); + + @Select("select * from user where status = #{map.status}") + List findByCollectionMapWithParam0(@Param("map") Map map); + + @Select("select * from user where status = #{param1.status}") + List findByCollectionMapWithParam1(@Param("param1") Map map); +} +``` + +## 10.5.2. 使用自定义`Map`类 + +```java +public class CustomMapParam extends HashMap { +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByCustomMap(CustomMapParam param); + + @Select("select * from user where status = #{param.status}") + List findByCustomMapWithParam0(@Param("param") CustomMapParam param); + + @Select("select * from user where status = #{param1.status}") + List findByCustomMapWithParam1(@Param("param1") CustomMapParam param); +} +``` \ No newline at end of file diff --git a/mypages/README.md b/mypages/README.md new file mode 100644 index 0000000..a76388e --- /dev/null +++ b/mypages/README.md @@ -0,0 +1,787 @@ +# 1. Introduction + +MyPages is a java based, open source pagination plugin for [MyBatis](https://github.com/mybatis/mybatis-3) that simplifies database paging queries. + +# 2. Getting Started + +Please make sure the Java version is 1.8 or above. + +# 3. Maven Dependency + +```xml + + io.leego + mypages + ${mypages.version} + +``` + +# 4. Quick Start + +Assume there are schema and table based on `MySQL`: + +```sql +create database mypages; +use mypages; +create table user +( + id bigint primary key auto_increment, + username varchar(20), + password varchar(40), + nickname varchar(20), + status tinyint default 1 +); +``` + +Assume there is a mapper defined like the following: + +```java +public interface UserMapper { + @Select("select * from user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} +``` + +## 4.1. Java + +```java +public void query() { + DataSource dataSource = dataSource(); + SqlSessionFactory sqlSessionFactory = sqlSessionFactory(dataSource); + try (SqlSession session = sqlSessionFactory.openSession(false)) { + UserMapper userMapper = session.getMapper(UserMapper.class); + List list = userMapper.query(1, 10); + Page page = Page.of(list); + } +} + +public DataSource dataSource() { + HikariConfig config = new HikariConfig(); + config.setDriverClassName("com.mysql.cj.jdbc.Driver"); + config.setJdbcUrl("jdbc:mysql://localhost:3306/mypages?serverTimezone=GMT%2B8"); + config.setUsername("root"); + config.setPassword("123456"); + return new HikariDataSource(config); +} + +public SqlSessionFactory sqlSessionFactory(DataSource dataSource) { + TransactionFactory transactionFactory = new JdbcTransactionFactory(); + Environment environment = new Environment(SqlSessionFactory.class.getSimpleName(), transactionFactory, dataSource); + Configuration configuration = new Configuration(environment); + configuration.setMapUnderscoreToCamelCase(true); + configuration.addMapper(UserMapper.class); + configuration.addInterceptor(paginationInterceptor(dataSource)); + return new SqlSessionFactoryBuilder().build(configuration); +} + +public PaginationInterceptor paginationInterceptor(DataSource dataSource) { + PaginationSettings settings = PaginationSettings.builder() + .database(Database.fromDataSource(dataSource)) + .pageField("page") + .sizeField("size") + .build(); + return new PaginationInterceptor(settings); +} +``` + +## 4.2. Spring + +```xml + + + + + + + + + + + + + + + + + + + + + +``` + +```java +@Service +public class UserService { + @Autowired + private UserMapper userMapper; + + public Page query(int page, int size) { + List list = userMapper.query(page, size); + return Page.of(list); + } +} +``` + +## 4.3. Spring Boot + +```java +@Configuration +public class MybatisConfiguration { + @Bean + public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { + Interceptor[] plugins = new Interceptor[]{paginationInterceptor(dataSource)}; + SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); + sqlSessionFactoryBean.setDataSource(dataSource); + sqlSessionFactoryBean.setPlugins(plugins); + return sqlSessionFactoryBean.getObject(); + } + + @Bean + public PaginationInterceptor paginationInterceptor(DataSource dataSource) { + PaginationSettings settings = PaginationSettings.builder() + .database(Database.fromDataSource(dataSource)) + .pageField("page") + .sizeField("size") + .build(); + return new PaginationInterceptor(settings); + } +} +``` + +```java +@Service +public class UserService { + @Autowired + private UserMapper userMapper; + + public Page query(int page, int size) { + List list = userMapper.query(page, size); + return Page.of(list); + } +} +``` + +## 4.4. Spring Boot Starter + +> * Please see: [mypages-spring-boot-starter](../mypages-spring-boot-starter/README.md) + +# 5. Enable Pagination + +## 5.1. Annotations (Recommended) + +Using `@Pagination`, `@Page`, `@Size`, `@Offset`, `@Rows` + +```java +@Pagination +public class QueryParam { + @Page + private Integer page; + @Size + private Integer size; + @Offset + private Integer offset; + @Rows + private Integer rows; + /* getter setter */ +} +``` + +More annotations: `@CountExpr`, `@CountMethodName`, `@DisableCount`, `@DisablePagination` + +## 5.2. PaginationSettings (Recommended) + +Obtaining paging parameters by reflection. + +```java +PaginationSettings settings = PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .build(); +PaginationInterceptor interceptor = new PaginationInterceptor(settings); +``` + +### 5.2.1. Custom class + +Assume there are classes defined like the following: + +```java +public class QueryParam { + private Integer page; + private Integer size; + + public QueryParam(Integer page, Integer size) { + this.page = page; + this.size = size; + } + /* getter setter */ +} +``` + +```java +public interface UserMapper { + @Select("SELECT * FROM user") + List query(QueryParam param); +} +``` + +### 5.2.2. MyBatis `@Param` + +Assume there is a mapper defined like the following: + +```java +public interface UserMapper { + @Select("SELECT * FROM user") + List query(@Param("page") Integer page, @Param("size") Integer size); +} +``` + +### 5.2.3. `Map` + +Assume there is a mapper defined like the following: + +```java +public interface UserMapper { + @Select("SELECT * FROM user") + List query(Map map); +} +``` + +Call the query method: + +```java +@Service +public class UserService { + @Autowired + private UserMapper userMapper; + + public Page query() { + Map map = new HashMap<>(); + map.put("size", 1); + map.put("page", 10); + return Page.of(userMapper.query(map)); + } +} +``` + +### Configurations + +```java +PaginationSettings settings = PaginationSettings.builder() + .database(Database.MYSQL) // The database type such as `MySQL`, `PostgreSQL`, `Oracle` + .countExpr("*") // The column name or expression + .pageField("page") // The `page` field name of the parameter + .sizeField("size") // The `size` field name of the parameter + .offsetField("offset") // The `offset` field name of the parameter + .rowsField("rows") // The `rows` field name of the parameter + .countExprField("countExpr") // The count expression field name of the parameter + .countMethodNameField("countMethodName") // The `count-method-name` field name of the parameter + .enableCountField("enableCount") // The `enable-count` field name of the parameter + .skipQueryIfCountEqualsZero(true) // Whether to skip query if total value equals zero + .useGeneratedIfCountMethodIsMissing(true) // Whether to use generated if the specified count method is missing + .useGracefulCountSql(true) // Whether to use graceful count-sql + .keepSorting(false) // Whether to keep sorting + .defaultPage(1) // Replaces the `page` with `default-page` if the `page` is `null` or less than `1` + .defaultSize(10) // Replaces the `size` with `default-size` if the `size` is `null` or less than `1` + .maxPage(10000) // Replaces the `page` with `max-page` if the `page` is greater than `max-page` + .maxSize(10000) // Replaces the `size` with `max-size` if the `size` is greater than `max-size` + .build(); +``` + +## 5.3. Implements `io.leego.mypages.util.Pageable` + +Define a class implements `io.leego.mypages.util.Pageable`. + +```java +public class QueryParam implements io.leego.mypages.util.Pageable { + private Integer page; + private Integer size; + private Integer offset; + private Integer rows; + + @Override + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + @Override + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + @Override + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + + @Override + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } +} +``` + +# 6. Using Graceful Count SQL + +Please see:`io.leego.mypages.util.SqlUtils#toCountSql` + +## 6.1. Simple + +Input: +```sql +select * from user where status = ? +``` +Output: +```sql +select count(*) from user where status = ? +``` + +## 6.2. Sorting + +Input: +```sql +select * from user where status = ? order by username desc +``` +Output: +```sql +select count(*) from user where status = ? +``` + +## 6.3. Keep Soring + +Input: +```sql +select * from user where status = ? order by username desc +``` +Output: +```sql +select count(*) from user where status = ? order by username desc +``` + +## 6.4. Aggregation + +Input: +```sql +select nickname from user where status = ? group by nickname +``` +Output: +```sql +select count(*) from (select nickname from user where status = ? group by nickname) mp_cta +``` + +## 6.5. With-As + +Input: +```sql +with temp as (select * from user where status = ?) +select * from temp +``` +Output: +```sql +with temp as (select * from user where status = ?) +select count(*) from temp +``` + +## 6.6. Sub-Query + +Input: +```sql +select * +from (select * from user) u +where u.status = ? +``` +Output: +```sql +select count(*) +from (select * from user) u +where u.status = ? +``` + +# 7. Using custom count methods + +## 7.1. Annotations + +```java +@Pagination +public class QueryParam { + @Page + private Integer page; + @Size + private Integer size; + @CountMethodName + private String countMethodName; + + public QueryParam(Integer page, Integer size, String countMethodName) { + this.page = page; + this.size = size; + this.countMethodName = countMethodName; + } + /* getter setter */ +} +``` + +## 7.2. Configurations + +```java +public class QueryParam { + private Integer page; + private Integer size; + private String countMethodName; + + public QueryParam(Integer page, Integer size, String countMethodName) { + this.page = page; + this.size = size; + this.countMethodName = countMethodName; + } + /* getter setter */ +} +``` + +```java +PaginationSettings settings = PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .countMethodNameField("countMethodName") + .build(); +PaginationInterceptor interceptor = new PaginationInterceptor(settings); +``` + +## 7.3. Call `Query` and `Count` Methods + +Assume there is a mapper defined like the following: + +```java +public interface UserMapper { + @Select("SELECT * FROM user") + List query(QueryParam param); + + @Select("SELECT COUNT(*) FROM user") + long count(QueryParam param); +} +``` + +Specify the count method name: + +```java +import io.leego.mypages.util.Page; + +@Service +public class UserService { + @Autowired + private UserMapper userMapper; + + public Page query() { + // Specifies the count method name. + return Page.of(userMapper.query(new QueryParam(1, 10, "count"))); + } +} +``` + +# 8. Parameters rationalization + +Rationalize the parameters if the values are invalid, the following parameters can be set: + +**defaultPage**: Replaces the page with default-page if the page is null or less than 1. +**defaultSize**: Replaces the size with default-size if the size is null or less than 1. +**maxPage**: Replaces the page with max-page if the page is greater than max-page. +**maxSize**: Replaces the size with max-size if the size is greater than max-size. + +## 8.1. Annotations + +```java +@Pagination(defaultPage = 1, defaultSize = 10, maxPage = 10000, maxSize = 10000) +public class QueryParam { +} +``` + +## 8.2. Configurations + +```java +PaginationSettings settings = PaginationSettings.builder() + .database(Database.MYSQL) + .defaultPage(1) + .defaultSize(10) + .maxPage(10000) + .maxSize(10000) + .build(); +PaginationInterceptor interceptor = new PaginationInterceptor(settings); +``` + +# 9. Query Results + +## 9.1. Using `io.leego.mypages.util.Page` + +#### 9.1.1. Wrap + +```java +Page page = Page.of(mapper.query(param)); +``` + +#### 9.1.2. Convert + +```java +Page page = Page.of(mapper.query(param), foo -> new Bar(foo)); +``` + +#### 9.1.3. Map + +```java +Page page = Page.of(mapper.query(param)).map(foo -> new Bar(foo)); +``` + +## 9.2. Using `io.leego.mypages.util.PaginationCollection` + +```java +List list = mapper.query(param); +PaginationCollection pc = (PaginationCollection) list; +long total = pc.getTotal(); +int page = pc.getPage(); +int size = pc.getSize(); +``` + +# 10. Coding Specification + +## 10.1. Using `org.apache.ibatis.annotations.Param` + +Assume there are configurations defined like the following: + +```java +PaginationInterceptor interceptor = new PaginationInterceptor(PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .sizeField("size") + .offsetField("offset") + .build()); +``` + +```java +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByStatusWithPageSizeParam(@Param("page") Integer page, @Param("size") Integer size, @Param("status") Integer status); + + @Select("select * from user where status = #{status}") + List findByStatusOffsetRowsWithParam(@Param("offset") Long offset, @Param("rows") Integer rows, @Param("status") Integer status); +} +``` + +## 10.2. Using `@Pagination` + +### 10.2.1. Field declaration + +```java +@Pagination +public class PaginationFieldParam { + @Page + private Integer page; + @Size + private Integer size; + @Offset + private Long offset; + @Rows + private Integer rows; + private Integer status; +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByPaginationField(PaginationFieldParam param); + + @Select("select * from user where status = #{param.status}") + List findByPaginationFieldWithParam0(@Param("param") PaginationFieldParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPaginationFieldWithParam1(@Param("param1") PaginationFieldParam param); +} +``` + +### 10.2.2. Method declaration + +```java +@Pagination +public class PaginationMethodParam { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; + + @Page + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + @Size + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + @Offset + public Long getOffset() { + return offset; + } + + public void setOffset(Long offset) { + this.offset = offset; + } + + @Rows + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByPaginationMethod(PaginationMethodParam param); + + @Select("select * from user where status = #{param.status}") + List findByPaginationMethodWithParam0(@Param("param") PaginationMethodParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPaginationMethodWithParam1(@Param("param1") PaginationMethodParam param); +} +``` + +## 10.3. Using `io.leego.mypages.util.Pageable` + +```java +public class PageableParam implements Pageable { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByPageable(PageableParam param); + + @Select("select * from user where status = #{param.status}") + List findByPageableWithParam0(@Param("param") PageableParam param); + + @Select("select * from user where status = #{param1.status}") + List findByPageableWithParam1(@Param("param1") PageableParam param); +} +``` + +## 10.4. Using Custom Class + +Assume there are configurations defined like the following: + +```java +PaginationInterceptor interceptor = new PaginationInterceptor(PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .sizeField("size") + .offsetField("offset") + .build()); +``` + +```java +public class CustomClassParam { + private Integer page; + private Integer size; + private Long offset; + private Integer rows; + private Integer status; +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByCustomClass(CustomClassParam param); + + @Select("select * from user where status = #{param.status}") + List findByCustomClassWithParam0(@Param("param") CustomClassParam param); + + @Select("select * from user where status = #{param1.status}") + List findByCustomClassWithParam1(@Param("param1") CustomClassParam param); +} +``` + +## 10.5. Using `Map` + +Assume there are configurations defined like the following: + +```java +PaginationInterceptor interceptor = new PaginationInterceptor(PaginationSettings.builder() + .database(Database.MYSQL) + .pageField("page") + .sizeField("size") + .sizeField("size") + .offsetField("offset") + .build()); +``` + +## 10.5.1. Using `java.util.Map` + +```java +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByCollectionMap(Map param); + + @Select("select * from user where status = #{map.status}") + List findByCollectionMapWithParam0(@Param("map") Map map); + + @Select("select * from user where status = #{param1.status}") + List findByCollectionMapWithParam1(@Param("param1") Map map); +} +``` + +## 10.5.2. Using Custom `Map` + +```java +public class CustomMapParam extends HashMap { +} + +public interface UserMapper { + @Select("select * from user where status = #{status}") + List findByCustomMap(CustomMapParam param); + + @Select("select * from user where status = #{param.status}") + List findByCustomMapWithParam0(@Param("param") CustomMapParam param); + + @Select("select * from user where status = #{param1.status}") + List findByCustomMapWithParam1(@Param("param1") CustomMapParam param); +} +``` \ No newline at end of file diff --git a/mypages/pom.xml b/mypages/pom.xml index 75f3260..dcda044 100644 --- a/mypages/pom.xml +++ b/mypages/pom.xml @@ -9,7 +9,7 @@ io.leego mypages-parent - 1.1.2 + 2.0.0 mypages @@ -24,8 +24,8 @@ true - com.alibaba - druid + org.antlr + antlr4 diff --git a/mypages/src/main/java/io/leego/mypages/dialect/AbstractDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/AbstractDialect.java index 57a8f21..db02e48 100644 --- a/mypages/src/main/java/io/leego/mypages/dialect/AbstractDialect.java +++ b/mypages/src/main/java/io/leego/mypages/dialect/AbstractDialect.java @@ -1,14 +1,15 @@ package io.leego.mypages.dialect; -import io.leego.mypages.util.BeanUtils; -import io.leego.mypages.util.PaginationParam; -import io.leego.mypages.util.ReflectUtils; +import io.leego.mypages.util.PaginationParameter; import io.leego.mypages.util.SqlUtils; import org.apache.ibatis.cache.CacheKey; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ParameterMapping; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -18,88 +19,133 @@ * @author Yihleego */ public abstract class AbstractDialect implements Dialect { - protected static final String TEMP_TABLE_ALIAS = "MP_TTA"; - protected static final String PAGING_TABLE_ALIAS = "MP_PTA"; - protected static final String COUNTING_TABLE_ALIAS = "MP_CTA"; - protected static final String ROW_NUMBER_ALIAS = "MP_IGNORED_RN"; - protected static final String PAGINATION_PARAM = "MP_PAGINATION_PARAM"; + protected static final String ASTERISK = "*"; + protected static final String TEMP_TABLE_ALIAS = "mp_tta"; + protected static final String PAGING_TABLE_ALIAS = "mp_pta"; + protected static final String COUNTING_TABLE_ALIAS = "mp_cta"; + protected static final String ROW_NUMBER_ALIAS = "mp_trn"; + protected static final String PAGINATION_PARAMETER = "mp_pagination_parameter"; protected static final String PARAMETER_MAPPINGS = "parameterMappings"; - protected SqlDialect sqlDialect; public AbstractDialect() { } - public AbstractDialect(SqlDialect sqlDialect) { - this.sqlDialect = sqlDialect; - } - @Override - public String getPagingSql(String sql, PaginationParam param) { - return getPagingSql(sql); + public String getPageSql(String sql, PaginationParameter paginationParameter) { + return getPageSql(sql); } @Override public String getCountSql(String sql) { - return SqlUtils.toCountSql(sql, COUNTING_TABLE_ALIAS, sqlDialect); + return getCountSql(sql, ASTERISK, false); } @Override public String getCountSql(String sql, String expr) { - return SqlUtils.toCountSql(sql, expr, COUNTING_TABLE_ALIAS, sqlDialect); + return getCountSql(sql, expr, false); + } + + @Override + public String getCountSql(String sql, String expr, boolean keepSorting) { + try { + String value = SqlUtils.toCountSql(sql, expr); + if (value != null) { + return value; + } + } catch (Exception ignored) { + } + return getSimpleCountSql(sql, expr); + } + + @Override + public String getSimpleCountSql(String sql) { + return String.format("SELECT COUNT(*) FROM (%s) %s", sql, COUNTING_TABLE_ALIAS); } @Override - public Object assembleParameter(MappedStatement ms, Object parameter, BoundSql boundSql, CacheKey pageKey, PaginationParam param) throws Exception { - Object[] params = getPagingParams(param); - if (params == null || params.length == 0) { + public String getSimpleCountSql(String sql, String expr) { + if (expr == null || expr.isEmpty()) { + return getSimpleCountSql(sql); + } + return String.format("SELECT COUNT(%S) FROM (%s) %s", expr, sql, COUNTING_TABLE_ALIAS); + } + + @Override + public Object handleParameter(MappedStatement ms, Object parameter, BoundSql boundSql, CacheKey cacheKey, PaginationParameter paginationParameter) throws Exception { + Object[] prependedValues = prependParameterValues(paginationParameter); + Object[] appendedValues = appendParameterValues(paginationParameter); + int prependedLength = prependedValues == null ? 0 : prependedValues.length; + int appendedLength = appendedValues == null ? 0 : appendedValues.length; + if (prependedLength == 0 && appendedLength == 0) { return parameter; } - Map paramMap; + Map parameterMap; if (parameter == null) { - paramMap = new HashMap<>(); + parameterMap = new HashMap<>(); } else if (parameter instanceof Map) { // Prevent unmodifiable map object from throwing exceptions. - paramMap = new HashMap<>((Map) parameter); + parameterMap = new HashMap<>((Map) parameter); } else { - boolean hasTypeHandler = ms.getConfiguration().getTypeHandlerRegistry().hasTypeHandler(parameter.getClass()); - paramMap = hasTypeHandler ? new HashMap<>() : BeanUtils.readAll(parameter, HashMap::new, k -> k, v -> v); + PropertyDescriptor[] descriptors = Introspector.getBeanInfo(parameter.getClass()).getPropertyDescriptors(); + parameterMap = new HashMap<>(prependedLength + appendedLength + descriptors.length); + for (PropertyDescriptor descriptor : descriptors) { + if (!"class".equals(descriptor.getName())) { + parameterMap.put(descriptor.getName(), descriptor.getReadMethod().invoke(parameter)); + } + } } List parameterMappings; - if (boundSql.getParameterMappings() == null) { - parameterMappings = new ArrayList<>(); - } else if (boundSql.getParameterMappings().getClass() == ArrayList.class) { - parameterMappings = boundSql.getParameterMappings(); + if (boundSql.getParameterMappings() == null || boundSql.getParameterMappings().isEmpty()) { + parameterMappings = new ArrayList<>(prependedLength + appendedLength); } else { // Prevent unmodifiable list object from throwing exceptions. parameterMappings = new ArrayList<>(boundSql.getParameterMappings()); } - // Append paging parameters. int suffix = 0; - for (Object value : params) { - String property = PAGINATION_PARAM + (suffix++); - // Prevent replacing original value. - while (paramMap.containsKey(property)) { - property = PAGINATION_PARAM + (suffix++); + // Prepend parameters. + if (prependedValues != null) { + for (int i = 0; i < prependedValues.length; i++) { + Object value = prependedValues[i]; + // Prevent replacing original value. + String property = PAGINATION_PARAMETER + (suffix++); + while (parameterMap.containsKey(property)) { + property = PAGINATION_PARAMETER + (suffix++); + } + parameterMap.put(property, value); + cacheKey.update(value); + ParameterMapping parameterMapping = new ParameterMapping.Builder(ms.getConfiguration(), property, value.getClass()).build(); + parameterMappings.add(i, parameterMapping); + } + } + // Append parameters. + if (appendedValues != null) { + for (int i = 0; i < appendedValues.length; i++) { + Object value = appendedValues[i]; + // Prevent replacing original value. + String property = PAGINATION_PARAMETER + (suffix++); + while (parameterMap.containsKey(property)) { + property = PAGINATION_PARAMETER + (suffix++); + } + parameterMap.put(property, value); + cacheKey.update(value); + ParameterMapping parameterMapping = new ParameterMapping.Builder(ms.getConfiguration(), property, value.getClass()).build(); + parameterMappings.add(parameterMapping); } - paramMap.put(property, value); - pageKey.update(value); - parameterMappings.add(new ParameterMapping.Builder(ms.getConfiguration(), property, value.getClass()).build()); } if (parameterMappings != boundSql.getParameterMappings()) { // Overwrite the value of the parameterMappings. - ReflectUtils.setFieldValue(boundSql, PARAMETER_MAPPINGS, parameterMappings, true); + Field field = BoundSql.class.getDeclaredField(PARAMETER_MAPPINGS); + field.setAccessible(true); + field.set(boundSql, parameterMappings); } - return paramMap; + return parameterMap; } - public abstract Object[] getPagingParams(PaginationParam param); - - public SqlDialect getSqlDialect() { - return sqlDialect; + public Object[] appendParameterValues(PaginationParameter paginationParameter) { + return null; } - protected void setSqlDialect(SqlDialect sqlDialect) { - this.sqlDialect = sqlDialect; + public Object[] prependParameterValues(PaginationParameter paginationParameter) { + return null; } - } diff --git a/mypages/src/main/java/io/leego/mypages/dialect/DB2Dialect.java b/mypages/src/main/java/io/leego/mypages/dialect/DB2Dialect.java index b9c378b..0f200cf 100644 --- a/mypages/src/main/java/io/leego/mypages/dialect/DB2Dialect.java +++ b/mypages/src/main/java/io/leego/mypages/dialect/DB2Dialect.java @@ -1,6 +1,6 @@ package io.leego.mypages.dialect; -import io.leego.mypages.util.PaginationParam; +import io.leego.mypages.util.PaginationParameter; /** * @author Yihleego @@ -8,14 +8,14 @@ public class DB2Dialect extends AbstractDialect { @Override - public String getPagingSql(String sql) { + public String getPageSql(String sql) { return "SELECT *" + " FROM (SELECT " + TEMP_TABLE_ALIAS + ".*, ROW_NUMBER() OVER() AS " + ROW_NUMBER_ALIAS + " FROM (" + sql + ") " + TEMP_TABLE_ALIAS + ") " + PAGING_TABLE_ALIAS + " WHERE " + ROW_NUMBER_ALIAS + " BETWEEN ? AND ?"; } @Override - public Object[] getPagingParams(PaginationParam param) { + public Object[] appendParameterValues(PaginationParameter param) { return new Object[]{ param.getOffset() + 1, param.getOffset() + param.getRows()}; diff --git a/mypages/src/main/java/io/leego/mypages/dialect/Database.java b/mypages/src/main/java/io/leego/mypages/dialect/Database.java new file mode 100644 index 0000000..42233e1 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/Database.java @@ -0,0 +1,107 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.exception.DialectException; + +import javax.sql.DataSource; +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * @author Yihleego + */ +public enum Database { + DB2("DB2", DB2Dialect.class), + DERBY("Apache Derby", DerbyDialect.class), + // TODO FIREBIRD("Firebird", FirebirdDialect.class), + H2("H2", H2Dialect.class), + // TODO HANA("SAP HANA Database", HANADialect.class), + HIVE("Apache Hive", HiveDialect.class), + HSQLDB("HSQL Database Engine", HSQLDBDialect.class), + INFORMIX("Informix Dynamic Server", InformixDialect.class), + // TODO JTDS("JTDS", JTDSDialect.class), + MARIADB("MariaDB", MariaDBDialect.class), + MYSQL("MySQL", MySQLDialect.class), + ORACLE("Oracle", OracleDialect.class), + PHOENIX("Apache Phoenix", PhoenixDialect.class), + POSTGRESQL("PostgreSQL", PostgreSQLDialect.class), + // TODO REDSHIFT("Redshift", RedshiftDialect.class), + SQLITE("SQLite", SQLiteDialect.class), + SQLSERVER("Microsoft SQL Server", SQLServerDialect.class), + // TODO TERADATA("Teradata", TeradataDialect.class), + TIDB("TiDB", TiDBDialect.class), + ; + + private final String name; + private final Class dialectClass; + + Database(String name, Class dialectClass) { + this.name = name; + this.dialectClass = dialectClass; + } + + public String getName() { + return name; + } + + public Class getDialectClass() { + return dialectClass; + } + + public Dialect newDialect() { + try { + // Use the constructor represented by the Constructor object to initialize a new instance + return dialectClass.getConstructor().newInstance(); + } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { + throw new DialectException("Unsupported database type '" + this.getName() + "'", e); + } + } + + private static final Map map; + + static { + Map store = new HashMap<>(32); + for (Database e : values()) { + String enumName = e.name().toLowerCase(Locale.ENGLISH); + String databaseName = e.getName().toLowerCase(Locale.ENGLISH); + store.put(enumName, e); + if (!enumName.equals(databaseName)) { + store.putIfAbsent(enumName, e); + } + } + map = Collections.unmodifiableMap(store); + } + + public static Database fromName(String name) { + if (name == null) { + return null; + } + return map.get(name.toLowerCase(Locale.ENGLISH)); + } + + public static Database fromJdbcUrl(String url) { + if (url == null || !url.startsWith("jdbc:")) { + return null; + } + int begin = "jdbc:".length(); + int end = url.indexOf(':', begin); + if (end < 0) { + return null; + } + return fromName(url.substring(begin, end)); + } + + public static Database fromDataSource(DataSource dataSource) { + if (dataSource == null) { + return null; + } + try { + return Database.fromJdbcUrl(dataSource.getConnection().getMetaData().getURL()); + } catch (SQLException ignored) { + return null; + } + } +} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/DerbyDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/DerbyDialect.java index 97079d9..7ff7f54 100644 --- a/mypages/src/main/java/io/leego/mypages/dialect/DerbyDialect.java +++ b/mypages/src/main/java/io/leego/mypages/dialect/DerbyDialect.java @@ -1,6 +1,6 @@ package io.leego.mypages.dialect; -import io.leego.mypages.util.PaginationParam; +import io.leego.mypages.util.PaginationParameter; /** * @author Yihleego @@ -8,12 +8,12 @@ public class DerbyDialect extends AbstractDialect { @Override - public String getPagingSql(String sql) { + public String getPageSql(String sql) { return sql + " OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; } @Override - public Object[] getPagingParams(PaginationParam param) { + public Object[] appendParameterValues(PaginationParameter param) { return new Object[]{ param.getOffset(), param.getRows()}; diff --git a/mypages/src/main/java/io/leego/mypages/dialect/Dialect.java b/mypages/src/main/java/io/leego/mypages/dialect/Dialect.java index d3c4db5..560a33a 100644 --- a/mypages/src/main/java/io/leego/mypages/dialect/Dialect.java +++ b/mypages/src/main/java/io/leego/mypages/dialect/Dialect.java @@ -1,6 +1,6 @@ package io.leego.mypages.dialect; -import io.leego.mypages.util.PaginationParam; +import io.leego.mypages.util.PaginationParameter; import org.apache.ibatis.cache.CacheKey; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; @@ -10,13 +10,20 @@ */ public interface Dialect { - String getPagingSql(String sql); + String getPageSql(String sql); - String getPagingSql(String sql, PaginationParam param); + String getPageSql(String sql, PaginationParameter paginationParameter); String getCountSql(String sql); String getCountSql(String sql, String expr); - Object assembleParameter(MappedStatement ms, Object parameter, BoundSql boundSql, CacheKey pageKey, PaginationParam param) throws Exception; + String getCountSql(String sql, String expr, boolean keepSorting); + + String getSimpleCountSql(String sql); + + String getSimpleCountSql(String sql, String expr); + + Object handleParameter(MappedStatement ms, Object parameter, BoundSql boundSql, CacheKey cacheKey, PaginationParameter paginationParameter) throws Exception; + } diff --git a/mypages/src/main/java/io/leego/mypages/dialect/H2Dialect.java b/mypages/src/main/java/io/leego/mypages/dialect/H2Dialect.java new file mode 100644 index 0000000..eaab471 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/H2Dialect.java @@ -0,0 +1,22 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.util.PaginationParameter; + +/** + * @author Yihleego + */ +public class H2Dialect extends AbstractDialect { + + @Override + public String getPageSql(String sql) { + return sql + " LIMIT ? OFFSET ?"; + } + + @Override + public Object[] appendParameterValues(PaginationParameter param) { + return new Object[]{ + param.getRows(), + param.getOffset()}; + } + +} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/HSQLDBDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/HSQLDBDialect.java new file mode 100644 index 0000000..f6f378e --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/HSQLDBDialect.java @@ -0,0 +1,22 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.util.PaginationParameter; + +/** + * @author Yihleego + */ +public class HSQLDBDialect extends AbstractDialect { + + @Override + public String getPageSql(String sql) { + return sql + " LIMIT ? OFFSET ?"; + } + + @Override + public Object[] appendParameterValues(PaginationParameter param) { + return new Object[]{ + param.getRows(), + param.getOffset()}; + } + +} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/HiveDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/HiveDialect.java new file mode 100644 index 0000000..c9a9532 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/HiveDialect.java @@ -0,0 +1,24 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.util.PaginationParameter; + +/** + * @author Yihleego + */ +public class HiveDialect extends AbstractDialect { + + @Override + public String getPageSql(String sql) { + return "SELECT *" + + " FROM (SELECT " + TEMP_TABLE_ALIAS + ".*, ROW_NUMBER() OVER() AS " + ROW_NUMBER_ALIAS + " FROM (" + sql + ") " + TEMP_TABLE_ALIAS + ") " + PAGING_TABLE_ALIAS + + " WHERE " + ROW_NUMBER_ALIAS + " BETWEEN ? AND ?"; + } + + @Override + public Object[] appendParameterValues(PaginationParameter param) { + return new Object[]{ + param.getOffset() + 1, + param.getOffset() + param.getRows()}; + } + +} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/InformixDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/InformixDialect.java index 21863b4..f9b869b 100644 --- a/mypages/src/main/java/io/leego/mypages/dialect/InformixDialect.java +++ b/mypages/src/main/java/io/leego/mypages/dialect/InformixDialect.java @@ -1,6 +1,6 @@ package io.leego.mypages.dialect; -import io.leego.mypages.util.PaginationParam; +import io.leego.mypages.util.PaginationParameter; /** * @author Yihleego @@ -8,12 +8,12 @@ public class InformixDialect extends AbstractDialect { @Override - public String getPagingSql(String sql) { - return "SELECT SKIP ? FIRST ? * FROM (" + sql + ")"; + public String getPageSql(String sql) { + return "SELECT SKIP ? FIRST ? * FROM (" + sql + ") " + PAGING_TABLE_ALIAS; } @Override - public Object[] getPagingParams(PaginationParam param) { + public Object[] prependParameterValues(PaginationParameter param) { return new Object[]{ param.getOffset(), param.getRows()}; diff --git a/mypages/src/main/java/io/leego/mypages/dialect/MariaDBDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/MariaDBDialect.java new file mode 100644 index 0000000..7b9b098 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/MariaDBDialect.java @@ -0,0 +1,22 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.util.PaginationParameter; + +/** + * @author Yihleego + */ +public class MariaDBDialect extends AbstractDialect { + + @Override + public String getPageSql(String sql) { + return sql + " LIMIT ?, ?"; + } + + @Override + public Object[] appendParameterValues(PaginationParameter param) { + return new Object[]{ + param.getOffset(), + param.getRows()}; + } + +} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/MySQLDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/MySQLDialect.java index b9d6dba..f29c1fe 100644 --- a/mypages/src/main/java/io/leego/mypages/dialect/MySQLDialect.java +++ b/mypages/src/main/java/io/leego/mypages/dialect/MySQLDialect.java @@ -1,6 +1,6 @@ package io.leego.mypages.dialect; -import io.leego.mypages.util.PaginationParam; +import io.leego.mypages.util.PaginationParameter; /** * @author Yihleego @@ -8,12 +8,12 @@ public class MySQLDialect extends AbstractDialect { @Override - public String getPagingSql(String sql) { + public String getPageSql(String sql) { return sql + " LIMIT ?, ?"; } @Override - public Object[] getPagingParams(PaginationParam param) { + public Object[] appendParameterValues(PaginationParameter param) { return new Object[]{ param.getOffset(), param.getRows()}; diff --git a/mypages/src/main/java/io/leego/mypages/dialect/OracleDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/OracleDialect.java index d60dc21..3edde2a 100644 --- a/mypages/src/main/java/io/leego/mypages/dialect/OracleDialect.java +++ b/mypages/src/main/java/io/leego/mypages/dialect/OracleDialect.java @@ -1,6 +1,6 @@ package io.leego.mypages.dialect; -import io.leego.mypages.util.PaginationParam; +import io.leego.mypages.util.PaginationParameter; /** * @author Yihleego @@ -8,14 +8,14 @@ public class OracleDialect extends AbstractDialect { @Override - public String getPagingSql(String sql) { + public String getPageSql(String sql) { return "SELECT *" + " FROM (SELECT " + TEMP_TABLE_ALIAS + ".*, ROWNUM AS " + ROW_NUMBER_ALIAS + " FROM (" + sql + ") " + TEMP_TABLE_ALIAS + " WHERE ROWNUM <= ?) " + PAGING_TABLE_ALIAS + " WHERE " + ROW_NUMBER_ALIAS + " > ?"; } @Override - public Object[] getPagingParams(PaginationParam param) { + public Object[] appendParameterValues(PaginationParameter param) { return new Object[]{ param.getOffset() + param.getRows(), param.getOffset()}; diff --git a/mypages/src/main/java/io/leego/mypages/dialect/PhoenixDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/PhoenixDialect.java new file mode 100644 index 0000000..9a76e69 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/PhoenixDialect.java @@ -0,0 +1,22 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.util.PaginationParameter; + +/** + * @author Yihleego + */ +public class PhoenixDialect extends AbstractDialect { + + @Override + public String getPageSql(String sql) { + return sql + " LIMIT ? OFFSET ?"; + } + + @Override + public Object[] appendParameterValues(PaginationParameter param) { + return new Object[]{ + param.getRows(), + param.getOffset()}; + } + +} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/PostgreSQLDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/PostgreSQLDialect.java index c9f99f0..4c745bf 100644 --- a/mypages/src/main/java/io/leego/mypages/dialect/PostgreSQLDialect.java +++ b/mypages/src/main/java/io/leego/mypages/dialect/PostgreSQLDialect.java @@ -1,6 +1,6 @@ package io.leego.mypages.dialect; -import io.leego.mypages.util.PaginationParam; +import io.leego.mypages.util.PaginationParameter; /** * @author Yihleego @@ -8,12 +8,12 @@ public class PostgreSQLDialect extends AbstractDialect { @Override - public String getPagingSql(String sql) { + public String getPageSql(String sql) { return sql + " LIMIT ? OFFSET ?"; } @Override - public Object[] getPagingParams(PaginationParam param) { + public Object[] appendParameterValues(PaginationParameter param) { return new Object[]{ param.getRows(), param.getOffset()}; diff --git a/mypages/src/main/java/io/leego/mypages/dialect/SQLServerDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/SQLServerDialect.java new file mode 100644 index 0000000..5eb54ff --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/SQLServerDialect.java @@ -0,0 +1,22 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.util.PaginationParameter; + +/** + * @author Yihleego + */ +public class SQLServerDialect extends AbstractDialect { + + @Override + public String getPageSql(String sql) { + return sql + " OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + } + + @Override + public Object[] appendParameterValues(PaginationParameter param) { + return new Object[]{ + param.getOffset(), + param.getRows()}; + } + +} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/SQLiteDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/SQLiteDialect.java new file mode 100644 index 0000000..021884f --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/SQLiteDialect.java @@ -0,0 +1,22 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.util.PaginationParameter; + +/** + * @author Yihleego + */ +public class SQLiteDialect extends AbstractDialect { + + @Override + public String getPageSql(String sql) { + return sql + " LIMIT ?, ?"; + } + + @Override + public Object[] appendParameterValues(PaginationParameter param) { + return new Object[]{ + param.getOffset(), + param.getRows()}; + } + +} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/SqlDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/SqlDialect.java deleted file mode 100644 index 9cac710..0000000 --- a/mypages/src/main/java/io/leego/mypages/dialect/SqlDialect.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.leego.mypages.dialect; - -import io.leego.mypages.exception.SqlDialectException; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -/** - * @author Yihleego - */ -public enum SqlDialect { - DB2("DB2", DB2Dialect.class), - DERBY("Derby", DerbyDialect.class), - H2("H2", PostgreSQLDialect.class), - HIVE("Apache Hive", DB2Dialect.class), - HSQLDB("HSQLDB", PostgreSQLDialect.class), - INFORMIX("Informix", InformixDialect.class), - MARIADB("MariaDB", MySQLDialect.class), - MYSQL("MySQL", MySQLDialect.class), - ORACLE("Oracle", OracleDialect.class), - PHOENIX("Phoenix", PostgreSQLDialect.class), - POSTGRESQL("PostgreSQL", PostgreSQLDialect.class), - SQLITE("SQLite", MySQLDialect.class), - SQLSERVER("SQL Server", DerbyDialect.class), - TIDB("TiDB", MySQLDialect.class), - ; - - private final String name; - private final Class dialectClass; - - SqlDialect(String name, Class dialectClass) { - this.name = name; - this.dialectClass = dialectClass; - } - - public String getName() { - return name; - } - - public Class getDialectClass() { - return dialectClass; - } - - public Dialect newDialect() { - try { - // Uses the constructor represented by the Constructor object to initialize a new instance - AbstractDialect dialect = dialectClass.getConstructor().newInstance(); - dialect.setSqlDialect(this); - return dialect; - } catch (Exception e) { - throw new SqlDialectException(e); - } - } - - private static final Map map; - - static { - Map store = new HashMap<>(32); - for (SqlDialect e : values()) { - String lowerCaseDialectName = e.getName().toLowerCase(); - String lowerCaseEnumName = e.name().toLowerCase(); - store.put(lowerCaseDialectName, e); - if (!lowerCaseDialectName.equals(lowerCaseEnumName)) { - store.putIfAbsent(e.name().toLowerCase(), e); - } - } - map = Collections.unmodifiableMap(store); - } - - public static SqlDialect get(String name) { - if (name == null) { - return null; - } - return map.get(name); - } - -} diff --git a/mypages/src/main/java/io/leego/mypages/dialect/TiDBDialect.java b/mypages/src/main/java/io/leego/mypages/dialect/TiDBDialect.java new file mode 100644 index 0000000..efea22c --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/dialect/TiDBDialect.java @@ -0,0 +1,22 @@ +package io.leego.mypages.dialect; + +import io.leego.mypages.util.PaginationParameter; + +/** + * @author Yihleego + */ +public class TiDBDialect extends AbstractDialect { + + @Override + public String getPageSql(String sql) { + return sql + " LIMIT ?, ?"; + } + + @Override + public Object[] appendParameterValues(PaginationParameter param) { + return new Object[]{ + param.getOffset(), + param.getRows()}; + } + +} diff --git a/mypages/src/main/java/io/leego/mypages/exception/DialectException.java b/mypages/src/main/java/io/leego/mypages/exception/DialectException.java new file mode 100644 index 0000000..0c47f67 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/exception/DialectException.java @@ -0,0 +1,41 @@ +package io.leego.mypages.exception; + +/** + * @author Yihleego + */ +public class DialectException extends RuntimeException { + private static final long serialVersionUID = 1L; + + /** + * Constructs a DialectException with no detail message. + */ + public DialectException() { + super(); + } + + /** + * Constructs a DialectException with the specified detail message. + * @param message detail message + */ + public DialectException(String message) { + super(message); + } + + /** + * Constructs a DialectException with the specified detail message and cause. + * @param message detail message + * @param cause the cause + */ + public DialectException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructs a DialectException with the cause. + * @param cause the cause + */ + public DialectException(Throwable cause) { + super(cause); + } + +} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/exception/SqlDialectException.java b/mypages/src/main/java/io/leego/mypages/exception/SqlDialectException.java deleted file mode 100644 index 5ea4c85..0000000 --- a/mypages/src/main/java/io/leego/mypages/exception/SqlDialectException.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.leego.mypages.exception; - -/** - * @author Yihleego - */ -public class SqlDialectException extends RuntimeException { - private static final long serialVersionUID = 1L; - - /** - * Constructs a SqlDialectException with no detail message. - */ - public SqlDialectException() { - super(); - } - - /** - * Constructs a SqlDialectException with the specified detail message. - * @param message detail message - */ - public SqlDialectException(String message) { - super(message); - } - - /** - * Constructs a SqlDialectException with the specified detail message and cause. - * @param message detail message - * @param cause the cause - */ - public SqlDialectException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Constructs a SqlDialectException with the cause. - * @param cause the cause - */ - public SqlDialectException(Throwable cause) { - super(cause); - } - -} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/interceptor/PaginationInterceptor.java b/mypages/src/main/java/io/leego/mypages/interceptor/PaginationInterceptor.java index 2e93c73..39e7bc6 100644 --- a/mypages/src/main/java/io/leego/mypages/interceptor/PaginationInterceptor.java +++ b/mypages/src/main/java/io/leego/mypages/interceptor/PaginationInterceptor.java @@ -9,15 +9,13 @@ import io.leego.mypages.annotation.Pagination; import io.leego.mypages.annotation.Rows; import io.leego.mypages.annotation.Size; +import io.leego.mypages.dialect.Database; import io.leego.mypages.dialect.Dialect; import io.leego.mypages.exception.PaginationException; -import io.leego.mypages.util.BeanUtils; import io.leego.mypages.util.Pageable; import io.leego.mypages.util.PaginationCollectionFactory; -import io.leego.mypages.util.PaginationParam; -import io.leego.mypages.util.PaginationUnrefinedParam; -import io.leego.mypages.util.ReflectUtils; -import io.leego.mypages.util.StringUtils; +import io.leego.mypages.util.PaginationDefinition; +import io.leego.mypages.util.PaginationParameter; import org.apache.ibatis.cache.CacheKey; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; @@ -32,18 +30,15 @@ import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; -import java.beans.IntrospectionException; -import java.beans.PropertyDescriptor; -import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -55,15 +50,41 @@ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})}) public class PaginationInterceptor implements Interceptor { + private static final ConcurrentMap countMsCacheMap = new ConcurrentHashMap<>(64); + private static final ConcurrentMap definitionCacheMap = new ConcurrentHashMap<>(64); private final Dialect dialect; private final PaginationSettings settings; - private final ConcurrentMap countMsMap = new ConcurrentHashMap<>(64); - private final ConcurrentMap unrefinedParamMap = new ConcurrentHashMap<>(64); + + public PaginationInterceptor(Database database) { + if (database == null) { + throw new IllegalArgumentException("Please specify a database type."); + } + this.dialect = database.newDialect(); + this.settings = PaginationSettings.empty(); + } public PaginationInterceptor(PaginationSettings settings) { - settings.initialize(); + if (settings.getDatabase() == null) { + throw new IllegalArgumentException("Please specify a database type."); + } + this.dialect = settings.getDatabase().newDialect(); + this.settings = settings; + } + + public PaginationInterceptor(Dialect dialect) { + if (dialect == null) { + throw new IllegalArgumentException("Please specify a sql dialect."); + } + this.dialect = dialect; + this.settings = PaginationSettings.empty(); + } + + public PaginationInterceptor(Dialect dialect, PaginationSettings settings) { + if (dialect == null) { + throw new IllegalArgumentException("Please specify a sql dialect."); + } + this.dialect = dialect; this.settings = settings; - this.dialect = settings.getDialect(); } @Override @@ -76,13 +97,13 @@ public Object intercept(Invocation invocation) throws Throwable { if (!isPageable(parameter, returnType)) { return invocation.proceed(); } - PaginationParam param = analyseParameter(parameter, ms.getId()); - if (!param.isPageable()) { + PaginationParameter paginationParameter = analyseParameter(parameter, ms.getId()); + if (paginationParameter == null) { return invocation.proceed(); } Executor executor = (Executor) invocation.getTarget(); RowBounds rowBounds = (RowBounds) args[2]; - ResultHandler resultHandler = (ResultHandler) args[3]; + ResultHandler resultHandler = (ResultHandler) args[3]; BoundSql boundSql; CacheKey cacheKey; if (args.length == 4) { @@ -93,14 +114,14 @@ public Object intercept(Invocation invocation) throws Throwable { cacheKey = (CacheKey) args[4]; } Long total = null; - if (isCounting(parameter)) { - total = count(executor, ms, boundSql, parameter, resultHandler, param.getCountExpr(), param.getCountMethodName()); + if (isCountable(parameter)) { + total = count(executor, ms, boundSql, parameter, resultHandler, paginationParameter.getCountExpr(), paginationParameter.getCountMethodName()); if (total == 0 && settings.isSkipQueryIfCountEqualsZero()) { - return PaginationCollectionFactory.build(returnType, total, param.getPage(), param.getSize()); + return PaginationCollectionFactory.build(returnType, total, paginationParameter.getPage(), paginationParameter.getSize()); } } - List result = query(executor, ms, boundSql, parameter, resultHandler, cacheKey, param); - return PaginationCollectionFactory.build(returnType, result, total, param.getPage(), param.getSize()); + List result = query(executor, ms, boundSql, parameter, rowBounds, resultHandler, cacheKey, paginationParameter); + return PaginationCollectionFactory.build(returnType, result, total, paginationParameter.getPage(), paginationParameter.getSize()); } @Override @@ -110,38 +131,39 @@ public Object plugin(Object target) { @Override public void setProperties(Properties properties) { - // ignored } /** * Returns count quantity. */ - private Long count(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameter, ResultHandler resultHandler, String countExpr, String countMsId) throws SQLException { + private Long count(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameter, ResultHandler resultHandler, String countExpr, String countMsId) throws SQLException { Object value; - if (StringUtils.isEmpty(countMsId)) { + if (isEmpty(countMsId)) { value = countByGenerated(executor, ms, boundSql, parameter, resultHandler, countExpr); } else { value = countBySpecified(executor, ms, boundSql, parameter, resultHandler, countExpr, countMsId); } - return value != null ? parseLong(((List) value).get(0)) : 0L; + return value != null ? parseLong(((List) value).get(0)) : 0L; } /** * Returns count quantity by the generated SQL. */ - private Object countByGenerated(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameter, ResultHandler resultHandler, String countExpr) throws SQLException { - MappedStatement countMs = countMsMap.computeIfAbsent(buildCountMsKey(ms), id -> newCountMappedStatement(ms, id)); - CacheKey countKey = executor.createCacheKey(countMs, parameter, RowBounds.DEFAULT, boundSql); + private Object countByGenerated(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameter, ResultHandler resultHandler, String countExpr) throws SQLException { + MappedStatement countMs = countMsCacheMap.computeIfAbsent(buildCountMsKey(ms), id -> createCountMappedStatement(ms, id)); + CacheKey cacheKey = executor.createCacheKey(countMs, parameter, RowBounds.DEFAULT, boundSql); String originSql = boundSql.getSql(); - String countSql = dialect.getCountSql(originSql, countExpr); - BoundSql countBoundSql = newBoundSql(ms, boundSql, countSql); - return executor.query(countMs, parameter, RowBounds.DEFAULT, resultHandler, countKey, countBoundSql); + String countSql = settings.isUseGracefulCountSql() + ? dialect.getCountSql(originSql, countExpr, settings.isKeepSorting()) + : dialect.getSimpleCountSql(originSql, countExpr); + BoundSql countBoundSql = createBoundSql(ms, boundSql, countSql); + return executor.query(countMs, parameter, RowBounds.DEFAULT, resultHandler, cacheKey, countBoundSql); } /** * Returns count quantity by the specified SQL. */ - private Object countBySpecified(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameter, ResultHandler resultHandler, String countExpr, String countMsId) throws SQLException { + private Object countBySpecified(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameter, ResultHandler resultHandler, String countExpr, String countMsId) throws SQLException { MappedStatement countMs = null; Throwable cause = null; try { @@ -150,9 +172,9 @@ private Object countBySpecified(Executor executor, MappedStatement ms, BoundSql cause = t; } if (countMs != null) { - CacheKey countKey = executor.createCacheKey(countMs, parameter, RowBounds.DEFAULT, ms.getBoundSql(parameter)); + CacheKey cacheKey = executor.createCacheKey(countMs, parameter, RowBounds.DEFAULT, ms.getBoundSql(parameter)); BoundSql countBoundSql = countMs.getBoundSql(parameter); - return executor.query(countMs, parameter, RowBounds.DEFAULT, resultHandler, countKey, countBoundSql); + return executor.query(countMs, parameter, RowBounds.DEFAULT, resultHandler, cacheKey, countBoundSql); } if (settings.isUseGeneratedIfCountMethodIsMissing()) { return countByGenerated(executor, ms, boundSql, parameter, resultHandler, countExpr); @@ -163,12 +185,12 @@ private Object countBySpecified(Executor executor, MappedStatement ms, BoundSql /** * Returns paging query results. */ - private List query(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameter, ResultHandler resultHandler, CacheKey cacheKey, PaginationParam param) throws Exception { - Object assembledParameter = dialect.assembleParameter(ms, parameter, boundSql, cacheKey, param); + private List query(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, PaginationParameter paginationParameter) throws Exception { + Object assembledParameter = dialect.handleParameter(ms, parameter, boundSql, cacheKey, paginationParameter); String originSql = boundSql.getSql(); - String paginationSql = dialect.getPagingSql(originSql, param); - BoundSql paginationBoundSql = newBoundSql(ms, boundSql, paginationSql); - return executor.query(ms, assembledParameter, RowBounds.DEFAULT, resultHandler, cacheKey, paginationBoundSql); + String paginationSql = dialect.getPageSql(originSql, paginationParameter); + BoundSql paginationBoundSql = createBoundSql(ms, boundSql, paginationSql); + return executor.query(ms, assembledParameter, rowBounds, resultHandler, cacheKey, paginationBoundSql); } /** @@ -177,7 +199,7 @@ private List query(Executor executor, MappedStatement ms, BoundSql boundS * @param msId New id * @return a new instanced object of {@link MappedStatement} */ - private MappedStatement newCountMappedStatement(MappedStatement ms, String msId) { + private MappedStatement createCountMappedStatement(MappedStatement ms, String msId) { MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), msId, ms.getSqlSource(), ms.getSqlCommandType()); builder.resource(ms.getResource()); builder.fetchSize(ms.getFetchSize()); @@ -212,7 +234,7 @@ private MappedStatement newCountMappedStatement(MappedStatement ms, String msId) * @param sql SQL string * @return a new instanced object of {@link BoundSql} */ - private BoundSql newBoundSql(MappedStatement ms, BoundSql boundSql, String sql) { + private BoundSql createBoundSql(MappedStatement ms, BoundSql boundSql, String sql) { BoundSql newBoundSql = new BoundSql(ms.getConfiguration(), sql, boundSql.getParameterMappings(), boundSql.getParameterObject()); for (ParameterMapping mapping : boundSql.getParameterMappings()) { String prop = mapping.getProperty(); @@ -229,14 +251,9 @@ private BoundSql newBoundSql(MappedStatement ms, BoundSql boundSql, String sql) * @param returnType Return type */ private boolean isPageable(Object parameter, Class returnType) { - if (parameter == null - || !Collection.class.isAssignableFrom(returnType) - || parameter.getClass().getAnnotation(DisablePagination.class) != null) { - return false; - } - return settings.isObtainValuesFromFields() - || parameter instanceof Pageable - || parameter.getClass().getAnnotation(Pagination.class) != null; + return parameter != null + && Collection.class.isAssignableFrom(returnType) + && parameter.getClass().getAnnotation(DisablePagination.class) == null; } /** @@ -244,45 +261,55 @@ private boolean isPageable(Object parameter, Class returnType) { * and enable count equals true. * @param parameter The parameter */ - private boolean isCounting(Object parameter) { + private boolean isCountable(Object parameter) { if (parameter.getClass().getAnnotation(DisableCount.class) != null) { return false; } - if (StringUtils.isEmpty(settings.getEnableCountFieldName())) { - return true; - } - try { - Object value = BeanUtils.read(parameter, settings.getEnableCountFieldName()); - return parseBoolean(value, false); - } catch (Exception e) { - return false; + if (!isEmpty(settings.getEnableCountField())) { + try { + Field field = getField(parameter.getClass(), settings.getEnableCountField()); + Boolean b = parseBoolean(getFieldValue(parameter, field)); + return b != null && b; + } catch (Exception e) { + return false; + } } + return true; } /** - * Returns {@link PaginationParam} from parameter. + * Returns {@link PaginationParameter} from parameter. * @param parameter The parameter - * @return {@link PaginationParam} + * @return {@link PaginationParameter} */ - private PaginationParam analyseParameter(Object parameter, String msId) { - String key = buildUnrefinedParamKey(parameter, msId); - PaginationUnrefinedParam unrefinedParam = unrefinedParamMap.get(key); - if (unrefinedParam == null) { - unrefinedParam = getPaginationUnrefinedParam(parameter); - if (unrefinedParam.isInvalid()) { - return PaginationParam.nonPagination(); - } - unrefinedParamMap.putIfAbsent(key, unrefinedParam); + private PaginationParameter analyseParameter(Object parameter, String msId) { + PaginationDefinition definition = definitionCacheMap.computeIfAbsent( + buildDefinitionParamKey(parameter, msId), + ignored -> buildPaginationDefinition(parameter)); + if (!definition.isValid()) { + return null; } - int defaultPage = unrefinedParam.getDefaultPage(); - int defaultSize = unrefinedParam.getDefaultSize(); - int maxPage = unrefinedParam.getMaxPage(); - int maxSize = unrefinedParam.getMaxSize(); + return isEmpty(definition.getNestedMapKey()) + ? buildPaginationParameter(parameter, definition) + : buildPaginationParameter(((Map) parameter).get(definition.getNestedMapKey()), definition); + } + + /** + * Builds {@link PaginationParameter} from parameter. + * @param parameter The parameter + * @param definition {@link PaginationDefinition} + * @return {@link PaginationParameter} + */ + private PaginationParameter buildPaginationParameter(Object parameter, PaginationDefinition definition) { + int defaultPage = definition.getDefaultPage(); + int defaultSize = definition.getDefaultSize(); + int maxPage = definition.getMaxPage(); + int maxSize = definition.getMaxSize(); String countExpr; String countMethodName; Integer page; Integer size; - Integer offset; + Long offset; Integer rows; boolean usePageSize; boolean useOffsetRows; @@ -294,25 +321,24 @@ private PaginationParam analyseParameter(Object parameter, String msId) { rows = pageable.getRows(); countExpr = pageable.getCountExpr(); countMethodName = pageable.getCountMethodName(); - } else if (unrefinedParam.isMapType()) { - Map parameterMap = (Map) parameter; - page = parseInteger(getMapValue(parameterMap, settings.getPageFieldName())); - size = parseInteger(getMapValue(parameterMap, settings.getSizeFieldName())); - offset = parseInteger(getMapValue(parameterMap, settings.getOffsetFieldName())); - rows = parseInteger(getMapValue(parameterMap, settings.getRowsFieldName())); - countExpr = parseString(getMapValue(parameterMap, settings.getCountExprFieldName())); - countMethodName = parseString(getMapValue(parameterMap, settings.getCountMethodNameFieldName())); + } else if (parameter instanceof Map) { + Map parameterMap = (Map) parameter; + page = parseInteger(getMapValue(parameterMap, settings.getPageField())); + size = parseInteger(getMapValue(parameterMap, settings.getSizeField())); + offset = parseLong(getMapValue(parameterMap, settings.getOffsetField())); + rows = parseInteger(getMapValue(parameterMap, settings.getRowsField())); + countExpr = parseString(getMapValue(parameterMap, settings.getCountExprField())); + countMethodName = parseString(getMapValue(parameterMap, settings.getCountMethodNameField())); } else { - page = invokeInteger(parameter, unrefinedParam.getPageReadMethod()); - size = invokeInteger(parameter, unrefinedParam.getSizeReadMethod()); - offset = invokeInteger(parameter, unrefinedParam.getOffsetReadMethod()); - rows = invokeInteger(parameter, unrefinedParam.getRowsReadMethod()); - countExpr = invokeString(parameter, unrefinedParam.getCountExprReadMethod()); - countMethodName = invokeString(parameter, unrefinedParam.getCountMethodNameReadMethod()); + page = parseInteger(getValue(parameter, definition.getPageField(), definition.getPageReadMethod())); + size = parseInteger(getValue(parameter, definition.getSizeField(), definition.getSizeReadMethod())); + offset = parseLong(getValue(parameter, definition.getOffsetField(), definition.getOffsetReadMethod())); + rows = parseInteger(getValue(parameter, definition.getRowsField(), definition.getRowsReadMethod())); + countExpr = parseString(getValue(parameter, definition.getCountExprField(), definition.getCountExprReadMethod())); + countMethodName = parseString(getValue(parameter, definition.getCountMethodNameField(), definition.getCountMethodNameReadMethod())); } - if (StringUtils.isEmpty(countExpr) - && StringUtils.isNotEmpty(unrefinedParam.getCountExpr())) { - countExpr = unrefinedParam.getCountExpr(); + if (isEmpty(countExpr) && !isEmpty(definition.getCountExpr())) { + countExpr = definition.getCountExpr(); } usePageSize = page != null && size != null; useOffsetRows = offset != null && rows != null; @@ -329,246 +355,255 @@ private PaginationParam analyseParameter(Object parameter, String msId) { if (size > maxSize && maxSize > 0) { size = maxSize; } - offset = (page - 1) * size; + offset = (page - 1L) * size; rows = size; } else if (useOffsetRows) { if (rows <= 0 && defaultSize > 0) { rows = defaultSize; } if (offset <= 0 && defaultPage > 0) { - offset = (defaultPage - 1) * rows; + offset = (defaultPage - 1L) * rows; } if (rows > maxSize && maxSize > 0) { rows = maxSize; } if (offset / rows + 1 > maxPage && maxPage > 0) { - offset = (maxPage - 1) * rows; + offset = (maxPage - 1L) * rows; } - // Converts [offset, rows] to [page, size] if rows can be divided by offset. + // Convert [offset, rows] to [page, size] if rows can be divided by offset. if (rows > 0 && offset % rows == 0) { - page = offset / rows + 1; + page = (int) (offset / rows + 1); size = rows; } else { page = null; size = null; } } else { - return PaginationParam.nonPagination(); + return null; } - return new PaginationParam(page, size, offset, rows, countExpr, countMethodName, true); + return new PaginationParameter(page, size, offset, rows, countExpr, countMethodName); } /** - * Returns {@link PaginationUnrefinedParam} from parameter. + * Builds {@link PaginationDefinition} from parameter. * @param parameter The parameter - * @return {@link PaginationUnrefinedParam} + * @return {@link PaginationDefinition} */ - private PaginationUnrefinedParam getPaginationUnrefinedParam(Object parameter) { - // There may be an object that extends Pageable. - if (parameter instanceof Pageable) { - return buildPaginationUnrefinedParam(parameter, false); - } - // There may be a map. + private PaginationDefinition buildPaginationDefinition(Object parameter) { if (parameter instanceof Map) { - return buildPaginationUnrefinedParam(parameter, true); + // Support for annotation '@Param' with a single object. + Map parameterMap = (Map) parameter; + Map.Entry o = null; + if (parameterMap.size() == 1) { + Map.Entry[] entries = parameterMap.entrySet().toArray(new Map.Entry[0]); + if (entries[0].getValue() != null + && !(entries[0].getValue() instanceof Number) + && !(entries[0].getValue() instanceof CharSequence)) { + o = entries[0]; + } + } else if (parameterMap.size() == 2) { + Map.Entry[] entries = parameterMap.entrySet().toArray(new Map.Entry[0]); + if (entries[0].getValue() != null + && entries[0].getValue() == entries[1].getValue() + && !(entries[0].getValue() instanceof Number) + && !(entries[0].getValue() instanceof CharSequence)) { + o = entries[0]; + } + } + if (o != null) { + PaginationDefinition definition = createPaginationDefinition(o.getValue()); + if (definition.isValid()) { + definition.setNestedMapKey(String.valueOf(o.getKey())); + } + return definition; + } } + return createPaginationDefinition(parameter); + } + + /** + * Creates {@link PaginationDefinition} from parameter. + * @param parameter The parameter + * @return {@link PaginationDefinition} + */ + private PaginationDefinition createPaginationDefinition(Object parameter) { + Pagination pagination = parameter.getClass().getAnnotation(Pagination.class); + // It might be an instance of 'Pageable' or 'Map'. + if (parameter instanceof Pageable || parameter instanceof Map) { + return createPaginationDefinitionWithDefaultValue(pagination); + } + Field pageField = null; + Field sizeField = null; + Field offsetField = null; + Field rowsField = null; + Field countExprField = null; + Field countMethodNameField = null; Method pageReadMethod = null; Method sizeReadMethod = null; Method offsetReadMethod = null; Method rowsReadMethod = null; Method countExprReadMethod = null; Method countMethodNameReadMethod = null; - // Obtains read-method from configuration. - if (settings.isObtainValuesFromFields()) { - PropertyDescriptor[] pds; - try { - pds = BeanUtils.getPropertyDescriptors(parameter.getClass()); - } catch (IntrospectionException ignored) { - pds = null; - } - if (pds != null && pds.length > 0) { - for (PropertyDescriptor pd : pds) { - if (Objects.equals(settings.getPageFieldName(), pd.getName())) { - pageReadMethod = pd.getReadMethod(); - } else if (Objects.equals(settings.getSizeFieldName(), pd.getName())) { - sizeReadMethod = pd.getReadMethod(); - } else if (Objects.equals(settings.getOffsetFieldName(), pd.getName())) { - offsetReadMethod = pd.getReadMethod(); - } else if (Objects.equals(settings.getRowsFieldName(), pd.getName())) { - rowsReadMethod = pd.getReadMethod(); - } else if (Objects.equals(settings.getCountExprFieldName(), pd.getName())) { - countExprReadMethod = pd.getReadMethod(); - } else if (Objects.equals(settings.getCountMethodNameFieldName(), pd.getName())) { - countMethodNameReadMethod = pd.getReadMethod(); - } - } - } - } - // Obtains read-method by field annotations. - Field[] fields = ReflectUtils.getDeepFields(parameter, true); - for (Field field : fields) { - Annotation[] annotations = field.getDeclaredAnnotations(); - if (annotations.length == 0) { - continue; - } - for (Annotation annotation : annotations) { - try { - if (annotation instanceof Page) { - pageReadMethod = BeanUtils.getReadMethod(field); - } else if (annotation instanceof Size) { - sizeReadMethod = BeanUtils.getReadMethod(field); - } else if (annotation instanceof Offset) { - offsetReadMethod = BeanUtils.getReadMethod(field); - } else if (annotation instanceof Rows) { - rowsReadMethod = BeanUtils.getReadMethod(field); - } else if (annotation instanceof CountExpr) { - countExprReadMethod = BeanUtils.getReadMethod(field); - } else if (annotation instanceof CountMethodName) { - countMethodNameReadMethod = BeanUtils.getReadMethod(field); - } - } catch (IntrospectionException ignored) { - // ignored + // Obtain the fields and methods that should be used to read the property value. + List fields = getFields(parameter.getClass()); + List methods = getMethods(parameter.getClass()); + if (pagination != null) { + for (Field field : fields) { + if (field.getAnnotation(Page.class) != null) { + pageField = field; + } else if (field.getAnnotation(Size.class) != null) { + sizeField = field; + } else if (field.getAnnotation(Offset.class) != null) { + offsetField = field; + } else if (field.getAnnotation(Rows.class) != null) { + rowsField = field; + } else if (field.getAnnotation(CountExpr.class) != null) { + countExprField = field; + } else if (field.getAnnotation(CountMethodName.class) != null) { + countMethodNameField = field; } } - } - // Obtains read-method by method annotations. - Method[] methods = ReflectUtils.getDeepMethods(parameter, true); - for (Method method : methods) { - Annotation[] annotations = method.getDeclaredAnnotations(); - if (annotations.length == 0) { - continue; - } - for (Annotation annotation : annotations) { - if (annotation instanceof Page) { + for (Method method : methods) { + if (pageReadMethod == null && method.getAnnotation(Page.class) != null) { pageReadMethod = method; - } else if (annotation instanceof Size) { + } else if (sizeReadMethod == null && method.getAnnotation(Size.class) != null) { sizeReadMethod = method; - } else if (annotation instanceof Offset) { + } else if (offsetReadMethod == null && method.getAnnotation(Offset.class) != null) { offsetReadMethod = method; - } else if (annotation instanceof Rows) { + } else if (rowsReadMethod == null && method.getAnnotation(Rows.class) != null) { rowsReadMethod = method; - } else if (annotation instanceof CountExpr) { + } else if (countExprReadMethod == null && method.getAnnotation(CountExpr.class) != null) { countExprReadMethod = method; - } else if (annotation instanceof CountMethodName) { + } else if (countMethodNameReadMethod == null && method.getAnnotation(CountMethodName.class) != null) { countMethodNameReadMethod = method; } } } - if (pageReadMethod == null - && sizeReadMethod == null - && offsetReadMethod == null - && rowsReadMethod == null) { - return PaginationUnrefinedParam.invalidation(); + if ((settings.getPageField() != null && settings.getSizeField() != null) || (settings.getOffsetField() != null && settings.getRowsField() != null)) { + for (Field field : fields) { + if (pageField == null && field.getName().equals(settings.getPageField())) { + pageField = field; + } else if (sizeField == null && field.getName().equals(settings.getSizeField())) { + sizeField = field; + } else if (offsetField == null && field.getName().equals(settings.getOffsetField())) { + offsetField = field; + } else if (rowsField == null && field.getName().equals(settings.getRowsField())) { + rowsField = field; + } else if (countExprField == null && field.getName().equals(settings.getCountExprField())) { + countExprField = field; + } else if (countMethodNameField == null && field.getName().equals(settings.getCountMethodNameField())) { + countMethodNameField = field; + } + } } - PaginationUnrefinedParam unrefinedParam = buildPaginationUnrefinedParam(parameter, false); - unrefinedParam.setMethods( - pageReadMethod, - sizeReadMethod, - offsetReadMethod, - rowsReadMethod, - countExprReadMethod, - countMethodNameReadMethod); - return unrefinedParam; + if (pageField == null && sizeField == null && offsetField == null && rowsField == null + && pageReadMethod == null && sizeReadMethod == null && offsetReadMethod == null && rowsReadMethod == null) { + return PaginationDefinition.INVALID; + } + return createPaginationDefinitionWithDefaultValue(pagination) + .setFields(pageField, sizeField, offsetField, rowsField, countExprField, countMethodNameField) + .setMethods(pageReadMethod, sizeReadMethod, offsetReadMethod, rowsReadMethod, countExprReadMethod, countMethodNameReadMethod); } /** - * Builds {@link PaginationUnrefinedParam} from parameter. - * @param parameter The parameter - * @param mapType Whether it is a map type - * @return {@link PaginationUnrefinedParam} + * Creates {@link PaginationDefinition} from parameter with default value. + * @param pagination {@link Pagination} + * @return {@link PaginationDefinition} */ - private PaginationUnrefinedParam buildPaginationUnrefinedParam(Object parameter, boolean mapType) { - Pagination pagination = parameter.getClass().getAnnotation(Pagination.class); + private PaginationDefinition createPaginationDefinitionWithDefaultValue(Pagination pagination) { if (pagination != null) { - return new PaginationUnrefinedParam( + return new PaginationDefinition( pagination.defaultPage() > 0 ? pagination.defaultPage() : settings.getDefaultPage(), pagination.defaultSize() > 0 ? pagination.defaultSize() : settings.getDefaultSize(), pagination.maxPage() > 0 ? pagination.maxPage() : settings.getMaxPage(), pagination.maxSize() > 0 ? pagination.maxSize() : settings.getMaxSize(), - StringUtils.isNotEmpty(pagination.countExpr()) ? pagination.countExpr() : settings.getCountExpr(), - mapType, - true); + !isEmpty(pagination.countExpr()) ? pagination.countExpr() : settings.getCountExpr()); } else { - return new PaginationUnrefinedParam( + return new PaginationDefinition( settings.getDefaultPage(), settings.getDefaultSize(), settings.getMaxPage(), settings.getMaxSize(), - settings.getCountExpr(), - mapType, - true); + settings.getCountExpr()); } } /** - * Returns {@link Integer} value by invoking method. - * And try to convert to {@link Integer} value - * if it is a {@link String} value. - * @param o target - * @param method {@link Method} - * @return {@link Integer} value + * Returns the value to which the specified key is mapped, + * or {@code null} if this map contains no mapping for the key. + * @param map It might be an object of {@link org.apache.ibatis.binding.MapperMethod.ParamMap} + * @param key The key whose associated value is to be returned + * @return The value to which the specified key is mapped */ - private Integer invokeInteger(Object o, Method method) { - Object value = invoke(o, method); - return parseInteger(value); + private Object getMapValue(Map map, Object key) { + if (map == null || key == null) { + return null; + } + // DO NOT use the 'get' method, It might be an instance of MapperMethod$ParamMap. + // It might throw a ‘key not found’ exception, if this map contains no mapping for the key. + return map.getOrDefault(key, null); } - /** - * Returns {@link String} value by invoking method. - * @param o target - * @param method {@link Method} - * @return {@link String} value - */ - private String invokeString(Object o, Method method) { - Object value = invoke(o, method); - if (value == null) { + private Object getFieldValue(Object o, Field filed) { + if (o == null || filed == null) { return null; } - if (value instanceof String) { - return (String) value; + try { + if (!Modifier.isPublic(filed.getModifiers())) { + filed.setAccessible(true); + } + return filed.get(o); + } catch (Exception ignored) { + return null; } - return null; } - /** - * Invokes method. - * @param o target - * @param method {@link Method} - * @return {@link Boolean} value - */ - private Object invoke(Object o, Method method) { + private Object invokeMethod(Object o, Method method) { if (o == null || method == null) { return null; } try { - return BeanUtils.read(o, method); + if (!Modifier.isPublic(method.getModifiers())) { + method.setAccessible(true); + } + return method.invoke(o); } catch (Exception ignored) { return null; } } - /** - * Returns the value to which the specified key is mapped, - * or {@code null} if this map contains no mapping for the key. - * @param map It may be an object of {@link org.apache.ibatis.binding.MapperMethod.ParamMap} - * @param key The key whose associated value is to be returned - * @return The value to which the specified key is mapped - */ - private Object getMapValue(Map map, Object key) { - if (map == null || key == null) { + private Object getValue(Object o, Field field, Method method) { + Object value = getFieldValue(o, field); + if (value != null) { + return value; + } + return invokeMethod(o, method); + } + + private Integer parseInteger(Object value) { + if (value == null) { return null; } - try { - // The map may be an object of {@link MapperMethod.ParamMap} - return map.get(key); - } catch (Throwable ignored) { + if (value instanceof Number) { + return ((Number) value).intValue(); + } else if (value instanceof String) { + return Integer.parseInt((String) value); + } + return null; + } + + private Long parseLong(Object value) { + if (value == null) { return null; } + if (value instanceof Number) { + return ((Number) value).longValue(); + } else if (value instanceof String) { + return Long.parseLong((String) value); + } + return null; } - /** - * Parses the object argument as a string. - */ private String parseString(Object value) { if (value == null) { return null; @@ -576,77 +611,74 @@ private String parseString(Object value) { if (value instanceof String) { return (String) value; } - return String.valueOf(value); + return null; } - /** - * Parses the object argument as a boolean. - */ - private boolean parseBoolean(Object value, boolean defaultValue) { + private Boolean parseBoolean(Object value) { if (value == null) { - return defaultValue; + return null; } if (value instanceof Boolean) { return (boolean) value; } else if (value instanceof Number) { - // Returns false if the value equals 0. + // Return false if the value equals 0. return ((Number) value).intValue() != 0; } else if (value instanceof String) { String s = (String) value; - // Returns true if the text equals "true". + // Return true if the text equals "true". if ("true".equalsIgnoreCase(s)) { return true; } - // Returns false if the text equals "false". + // Return false if the text equals "false". if ("false".equalsIgnoreCase(s)) { return false; } } - return defaultValue; + return null; } - /** - * Parses the object argument as a signed decimal integer. - */ - private Integer parseInteger(Object value) { - if (value == null) { - return null; - } - if (value instanceof Number) { - return ((Number) value).intValue(); - } else if (value instanceof String) { - return Integer.parseInt((String) value); - } - return null; + private String buildCountMsKey(MappedStatement ms) { + return ms.getId() + "__COUNT"; } - /** - * Parses the object argument as a signed decimal long. - */ - private Long parseLong(Object value) { - if (value == null) { - return null; - } - if (value instanceof Number) { - return ((Number) value).longValue(); - } else if (value instanceof String) { - return Long.parseLong((String) value); + private String buildDefinitionParamKey(Object parameter, String msId) { + return msId + "#" + parameter.getClass().getName(); + } + + private boolean isEmpty(CharSequence s) { + return s == null || s.length() == 0; + } + + private Field getField(Class clazz, String name) { + Class c = clazz; + while (c != null && c != Object.class) { + try { + return clazz.getDeclaredField(name); + } catch (NoSuchFieldException ignored) { + } + c = c.getSuperclass(); } return null; } - /** - * Returns count MappedStatement key. - */ - private String buildCountMsKey(MappedStatement ms) { - return ms.getId() + "__COUNT"; + private List getFields(Class clazz) { + List fields = new ArrayList<>(); + Class c = clazz; + while (c != null && c != Object.class) { + Collections.addAll(fields, c.getDeclaredFields()); + c = c.getSuperclass(); + } + return fields; } - /** - * Returns unrefined param key. - */ - private String buildUnrefinedParamKey(Object parameter, String msId) { - return msId + "#" + parameter.getClass().getName(); + private List getMethods(Class clazz) { + List methods = new ArrayList<>(); + Class c = clazz; + while (c != null && c != Object.class) { + Collections.addAll(methods, c.getDeclaredMethods()); + c = c.getSuperclass(); + } + return methods; } public Dialect getDialect() { @@ -656,5 +688,4 @@ public Dialect getDialect() { public PaginationSettings getSettings() { return settings; } - } \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/interceptor/PaginationSettings.java b/mypages/src/main/java/io/leego/mypages/interceptor/PaginationSettings.java index 7c33ea8..3cd345c 100644 --- a/mypages/src/main/java/io/leego/mypages/interceptor/PaginationSettings.java +++ b/mypages/src/main/java/io/leego/mypages/interceptor/PaginationSettings.java @@ -1,38 +1,37 @@ package io.leego.mypages.interceptor; -import io.leego.mypages.dialect.Dialect; -import io.leego.mypages.dialect.SqlDialect; +import io.leego.mypages.dialect.Database; /** * @author Yihleego */ -public final class PaginationSettings { - /** The instance of {@link Dialect}. */ - private Dialect dialect; - /** The specified SQL dialect. */ - private SqlDialect sqlDialect; +public class PaginationSettings { + /** The specified {@link Database}. */ + private Database database; /** The column name or expression, the default value is "*". */ private String countExpr; /** The page field name. */ - private String pageFieldName; + private String pageField; /** The size field name. */ - private String sizeFieldName; + private String sizeField; /** The offset field name. */ - private String offsetFieldName; + private String offsetField; /** The rows field name. */ - private String rowsFieldName; + private String rowsField; /** The count expression field name. */ - private String countExprFieldName; + private String countExprField; /** The count method name field name. */ - private String countMethodNameFieldName; - /** The enable count field name. */ - private String enableCountFieldName; - /** Whether to obtain values from parameter. */ - private boolean obtainValuesFromFields = false; + private String countMethodNameField; + /** The count enabled field name. */ + private String enableCountField; /** Whether to skip query if total value equals zero. */ private boolean skipQueryIfCountEqualsZero = true; /** Whether to use generated if the specified count method is missing. */ private boolean useGeneratedIfCountMethodIsMissing = true; + /** Whether to use graceful count sql. */ + private boolean useGracefulCountSql = true; + /** Whether to keep sorting. */ + private boolean keepSorting = false; /** Replaces page with defaultPage if page is invalid. */ private int defaultPage = -1; /** Replaces size with defaultSize if size is invalid. */ @@ -45,48 +44,41 @@ public final class PaginationSettings { public PaginationSettings() { } - public PaginationSettings(Dialect dialect) { - this.dialect = dialect; + public PaginationSettings(Database database) { + this.database = database; } - public PaginationSettings(SqlDialect sqlDialect) { - this.sqlDialect = sqlDialect; - } - - public PaginationSettings(Dialect dialect, SqlDialect sqlDialect, String countExpr, String pageFieldName, String sizeFieldName, String offsetFieldName, String rowsFieldName, String countExprFieldName, String countMethodNameFieldName, String enableCountFieldName, boolean obtainValuesFromFields, boolean skipQueryIfCountEqualsZero, boolean useGeneratedIfCountMethodIsMissing, int defaultPage, int defaultSize, int maxPage, int maxSize) { - this.dialect = dialect; - this.sqlDialect = sqlDialect; + public PaginationSettings( + Database database, String countExpr, + String pageField, String sizeField, String offsetField, String rowsField, + String countExprField, String countMethodNameField, String enableCountField, + boolean skipQueryIfCountEqualsZero, boolean useGeneratedIfCountMethodIsMissing, boolean useGracefulCountSql, boolean keepSorting, + int defaultPage, int defaultSize, int maxPage, int maxSize) { + this.database = database; this.countExpr = countExpr; - this.pageFieldName = pageFieldName; - this.sizeFieldName = sizeFieldName; - this.offsetFieldName = offsetFieldName; - this.rowsFieldName = rowsFieldName; - this.countExprFieldName = countExprFieldName; - this.countMethodNameFieldName = countMethodNameFieldName; - this.enableCountFieldName = enableCountFieldName; - this.obtainValuesFromFields = obtainValuesFromFields; + this.pageField = pageField; + this.sizeField = sizeField; + this.offsetField = offsetField; + this.rowsField = rowsField; + this.countExprField = countExprField; + this.countMethodNameField = countMethodNameField; + this.enableCountField = enableCountField; this.skipQueryIfCountEqualsZero = skipQueryIfCountEqualsZero; this.useGeneratedIfCountMethodIsMissing = useGeneratedIfCountMethodIsMissing; + this.useGracefulCountSql = useGracefulCountSql; + this.keepSorting = keepSorting; this.defaultPage = defaultPage; this.defaultSize = defaultSize; this.maxPage = maxPage; this.maxSize = maxSize; } - public Dialect getDialect() { - return dialect; - } - - public void setDialect(Dialect dialect) { - this.dialect = dialect; + public Database getDatabase() { + return database; } - public SqlDialect getSqlDialect() { - return sqlDialect; - } - - public void setSqlDialect(SqlDialect sqlDialect) { - this.sqlDialect = sqlDialect; + public void setDatabase(Database database) { + this.database = database; } public String getCountExpr() { @@ -97,68 +89,60 @@ public void setCountExpr(String countExpr) { this.countExpr = countExpr; } - public String getPageFieldName() { - return pageFieldName; - } - - public void setPageFieldName(String pageFieldName) { - this.pageFieldName = pageFieldName; + public String getPageField() { + return pageField; } - public String getSizeFieldName() { - return sizeFieldName; + public void setPageField(String pageField) { + this.pageField = pageField; } - public void setSizeFieldName(String sizeFieldName) { - this.sizeFieldName = sizeFieldName; + public String getSizeField() { + return sizeField; } - public String getOffsetFieldName() { - return offsetFieldName; + public void setSizeField(String sizeField) { + this.sizeField = sizeField; } - public void setOffsetFieldName(String offsetFieldName) { - this.offsetFieldName = offsetFieldName; + public String getOffsetField() { + return offsetField; } - public String getRowsFieldName() { - return rowsFieldName; + public void setOffsetField(String offsetField) { + this.offsetField = offsetField; } - public void setRowsFieldName(String rowsFieldName) { - this.rowsFieldName = rowsFieldName; + public String getRowsField() { + return rowsField; } - public String getCountExprFieldName() { - return countExprFieldName; + public void setRowsField(String rowsField) { + this.rowsField = rowsField; } - public void setCountExprFieldName(String countExprFieldName) { - this.countExprFieldName = countExprFieldName; + public String getCountExprField() { + return countExprField; } - public String getCountMethodNameFieldName() { - return countMethodNameFieldName; + public void setCountExprField(String countExprField) { + this.countExprField = countExprField; } - public void setCountMethodNameFieldName(String countMethodNameFieldName) { - this.countMethodNameFieldName = countMethodNameFieldName; + public String getCountMethodNameField() { + return countMethodNameField; } - public String getEnableCountFieldName() { - return enableCountFieldName; + public void setCountMethodNameField(String countMethodNameField) { + this.countMethodNameField = countMethodNameField; } - public void setEnableCountFieldName(String enableCountFieldName) { - this.enableCountFieldName = enableCountFieldName; + public String getEnableCountField() { + return enableCountField; } - public boolean isObtainValuesFromFields() { - return obtainValuesFromFields; - } - - public void setObtainValuesFromFields(boolean obtainValuesFromFields) { - this.obtainValuesFromFields = obtainValuesFromFields; + public void setEnableCountField(String enableCountField) { + this.enableCountField = enableCountField; } public boolean isSkipQueryIfCountEqualsZero() { @@ -177,6 +161,22 @@ public void setUseGeneratedIfCountMethodIsMissing(boolean useGeneratedIfCountMet this.useGeneratedIfCountMethodIsMissing = useGeneratedIfCountMethodIsMissing; } + public boolean isUseGracefulCountSql() { + return useGracefulCountSql; + } + + public void setUseGracefulCountSql(boolean useGracefulCountSql) { + this.useGracefulCountSql = useGracefulCountSql; + } + + public boolean isKeepSorting() { + return keepSorting; + } + + public void setKeepSorting(boolean keepSorting) { + this.keepSorting = keepSorting; + } + public int getDefaultPage() { return defaultPage; } @@ -209,15 +209,8 @@ public void setMaxSize(int maxSize) { this.maxSize = maxSize; } - public void initialize() { - if (this.dialect == null && this.sqlDialect == null) { - throw new NullPointerException("Dialect is not configured."); - } - this.obtainValuesFromFields = (this.pageFieldName != null && this.sizeFieldName != null) - || (this.offsetFieldName != null && this.rowsFieldName != null); - if (this.dialect == null) { - this.dialect = this.sqlDialect.newDialect(); - } + public static PaginationSettings empty() { + return new PaginationSettings(); } public static Builder builder() { @@ -227,13 +220,8 @@ public static Builder builder() { public static class Builder { private final PaginationSettings settings = new PaginationSettings(); - public Builder dialect(Dialect dialect) { - settings.setDialect(dialect); - return this; - } - - public Builder sqlDialect(SqlDialect sqlDialect) { - settings.setSqlDialect(sqlDialect); + public Builder database(Database database) { + settings.setDatabase(database); return this; } @@ -242,38 +230,38 @@ public Builder countExpr(String countExpr) { return this; } - public Builder pageField(String pageFieldName) { - settings.setPageFieldName(pageFieldName); + public Builder pageField(String pageField) { + settings.setPageField(pageField); return this; } - public Builder sizeField(String sizeFieldName) { - settings.setSizeFieldName(sizeFieldName); + public Builder sizeField(String sizeField) { + settings.setSizeField(sizeField); return this; } - public Builder offsetField(String offsetFieldName) { - settings.setOffsetFieldName(offsetFieldName); + public Builder offsetField(String offsetField) { + settings.setOffsetField(offsetField); return this; } - public Builder rowsField(String rowsFieldName) { - settings.setRowsFieldName(rowsFieldName); + public Builder rowsField(String rowsField) { + settings.setRowsField(rowsField); return this; } - public Builder countExprField(String countExprFieldName) { - settings.setCountExprFieldName(countExprFieldName); + public Builder countExprField(String countExprField) { + settings.setCountExprField(countExprField); return this; } - public Builder countMethodNameField(String countMethodNameFieldName) { - settings.setCountMethodNameFieldName(countMethodNameFieldName); + public Builder countMethodNameField(String countMethodNameField) { + settings.setCountMethodNameField(countMethodNameField); return this; } - public Builder enableCountField(String enableCountFieldName) { - settings.setEnableCountFieldName(enableCountFieldName); + public Builder enableCountField(String enableCountField) { + settings.setEnableCountField(enableCountField); return this; } @@ -287,6 +275,16 @@ public Builder useGeneratedIfCountMethodIsMissing(boolean useGeneratedIfCountMet return this; } + public Builder useGracefulCountSql(boolean useGracefulCountSql) { + settings.setUseGracefulCountSql(useGracefulCountSql); + return this; + } + + public Builder keepSorting(boolean keepSorting) { + settings.setKeepSorting(keepSorting); + return this; + } + public Builder defaultPage(int defaultPage) { settings.setDefaultPage(defaultPage); return this; @@ -310,7 +308,5 @@ public Builder maxSize(int maxSize) { public PaginationSettings build() { return settings; } - } - } diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQL.g4 b/mypages/src/main/java/io/leego/mypages/sql/SQL.g4 new file mode 100644 index 0000000..c2bab95 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQL.g4 @@ -0,0 +1,1933 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is an adaptation of Presto's presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 grammar. + */ + +grammar SQL; + +@parser::members { + /** + * When false, INTERSECT is given the greater precedence over the other set + * operations (UNION, EXCEPT and MINUS) as per the SQL standard. + */ + public boolean legacy_setops_precedence_enabled = false; + + /** + * When false, a literal with an exponent would be converted into + * double type rather than decimal type. + */ + public boolean legacy_exponent_literal_as_decimal_enabled = false; + + /** + * When true, the behavior of keywords follows ANSI SQL standard. + */ + public boolean SQL_standard_keyword_behavior = false; +} + +@lexer::members { + /** + * Verify whether current token is a valid decimal token (which contains dot). + * Returns true if the character that follows the token is not a digit or letter or underscore. + * + * For example: + * For char stream "2.3", "2." is not a valid decimal token, because it is followed by digit '3'. + * For char stream "2.3_", "2.3" is not a valid decimal token, because it is followed by '_'. + * For char stream "2.3W", "2.3" is not a valid decimal token, because it is followed by 'W'. + * For char stream "12.0D 34.E2+0.12 " 12.0D is a valid decimal token because it is followed + * by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' + * which is not a digit or letter or underscore. + */ + public boolean isValidDecimal() { + int nextChar = _input.LA(1); + if (nextChar >= 'A' && nextChar <= 'Z' || nextChar >= '0' && nextChar <= '9' || + nextChar == '_') { + return false; + } else { + return true; + } + } + + /** + * This method will be called when we see '/*' and try to match it as a bracketed comment. + * If the next character is '+', it should be parsed as hint later, and we cannot match + * it as a bracketed comment. + * + * Returns true if the next character is '+'. + */ + public boolean isHint() { + int nextChar = _input.LA(1); + if (nextChar == '+') { + return true; + } else { + return false; + } + } +} + +singleStatement + : statement ';'* EOF + ; + +singleExpression + : namedExpression EOF + ; + +singleTableIdentifier + : tableIdentifier EOF + ; + +singleMultipartIdentifier + : multipartIdentifier EOF + ; + +singleFunctionIdentifier + : functionIdentifier EOF + ; + +singleDataType + : dataType EOF + ; + +singleTableSchema + : colTypeList EOF + ; + +statement + : query #statementDefault + | ctes? dmlStatementNoWith #dmlStatement + | USE NAMESPACE? multipartIdentifier #use + | CREATE namespace (IF NOT EXISTS)? multipartIdentifier + (commentSpec | + locationSpec | + (WITH (DBPROPERTIES | PROPERTIES) tablePropertyList))* #createNamespace + | ALTER namespace multipartIdentifier + SET (DBPROPERTIES | PROPERTIES) tablePropertyList #setNamespaceProperties + | ALTER namespace multipartIdentifier + SET locationSpec #setNamespaceLocation + | DROP namespace (IF EXISTS)? multipartIdentifier + (RESTRICT | CASCADE)? #dropNamespace + | SHOW (DATABASES | NAMESPACES) ((FROM | IN) multipartIdentifier)? + (LIKE? pattern=STRING)? #showNamespaces + | createTableHeader ('(' colTypeList ')')? tableProvider? + createTableClauses + (AS? query)? #createTable + | CREATE TABLE (IF NOT EXISTS)? target=tableIdentifier + LIKE source=tableIdentifier + (tableProvider | + rowFormat | + createFileFormat | + locationSpec | + (TBLPROPERTIES tableProps=tablePropertyList))* #createTableLike + | replaceTableHeader ('(' colTypeList ')')? tableProvider? + createTableClauses + (AS? query)? #replaceTable + | ANALYZE TABLE multipartIdentifier partitionSpec? COMPUTE STATISTICS + (identifier | FOR COLUMNS identifierSeq | FOR ALL COLUMNS)? #analyze + | ANALYZE TABLES ((FROM | IN) multipartIdentifier)? COMPUTE STATISTICS + (identifier)? #analyzeTables + | ALTER TABLE multipartIdentifier + ADD (COLUMN | COLUMNS) + columns=qualifiedColTypeWithPositionList #addTableColumns + | ALTER TABLE multipartIdentifier + ADD (COLUMN | COLUMNS) + '(' columns=qualifiedColTypeWithPositionList ')' #addTableColumns + | ALTER TABLE table=multipartIdentifier + RENAME COLUMN + from=multipartIdentifier TO to=errorCapturingIdentifier #renameTableColumn + | ALTER TABLE multipartIdentifier + DROP (COLUMN | COLUMNS) + '(' columns=multipartIdentifierList ')' #dropTableColumns + | ALTER TABLE multipartIdentifier + DROP (COLUMN | COLUMNS) columns=multipartIdentifierList #dropTableColumns + | ALTER (TABLE | VIEW) from=multipartIdentifier + RENAME TO to=multipartIdentifier #renameTable + | ALTER (TABLE | VIEW) multipartIdentifier + SET TBLPROPERTIES tablePropertyList #setTableProperties + | ALTER (TABLE | VIEW) multipartIdentifier + UNSET TBLPROPERTIES (IF EXISTS)? tablePropertyList #unsetTableProperties + | ALTER TABLE table=multipartIdentifier + (ALTER | CHANGE) COLUMN? column=multipartIdentifier + alterColumnAction? #alterTableAlterColumn + | ALTER TABLE table=multipartIdentifier partitionSpec? + CHANGE COLUMN? + colName=multipartIdentifier colType colPosition? #hiveChangeColumn + | ALTER TABLE table=multipartIdentifier partitionSpec? + REPLACE COLUMNS + '(' columns=qualifiedColTypeWithPositionList ')' #hiveReplaceColumns + | ALTER TABLE multipartIdentifier (partitionSpec)? + SET SERDE STRING (WITH SERDEPROPERTIES tablePropertyList)? #setTableSerDe + | ALTER TABLE multipartIdentifier (partitionSpec)? + SET SERDEPROPERTIES tablePropertyList #setTableSerDe + | ALTER (TABLE | VIEW) multipartIdentifier ADD (IF NOT EXISTS)? + partitionSpecLocation+ #addTablePartition + | ALTER TABLE multipartIdentifier + from=partitionSpec RENAME TO to=partitionSpec #renameTablePartition + | ALTER (TABLE | VIEW) multipartIdentifier + DROP (IF EXISTS)? partitionSpec (',' partitionSpec)* PURGE? #dropTablePartitions + | ALTER TABLE multipartIdentifier + (partitionSpec)? SET locationSpec #setTableLocation + | ALTER TABLE multipartIdentifier RECOVER PARTITIONS #recoverPartitions + | DROP TABLE (IF EXISTS)? multipartIdentifier PURGE? #dropTable + | DROP VIEW (IF EXISTS)? multipartIdentifier #dropView + | CREATE (OR REPLACE)? (GLOBAL? TEMPORARY)? + VIEW (IF NOT EXISTS)? multipartIdentifier + identifierCommentList? + (commentSpec | + (PARTITIONED ON identifierList) | + (TBLPROPERTIES tablePropertyList))* + AS query #createView + | CREATE (OR REPLACE)? GLOBAL? TEMPORARY VIEW + tableIdentifier ('(' colTypeList ')')? tableProvider + (OPTIONS tablePropertyList)? #createTempViewUsing + | ALTER VIEW multipartIdentifier AS? query #alterViewQuery + | CREATE (OR REPLACE)? TEMPORARY? FUNCTION (IF NOT EXISTS)? + multipartIdentifier AS className=STRING + (USING resource (',' resource)*)? #createFunction + | DROP TEMPORARY? FUNCTION (IF EXISTS)? multipartIdentifier #dropFunction + | EXPLAIN (LOGICAL | FORMATTED | EXTENDED | CODEGEN | COST)? + statement #explain + | SHOW TABLES ((FROM | IN) multipartIdentifier)? + (LIKE? pattern=STRING)? #showTables + | SHOW TABLE EXTENDED ((FROM | IN) ns=multipartIdentifier)? + LIKE pattern=STRING partitionSpec? #showTableExtended + | SHOW TBLPROPERTIES table=multipartIdentifier + ('(' key=tablePropertyKey ')')? #showTblProperties + | SHOW COLUMNS (FROM | IN) table=multipartIdentifier + ((FROM | IN) ns=multipartIdentifier)? #showColumns + | SHOW VIEWS ((FROM | IN) multipartIdentifier)? + (LIKE? pattern=STRING)? #showViews + | SHOW PARTITIONS multipartIdentifier partitionSpec? #showPartitions + | SHOW identifier? FUNCTIONS + (LIKE? (multipartIdentifier | pattern=STRING))? #showFunctions + | SHOW CREATE TABLE multipartIdentifier (AS SERDE)? #showCreateTable + | SHOW CURRENT NAMESPACE #showCurrentNamespace + | (DESC | DESCRIBE) FUNCTION EXTENDED? describeFuncName #describeFunction + | (DESC | DESCRIBE) namespace EXTENDED? + multipartIdentifier #describeNamespace + | (DESC | DESCRIBE) TABLE? option=(EXTENDED | FORMATTED)? + multipartIdentifier partitionSpec? describeColName? #describeRelation + | (DESC | DESCRIBE) QUERY? query #describeQuery + | COMMENT ON namespace multipartIdentifier IS + comment=(STRING | NULL) #commentNamespace + | COMMENT ON TABLE multipartIdentifier IS comment=(STRING | NULL) #commentTable + | REFRESH TABLE multipartIdentifier #refreshTable + | REFRESH FUNCTION multipartIdentifier #refreshFunction + | REFRESH (STRING | .*?) #refreshResource + | CACHE LAZY? TABLE multipartIdentifier + (OPTIONS options=tablePropertyList)? (AS? query)? #cacheTable + | UNCACHE TABLE (IF EXISTS)? multipartIdentifier #uncacheTable + | CLEAR CACHE #clearCache + | LOAD DATA LOCAL? INPATH path=STRING OVERWRITE? INTO TABLE + multipartIdentifier partitionSpec? #loadData + | TRUNCATE TABLE multipartIdentifier partitionSpec? #truncateTable + | MSCK REPAIR TABLE multipartIdentifier + (option=(ADD|DROP|SYNC) PARTITIONS)? #repairTable + | op=(ADD | LIST) identifier .*? #manageResource + | SET ROLE .*? #failNativeCommand + | SET TIME ZONE interval #setTimeZone + | SET TIME ZONE timezone=(STRING | LOCAL) #setTimeZone + | SET TIME ZONE .*? #setTimeZone + | SET configKey EQ configValue #setQuotedConfiguration + | SET configKey (EQ .*?)? #setQuotedConfiguration + | SET .*? EQ configValue #setQuotedConfiguration + | SET .*? #setConfiguration + | RESET configKey #resetQuotedConfiguration + | RESET .*? #resetConfiguration + | unsupportedHiveNativeCommands .*? #failNativeCommand + ; + +configKey + : quotedIdentifier + ; + +configValue + : quotedIdentifier + ; + +unsupportedHiveNativeCommands + : kw1=CREATE kw2=ROLE + | kw1=DROP kw2=ROLE + | kw1=GRANT kw2=ROLE? + | kw1=REVOKE kw2=ROLE? + | kw1=SHOW kw2=GRANT + | kw1=SHOW kw2=ROLE kw3=GRANT? + | kw1=SHOW kw2=PRINCIPALS + | kw1=SHOW kw2=ROLES + | kw1=SHOW kw2=CURRENT kw3=ROLES + | kw1=EXPORT kw2=TABLE + | kw1=IMPORT kw2=TABLE + | kw1=SHOW kw2=COMPACTIONS + | kw1=SHOW kw2=CREATE kw3=TABLE + | kw1=SHOW kw2=TRANSACTIONS + | kw1=SHOW kw2=INDEXES + | kw1=SHOW kw2=LOCKS + | kw1=CREATE kw2=INDEX + | kw1=DROP kw2=INDEX + | kw1=ALTER kw2=INDEX + | kw1=LOCK kw2=TABLE + | kw1=LOCK kw2=DATABASE + | kw1=UNLOCK kw2=TABLE + | kw1=UNLOCK kw2=DATABASE + | kw1=CREATE kw2=TEMPORARY kw3=MACRO + | kw1=DROP kw2=TEMPORARY kw3=MACRO + | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=CLUSTERED + | kw1=ALTER kw2=TABLE tableIdentifier kw3=CLUSTERED kw4=BY + | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=SORTED + | kw1=ALTER kw2=TABLE tableIdentifier kw3=SKEWED kw4=BY + | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=SKEWED + | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=STORED kw5=AS kw6=DIRECTORIES + | kw1=ALTER kw2=TABLE tableIdentifier kw3=SET kw4=SKEWED kw5=LOCATION + | kw1=ALTER kw2=TABLE tableIdentifier kw3=EXCHANGE kw4=PARTITION + | kw1=ALTER kw2=TABLE tableIdentifier kw3=ARCHIVE kw4=PARTITION + | kw1=ALTER kw2=TABLE tableIdentifier kw3=UNARCHIVE kw4=PARTITION + | kw1=ALTER kw2=TABLE tableIdentifier kw3=TOUCH + | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=COMPACT + | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=CONCATENATE + | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=SET kw4=FILEFORMAT + | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=REPLACE kw4=COLUMNS + | kw1=START kw2=TRANSACTION + | kw1=COMMIT + | kw1=ROLLBACK + | kw1=DFS + ; + +createTableHeader + : CREATE TEMPORARY? EXTERNAL? TABLE (IF NOT EXISTS)? multipartIdentifier + ; + +replaceTableHeader + : (CREATE OR)? REPLACE TABLE multipartIdentifier + ; + +bucketSpec + : CLUSTERED BY identifierList + (SORTED BY orderedIdentifierList)? + INTO INTEGER_VALUE BUCKETS + ; + +skewSpec + : SKEWED BY identifierList + ON (constantList | nestedConstantList) + (STORED AS DIRECTORIES)? + ; + +locationSpec + : LOCATION STRING + ; + +commentSpec + : COMMENT STRING + ; + +query + : ctes? queryTerm queryOrganization + ; + +insertInto + : INSERT OVERWRITE TABLE? multipartIdentifier (partitionSpec (IF NOT EXISTS)?)? identifierList? #insertOverwriteTable + | INSERT INTO TABLE? multipartIdentifier partitionSpec? (IF NOT EXISTS)? identifierList? #insertIntoTable + | INSERT OVERWRITE LOCAL? DIRECTORY path=STRING rowFormat? createFileFormat? #insertOverwriteHiveDir + | INSERT OVERWRITE LOCAL? DIRECTORY (path=STRING)? tableProvider (OPTIONS options=tablePropertyList)? #insertOverwriteDir + ; + +partitionSpecLocation + : partitionSpec locationSpec? + ; + +partitionSpec + : PARTITION '(' partitionVal (',' partitionVal)* ')' + ; + +partitionVal + : identifier (EQ constant)? + ; + +namespace + : NAMESPACE + | DATABASE + | SCHEMA + ; + +describeFuncName + : qualifiedName + | STRING + | comparisonOperator + | arithmeticOperator + | predicateOperator + ; + +describeColName + : nameParts+=identifier ('.' nameParts+=identifier)* + ; + +ctes + : WITH namedQuery (',' namedQuery)* + ; + +namedQuery + : name=errorCapturingIdentifier (columnAliases=identifierList)? AS? '(' query ')' + ; + +tableProvider + : USING multipartIdentifier + ; + +createTableClauses + :((OPTIONS options=tablePropertyList) | + (PARTITIONED BY partitioning=partitionFieldList) | + skewSpec | + bucketSpec | + rowFormat | + createFileFormat | + locationSpec | + commentSpec | + (TBLPROPERTIES tableProps=tablePropertyList))* + ; + +tablePropertyList + : '(' tableProperty (',' tableProperty)* ')' + ; + +tableProperty + : key=tablePropertyKey (EQ? value=tablePropertyValue)? + ; + +tablePropertyKey + : identifier ('.' identifier)* + | STRING + ; + +tablePropertyValue + : INTEGER_VALUE + | DECIMAL_VALUE + | booleanValue + | STRING + ; + +constantList + : '(' constant (',' constant)* ')' + ; + +nestedConstantList + : '(' constantList (',' constantList)* ')' + ; + +createFileFormat + : STORED AS fileFormat + | STORED BY storageHandler + ; + +fileFormat + : INPUTFORMAT inFmt=STRING OUTPUTFORMAT outFmt=STRING #tableFileFormat + | identifier #genericFileFormat + ; + +storageHandler + : STRING (WITH SERDEPROPERTIES tablePropertyList)? + ; + +resource + : identifier STRING + ; + +dmlStatementNoWith + : insertInto queryTerm queryOrganization #singleInsertQuery + | fromClause multiInsertQueryBody+ #multiInsertQuery + | DELETE FROM multipartIdentifier tableAlias whereClause? #deleteFromTable + | UPDATE multipartIdentifier tableAlias setClause whereClause? #updateTable + | MERGE INTO target=multipartIdentifier targetAlias=tableAlias + USING (source=multipartIdentifier | + '(' sourceQuery=query')') sourceAlias=tableAlias + ON mergeCondition=booleanExpression + matchedClause* + notMatchedClause* #mergeIntoTable + ; + +queryOrganization + : (ORDER BY order+=sortItem (',' order+=sortItem)*)? + (CLUSTER BY clusterBy+=expression (',' clusterBy+=expression)*)? + (DISTRIBUTE BY distributeBy+=expression (',' distributeBy+=expression)*)? + (SORT BY sort+=sortItem (',' sort+=sortItem)*)? + windowClause? + (LIMIT (ALL | limit=limitExpression))? + ; + +multiInsertQueryBody + : insertInto fromStatementBody + ; + +queryTerm + : queryPrimary #queryTermDefault + | left=queryTerm {legacy_setops_precedence_enabled}? + operator=(INTERSECT | UNION | EXCEPT | SETMINUS) setQuantifier? right=queryTerm #setOperation + | left=queryTerm {!legacy_setops_precedence_enabled}? + operator=INTERSECT setQuantifier? right=queryTerm #setOperation + | left=queryTerm {!legacy_setops_precedence_enabled}? + operator=(UNION | EXCEPT | SETMINUS) setQuantifier? right=queryTerm #setOperation + ; + +queryPrimary + : querySpecification #queryPrimaryDefault + | fromStatement #fromStmt + | TABLE multipartIdentifier #table + | inlineTable #inlineTableDefault1 + | '(' query ')' #subquery + ; + +sortItem + : expression ordering=(ASC | DESC)? (NULLS nullOrder=(LAST | FIRST))? + ; + +fromStatement + : fromClause fromStatementBody+ + ; + +fromStatementBody + : transformClause + whereClause? + queryOrganization + | selectClause + lateralView* + whereClause? + aggregationClause? + havingClause? + windowClause? + queryOrganization + ; + +querySpecification + : transformClause + fromClause? + lateralView* + whereClause? + aggregationClause? + havingClause? + windowClause? #transformQuerySpecification + | selectClause + fromClause? + lateralView* + whereClause? + aggregationClause? + havingClause? + windowClause? #regularQuerySpecification + ; + +transformClause + : (SELECT kind=TRANSFORM '(' setQuantifier? expressionSeq ')' + | kind=MAP setQuantifier? expressionSeq + | kind=REDUCE setQuantifier? expressionSeq) + inRowFormat=rowFormat? + (RECORDWRITER recordWriter=STRING)? + USING script=STRING + (AS (identifierSeq | colTypeList | ('(' (identifierSeq | colTypeList) ')')))? + outRowFormat=rowFormat? + (RECORDREADER recordReader=STRING)? + ; + +selectClause + : SELECT (hints+=hint)* setQuantifier? namedExpressionSeq + ; + +setClause + : SET assignmentList + ; + +matchedClause + : WHEN MATCHED (AND matchedCond=booleanExpression)? THEN matchedAction + ; +notMatchedClause + : WHEN NOT MATCHED (AND notMatchedCond=booleanExpression)? THEN notMatchedAction + ; + +matchedAction + : DELETE + | UPDATE SET ASTERISK + | UPDATE SET assignmentList + ; + +notMatchedAction + : INSERT ASTERISK + | INSERT '(' columns=multipartIdentifierList ')' + VALUES '(' expression (',' expression)* ')' + ; + +assignmentList + : assignment (',' assignment)* + ; + +assignment + : key=multipartIdentifier EQ value=expression + ; + +whereClause + : WHERE booleanExpression + ; + +havingClause + : HAVING booleanExpression + ; + +hint + : '/*+' hintStatements+=hintStatement (','? hintStatements+=hintStatement)* '*/' + ; + +hintStatement + : hintName=identifier + | hintName=identifier '(' parameters+=primaryExpression (',' parameters+=primaryExpression)* ')' + ; + +fromClause + : FROM relation (',' relation)* lateralView* pivotClause? + ; + +aggregationClause + : GROUP BY groupingExpressionsWithGroupingAnalytics+=groupByClause + (',' groupingExpressionsWithGroupingAnalytics+=groupByClause)* + | GROUP BY groupingExpressions+=expression (',' groupingExpressions+=expression)* ( + WITH kind=ROLLUP + | WITH kind=CUBE + | kind=GROUPING SETS '(' groupingSet (',' groupingSet)* ')')? + ; + +groupByClause + : groupingAnalytics + | expression + ; + +groupingAnalytics + : (ROLLUP | CUBE) '(' groupingSet (',' groupingSet)* ')' + | GROUPING SETS '(' groupingElement (',' groupingElement)* ')' + ; + +groupingElement + : groupingAnalytics + | groupingSet + ; + +groupingSet + : '(' (expression (',' expression)*)? ')' + | expression + ; + +pivotClause + : PIVOT '(' aggregates=namedExpressionSeq FOR pivotColumn IN '(' pivotValues+=pivotValue (',' pivotValues+=pivotValue)* ')' ')' + ; + +pivotColumn + : identifiers+=identifier + | '(' identifiers+=identifier (',' identifiers+=identifier)* ')' + ; + +pivotValue + : expression (AS? identifier)? + ; + +lateralView + : LATERAL VIEW (OUTER)? qualifiedName '(' (expression (',' expression)*)? ')' tblName=identifier (AS? colName+=identifier (',' colName+=identifier)*)? + ; + +setQuantifier + : DISTINCT + | ALL + ; + +relation + : LATERAL? relationPrimary joinRelation* + ; + +joinRelation + : (joinType) JOIN LATERAL? right=relationPrimary joinCriteria? + | NATURAL joinType JOIN LATERAL? right=relationPrimary + ; + +joinType + : INNER? + | CROSS + | LEFT OUTER? + | LEFT? SEMI + | RIGHT OUTER? + | FULL OUTER? + | LEFT? ANTI + ; + +joinCriteria + : ON booleanExpression + | USING identifierList + ; + +sample + : TABLESAMPLE '(' sampleMethod? ')' + ; + +sampleMethod + : negativeSign=MINUS? percentage=(INTEGER_VALUE | DECIMAL_VALUE) PERCENTLIT #sampleByPercentile + | expression ROWS #sampleByRows + | sampleType=BUCKET numerator=INTEGER_VALUE OUT OF denominator=INTEGER_VALUE + (ON (identifier | qualifiedName '(' ')'))? #sampleByBucket + | bytes=expression #sampleByBytes + ; + +identifierList + : '(' identifierSeq ')' + ; + +identifierSeq + : ident+=errorCapturingIdentifier (',' ident+=errorCapturingIdentifier)* + ; + +orderedIdentifierList + : '(' orderedIdentifier (',' orderedIdentifier)* ')' + ; + +orderedIdentifier + : ident=errorCapturingIdentifier ordering=(ASC | DESC)? + ; + +identifierCommentList + : '(' identifierComment (',' identifierComment)* ')' + ; + +identifierComment + : identifier commentSpec? + ; + +relationPrimary + : multipartIdentifier sample? tableAlias #tableName + | '(' query ')' sample? tableAlias #aliasedQuery + | '(' relation ')' sample? tableAlias #aliasedRelation + | inlineTable #inlineTableDefault2 + | functionTable #tableValuedFunction + ; + +inlineTable + : VALUES expression (',' expression)* tableAlias + ; + +functionTable + : funcName=functionName '(' (expression (',' expression)*)? ')' tableAlias + ; + +tableAlias + : (AS? strictIdentifier identifierList?)? + ; + +rowFormat + : ROW FORMAT SERDE name=STRING (WITH SERDEPROPERTIES props=tablePropertyList)? #rowFormatSerde + | ROW FORMAT DELIMITED + (FIELDS TERMINATED BY fieldsTerminatedBy=STRING (ESCAPED BY escapedBy=STRING)?)? + (COLLECTION ITEMS TERMINATED BY collectionItemsTerminatedBy=STRING)? + (MAP KEYS TERMINATED BY keysTerminatedBy=STRING)? + (LINES TERMINATED BY linesSeparatedBy=STRING)? + (NULL DEFINED AS nullDefinedAs=STRING)? #rowFormatDelimited + ; + +multipartIdentifierList + : multipartIdentifier (',' multipartIdentifier)* + ; + +multipartIdentifier + : parts+=errorCapturingIdentifier ('.' parts+=errorCapturingIdentifier)* + ; + +tableIdentifier + : (db=errorCapturingIdentifier '.')? table=errorCapturingIdentifier + ; + +functionIdentifier + : (db=errorCapturingIdentifier '.')? function=errorCapturingIdentifier + ; + +namedExpression + : expression (AS? (name=errorCapturingIdentifier | identifierList))? + ; + +namedExpressionSeq + : namedExpression (',' namedExpression)* + ; + +partitionFieldList + : '(' fields+=partitionField (',' fields+=partitionField)* ')' + ; + +partitionField + : transform #partitionTransform + | colType #partitionColumn + ; + +transform + : qualifiedName #identityTransform + | transformName=identifier + '(' argument+=transformArgument (',' argument+=transformArgument)* ')' #applyTransform + ; + +transformArgument + : qualifiedName + | constant + ; + +expression + : booleanExpression + ; + +expressionSeq + : expression (',' expression)* + ; + +booleanExpression + : NOT booleanExpression #logicalNot + | EXISTS '(' query ')' #exists + | valueExpression predicate? #predicated + | left=booleanExpression operator=AND right=booleanExpression #logicalBinary + | left=booleanExpression operator=OR right=booleanExpression #logicalBinary + ; + +predicate + : NOT? kind=BETWEEN lower=valueExpression AND upper=valueExpression + | NOT? kind=IN '(' expression (',' expression)* ')' + | NOT? kind=IN '(' query ')' + | NOT? kind=RLIKE pattern=valueExpression + | NOT? kind=LIKE quantifier=(ANY | SOME | ALL) ('('')' | '(' expression (',' expression)* ')') + | NOT? kind=LIKE pattern=valueExpression (ESCAPE escapeChar=STRING)? + | IS NOT? kind=NULL + | IS NOT? kind=(TRUE | FALSE | UNKNOWN) + | IS NOT? kind=DISTINCT FROM right=valueExpression + ; + +valueExpression + : primaryExpression #valueExpressionDefault + | operator=(MINUS | PLUS | TILDE) valueExpression #arithmeticUnary + | left=valueExpression operator=(ASTERISK | SLASH | PERCENT | DIV) right=valueExpression #arithmeticBinary + | left=valueExpression operator=(PLUS | MINUS | CONCAT_PIPE) right=valueExpression #arithmeticBinary + | left=valueExpression operator=AMPERSAND right=valueExpression #arithmeticBinary + | left=valueExpression operator=HAT right=valueExpression #arithmeticBinary + | left=valueExpression operator=PIPE right=valueExpression #arithmeticBinary + | left=valueExpression comparisonOperator right=valueExpression #comparison + ; + +primaryExpression + : name=(CURRENT_DATE | CURRENT_TIMESTAMP | CURRENT_USER) #currentLike + | CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase + | CASE value=expression whenClause+ (ELSE elseExpression=expression)? END #simpleCase + | name=(CAST | TRY_CAST) '(' expression AS dataType ')' #cast + | STRUCT '(' (argument+=namedExpression (',' argument+=namedExpression)*)? ')' #struct + | FIRST '(' expression (IGNORE NULLS)? ')' #first + | LAST '(' expression (IGNORE NULLS)? ')' #last + | POSITION '(' substr=valueExpression IN str=valueExpression ')' #position + | constant #constantDefault + | ASTERISK #star + | qualifiedName '.' ASTERISK #star + | '(' namedExpression (',' namedExpression)+ ')' #rowConstructor + | '(' query ')' #subqueryExpression + | functionName '(' (setQuantifier? argument+=expression (',' argument+=expression)*)? ')' + (FILTER '(' WHERE where=booleanExpression ')')? + (nullsOption=(IGNORE | RESPECT) NULLS)? ( OVER windowSpec)? #functionCall + | identifier '->' expression #lambda + | '(' identifier (',' identifier)+ ')' '->' expression #lambda + | value=primaryExpression '[' index=valueExpression ']' #subscript + | identifier #columnReference + | base=primaryExpression '.' fieldName=identifier #dereference + | '(' expression ')' #parenthesizedExpression + | EXTRACT '(' field=identifier FROM source=valueExpression ')' #extract + | (SUBSTR | SUBSTRING) '(' str=valueExpression (FROM | ',') pos=valueExpression + ((FOR | ',') len=valueExpression)? ')' #substring + | TRIM '(' trimOption=(BOTH | LEADING | TRAILING)? (trimStr=valueExpression)? + FROM srcStr=valueExpression ')' #trim + | OVERLAY '(' input=valueExpression PLACING replace=valueExpression + FROM position=valueExpression (FOR length=valueExpression)? ')' #overlay + ; + +limitExpression + : (offset=INTEGER_VALUE ',')? rows=INTEGER_VALUE + | rows=INTEGER_VALUE OFFSET offset=INTEGER_VALUE + | booleanExpression + ; + +constant + : NULL #nullLiteral + | interval #intervalLiteral + | identifier STRING #typeConstructor + | number #numericLiteral + | booleanValue #booleanLiteral + | STRING+ #stringLiteral + ; + +comparisonOperator + : EQ | NEQ | NEQJ | LT | LTE | GT | GTE | NSEQ + ; + +arithmeticOperator + : PLUS | MINUS | ASTERISK | SLASH | PERCENT | DIV | TILDE | AMPERSAND | PIPE | CONCAT_PIPE | HAT + ; + +predicateOperator + : OR | AND | IN | NOT + ; + +booleanValue + : TRUE | FALSE + ; + +interval + : INTERVAL (errorCapturingMultiUnitsInterval | errorCapturingUnitToUnitInterval)? + ; + +errorCapturingMultiUnitsInterval + : body=multiUnitsInterval unitToUnitInterval? + ; + +multiUnitsInterval + : (intervalValue unit+=identifier)+ + ; + +errorCapturingUnitToUnitInterval + : body=unitToUnitInterval (error1=multiUnitsInterval | error2=unitToUnitInterval)? + ; + +unitToUnitInterval + : value=intervalValue from=identifier TO to=identifier + ; + +intervalValue + : (PLUS | MINUS)? (INTEGER_VALUE | DECIMAL_VALUE | STRING) + ; + +colPosition + : position=FIRST | position=AFTER afterCol=errorCapturingIdentifier + ; + +dataType + : complex=ARRAY '<' dataType '>' #complexDataType + | complex=MAP '<' dataType ',' dataType '>' #complexDataType + | complex=STRUCT ('<' complexColTypeList? '>' | NEQ) #complexDataType + | INTERVAL from=(YEAR | MONTH) (TO to=MONTH)? #yearMonthIntervalDataType + | INTERVAL from=(DAY | HOUR | MINUTE | SECOND) + (TO to=(HOUR | MINUTE | SECOND))? #dayTimeIntervalDataType + | identifier ('(' INTEGER_VALUE (',' INTEGER_VALUE)* ')')? #primitiveDataType + ; + +qualifiedColTypeWithPositionList + : qualifiedColTypeWithPosition (',' qualifiedColTypeWithPosition)* + ; + +qualifiedColTypeWithPosition + : name=multipartIdentifier dataType (NOT NULL)? commentSpec? colPosition? + ; + +colTypeList + : colType (',' colType)* + ; + +colType + : colName=errorCapturingIdentifier dataType (NOT NULL)? commentSpec? + ; + +complexColTypeList + : complexColType (',' complexColType)* + ; + +complexColType + : identifier ':'? dataType (NOT NULL)? commentSpec? + ; + +whenClause + : WHEN condition=expression THEN result=expression + ; + +windowClause + : WINDOW namedWindow (',' namedWindow)* + ; + +namedWindow + : name=errorCapturingIdentifier AS windowSpec + ; + +windowSpec + : name=errorCapturingIdentifier #windowRef + | '('name=errorCapturingIdentifier')' #windowRef + | '(' + ( CLUSTER BY partition+=expression (',' partition+=expression)* + | ((PARTITION | DISTRIBUTE) BY partition+=expression (',' partition+=expression)*)? + ((ORDER | SORT) BY sortItem (',' sortItem)*)?) + windowFrame? + ')' #windowDef + ; + +windowFrame + : frameType=RANGE start=frameBound + | frameType=ROWS start=frameBound + | frameType=RANGE BETWEEN start=frameBound AND end=frameBound + | frameType=ROWS BETWEEN start=frameBound AND end=frameBound + ; + +frameBound + : UNBOUNDED boundType=(PRECEDING | FOLLOWING) + | boundType=CURRENT ROW + | expression boundType=(PRECEDING | FOLLOWING) + ; + +qualifiedNameList + : qualifiedName (',' qualifiedName)* + ; + +functionName + : qualifiedName + | FILTER + | LEFT + | RIGHT + ; + +qualifiedName + : identifier ('.' identifier)* + ; + +// this rule is used for explicitly capturing wrong identifiers such as test-table, which should actually be `test-table` +// replace identifier with errorCapturingIdentifier where the immediate follow symbol is not an expression, otherwise +// valid expressions such as "a-b" can be recognized as an identifier +errorCapturingIdentifier + : identifier errorCapturingIdentifierExtra + ; + +// extra left-factoring grammar +errorCapturingIdentifierExtra + : (MINUS identifier)+ #errorIdent + | #realIdent + ; + +identifier + : strictIdentifier + | {!SQL_standard_keyword_behavior}? strictNonReserved + ; + +strictIdentifier + : IDENTIFIER #unquotedIdentifier + | quotedIdentifier #quotedIdentifierAlternative + | {SQL_standard_keyword_behavior}? ansiNonReserved #unquotedIdentifier + | {!SQL_standard_keyword_behavior}? nonReserved #unquotedIdentifier + ; + +quotedIdentifier + : BACKQUOTED_IDENTIFIER + ; + +number + : {!legacy_exponent_literal_as_decimal_enabled}? MINUS? EXPONENT_VALUE #exponentLiteral + | {!legacy_exponent_literal_as_decimal_enabled}? MINUS? DECIMAL_VALUE #decimalLiteral + | {legacy_exponent_literal_as_decimal_enabled}? MINUS? (EXPONENT_VALUE | DECIMAL_VALUE) #legacyDecimalLiteral + | MINUS? INTEGER_VALUE #integerLiteral + | MINUS? BIGINT_LITERAL #bigIntLiteral + | MINUS? SMALLINT_LITERAL #smallIntLiteral + | MINUS? TINYINT_LITERAL #tinyIntLiteral + | MINUS? DOUBLE_LITERAL #doubleLiteral + | MINUS? FLOAT_LITERAL #floatLiteral + | MINUS? BIGDECIMAL_LITERAL #bigDecimalLiteral + ; + +alterColumnAction + : TYPE dataType + | commentSpec + | colPosition + | setOrDrop=(SET | DROP) NOT NULL + ; + +// When `SQL_standard_keyword_behavior=true`, there are 2 kinds of keywords in Spark SQL. +// - Reserved keywords: +// Keywords that are reserved and can't be used as identifiers for table, view, column, +// function, alias, etc. +// - Non-reserved keywords: +// Keywords that have a special meaning only in particular contexts and can be used as +// identifiers in other contexts. For example, `EXPLAIN SELECT ...` is a command, but EXPLAIN +// can be used as identifiers in other places. +// You can find the full keywords list by searching "Start of the keywords list" in this file. +// The non-reserved keywords are listed below. Keywords not in this list are reserved keywords. +ansiNonReserved +//--ANSI-NON-RESERVED-START + : ADD + | AFTER + | ALTER + | ANALYZE + | ANTI + | ARCHIVE + | ARRAY + | ASC + | AT + | BETWEEN + | BUCKET + | BUCKETS + | BY + | CACHE + | CASCADE + | CHANGE + | CLEAR + | CLUSTER + | CLUSTERED + | CODEGEN + | COLLECTION + | COLUMNS + | COMMENT + | COMMIT + | COMPACT + | COMPACTIONS + | COMPUTE + | CONCATENATE + | COST + | CUBE + | CURRENT + | DATA + | DATABASE + | DATABASES + | DAY + | DBPROPERTIES + | DEFINED + | DELETE + | DELIMITED + | DESC + | DESCRIBE + | DFS + | DIRECTORIES + | DIRECTORY + | DISTRIBUTE + | DIV + | DROP + | ESCAPED + | EXCHANGE + | EXISTS + | EXPLAIN + | EXPORT + | EXTENDED + | EXTERNAL + | EXTRACT + | FIELDS + | FILEFORMAT + | FIRST + | FOLLOWING + | FORMAT + | FORMATTED + | FUNCTION + | FUNCTIONS + | GLOBAL + | GROUPING + | HOUR + | IF + | IGNORE + | IMPORT + | INDEX + | INDEXES + | INPATH + | INPUTFORMAT + | INSERT + | INTERVAL + | ITEMS + | KEYS + | LAST + | LAZY + | LIKE + | LIMIT + | LINES + | LIST + | LOAD + | LOCAL + | LOCATION + | LOCK + | LOCKS + | LOGICAL + | MACRO + | MAP + | MATCHED + | MERGE + | MINUTE + | MONTH + | MSCK + | NAMESPACE + | NAMESPACES + | NO + | NULLS + | OF + | OPTION + | OPTIONS + | OUT + | OUTPUTFORMAT + | OVER + | OVERLAY + | OVERWRITE + | PARTITION + | PARTITIONED + | PARTITIONS + | PERCENTLIT + | PIVOT + | PLACING + | POSITION + | PRECEDING + | PRINCIPALS + | PROPERTIES + | PURGE + | QUERY + | RANGE + | RECORDREADER + | RECORDWRITER + | RECOVER + | REDUCE + | REFRESH + | RENAME + | REPAIR + | REPLACE + | RESET + | RESPECT + | RESTRICT + | REVOKE + | RLIKE + | ROLE + | ROLES + | ROLLBACK + | ROLLUP + | ROW + | ROWS + | SCHEMA + | SECOND + | SEMI + | SEPARATED + | SERDE + | SERDEPROPERTIES + | SET + | SETMINUS + | SETS + | SHOW + | SKEWED + | SORT + | SORTED + | START + | STATISTICS + | STORED + | STRATIFY + | STRUCT + | SUBSTR + | SUBSTRING + | SYNC + | TABLES + | TABLESAMPLE + | TBLPROPERTIES + | TEMPORARY + | TERMINATED + | TOUCH + | TRANSACTION + | TRANSACTIONS + | TRANSFORM + | TRIM + | TRUE + | TRUNCATE + | TRY_CAST + | TYPE + | UNARCHIVE + | UNBOUNDED + | UNCACHE + | UNLOCK + | UNSET + | UPDATE + | USE + | VALUES + | VIEW + | VIEWS + | WINDOW + | YEAR + | ZONE +//--ANSI-NON-RESERVED-END + ; + +// When `SQL_standard_keyword_behavior=false`, there are 2 kinds of keywords in Spark SQL. +// - Non-reserved keywords: +// Same definition as the one when `SQL_standard_keyword_behavior=true`. +// - Strict-non-reserved keywords: +// A strict version of non-reserved keywords, which can not be used as table alias. +// You can find the full keywords list by searching "Start of the keywords list" in this file. +// The strict-non-reserved keywords are listed in `strictNonReserved`. +// The non-reserved keywords are listed in `nonReserved`. +// These 2 together contain all the keywords. +strictNonReserved + : ANTI + | CROSS + | EXCEPT + | FULL + | INNER + | INTERSECT + | JOIN + | LATERAL + | LEFT + | NATURAL + | ON + | RIGHT + | SEMI + | SETMINUS + | UNION + | USING + ; + +nonReserved +//--DEFAULT-NON-RESERVED-START + : ADD + | AFTER + | ALL + | ALTER + | ANALYZE + | AND + | ANY + | ARCHIVE + | ARRAY + | AS + | ASC + | AT + | AUTHORIZATION + | BETWEEN + | BOTH + | BUCKET + | BUCKETS + | BY + | CACHE + | CASCADE + | CASE + | CAST + | CHANGE + | CHECK + | CLEAR + | CLUSTER + | CLUSTERED + | CODEGEN + | COLLATE + | COLLECTION + | COLUMN + | COLUMNS + | COMMENT + | COMMIT + | COMPACT + | COMPACTIONS + | COMPUTE + | CONCATENATE + | CONSTRAINT + | COST + | CREATE + | CUBE + | CURRENT + | CURRENT_DATE + | CURRENT_TIME + | CURRENT_TIMESTAMP + | CURRENT_USER + | DATA + | DATABASE + | DATABASES + | DAY + | DBPROPERTIES + | DEFINED + | DELETE + | DELIMITED + | DESC + | DESCRIBE + | DFS + | DIRECTORIES + | DIRECTORY + | DISTINCT + | DISTRIBUTE + | DIV + | DROP + | ELSE + | END + | ESCAPE + | ESCAPED + | EXCHANGE + | EXISTS + | EXPLAIN + | EXPORT + | EXTENDED + | EXTERNAL + | EXTRACT + | FALSE + | FETCH + | FILTER + | FIELDS + | FILEFORMAT + | FIRST + | FOLLOWING + | FOR + | FOREIGN + | FORMAT + | FORMATTED + | FROM + | FUNCTION + | FUNCTIONS + | GLOBAL + | GRANT + | GROUP + | GROUPING + | HAVING + | HOUR + | IF + | IGNORE + | IMPORT + | IN + | INDEX + | INDEXES + | INPATH + | INPUTFORMAT + | INSERT + | INTERVAL + | INTO + | IS + | ITEMS + | KEYS + | LAST + | LAZY + | LEADING + | LIKE + | LIMIT + | LINES + | LIST + | LOAD + | LOCAL + | LOCATION + | LOCK + | LOCKS + | LOGICAL + | MACRO + | MAP + | MATCHED + | MERGE + | MINUTE + | MONTH + | MSCK + | NAMESPACE + | NAMESPACES + | NO + | NOT + | NULL + | NULLS + | OF + | OFFSET + | ONLY + | OPTION + | OPTIONS + | OR + | ORDER + | OUT + | OUTER + | OUTPUTFORMAT + | OVER + | OVERLAPS + | OVERLAY + | OVERWRITE + | PARTITION + | PARTITIONED + | PARTITIONS + | PERCENTLIT + | PIVOT + | PLACING + | POSITION + | PRECEDING + | PRIMARY + | PRINCIPALS + | PROPERTIES + | PURGE + | QUERY + | RANGE + | RECORDREADER + | RECORDWRITER + | RECOVER + | REDUCE + | REFERENCES + | REFRESH + | RENAME + | REPAIR + | REPLACE + | RESET + | RESPECT + | RESTRICT + | REVOKE + | RLIKE + | ROLE + | ROLES + | ROLLBACK + | ROLLUP + | ROW + | ROWS + | SCHEMA + | SECOND + | SELECT + | SEPARATED + | SERDE + | SERDEPROPERTIES + | SESSION_USER + | SET + | SETS + | SHOW + | SKEWED + | SOME + | SORT + | SORTED + | START + | STATISTICS + | STORED + | STRATIFY + | STRUCT + | SUBSTR + | SUBSTRING + | SYNC + | TABLE + | TABLES + | TABLESAMPLE + | TBLPROPERTIES + | TEMPORARY + | TERMINATED + | THEN + | TIME + | TO + | TOUCH + | TRAILING + | TRANSACTION + | TRANSACTIONS + | TRANSFORM + | TRIM + | TRUE + | TRUNCATE + | TRY_CAST + | TYPE + | UNARCHIVE + | UNBOUNDED + | UNCACHE + | UNIQUE + | UNKNOWN + | UNLOCK + | UNSET + | UPDATE + | USE + | USER + | VALUES + | VIEW + | VIEWS + | WHEN + | WHERE + | WINDOW + | WITH + | YEAR + | ZONE +//--DEFAULT-NON-RESERVED-END + ; + +// NOTE: If you add a new token in the list below, you should update the list of keywords +// and reserved tag in `docs/sql-ref-ansi-compliance.md#sql-keywords`. + +//============================ +// Start of the keywords list +//============================ +//--SPARK-KEYWORD-LIST-START +ADD: A D D; +AFTER: A F T E R; +ALL: A L L; +ALTER: A L T E R; +ANALYZE: A N A L Y Z E; +AND: A N D; +ANTI: A N T I; +ANY: A N Y; +ARCHIVE: A R C H I V E; +ARRAY: A R R A Y; +AS: A S; +ASC: A S C; +AT: A T; +AUTHORIZATION: A U T H O R I Z A T I O N; +BETWEEN: B E T W E E N; +BOTH: B O T H; +BUCKET: B U C K E T; +BUCKETS: B U C K E T S; +BY: B Y; +CACHE: C A C H E; +CASCADE: C A S C A D E; +CASE: C A S E; +CAST: C A S T; +CHANGE: C H A N G E; +CHECK: C H E C K; +CLEAR: C L E A R; +CLUSTER: C L U S T E R; +CLUSTERED: C L U S T E R E D; +CODEGEN: C O D E G E N; +COLLATE: C O L L A T E; +COLLECTION: C O L L E C T I O N; +COLUMN: C O L U M N; +COLUMNS: C O L U M N S; +COMMENT: C O M M E N T; +COMMIT: C O M M I T; +COMPACT: C O M P A C T; +COMPACTIONS: C O M P A C T I O N S; +COMPUTE: C O M P U T E; +CONCATENATE: C O N C A T E N A T E; +CONSTRAINT: C O N S T R A I N T; +COST: C O S T; +CREATE: C R E A T E; +CROSS: C R O S S; +CUBE: C U B E; +CURRENT: C U R R E N T; +CURRENT_DATE: C U R R E N T UNDERSCORE D A T E; +CURRENT_TIME: C U R R E N T UNDERSCORE T I M E; +CURRENT_TIMESTAMP: C U R R E N T UNDERSCORE T I M E S T A M P; +CURRENT_USER: C U R R E N T UNDERSCORE U S E R; +DAY: D A Y; +DATA: D A T A; +DATABASE: D A T A B A S E; +DATABASES: D A T A B A S E S | S C H E M A S; +DBPROPERTIES: D B P R O P E R T I E S; +DEFINED: D E F I N E D; +DELETE: D E L E T E; +DELIMITED: D E L I M I T E D; +DESC: D E S C; +DESCRIBE: D E S C R I B E; +DFS: D F S; +DIRECTORIES: D I R E C T O R I E S; +DIRECTORY: D I R E C T O R Y; +DISTINCT: D I S T I N C T; +DISTRIBUTE: D I S T R I B U T E; +DIV: D I V; +DROP: D R O P; +ELSE: E L S E; +END: E N D; +ESCAPE: E S C A P E; +ESCAPED: E S C A P E D; +EXCEPT: E X C E P T; +EXCHANGE: E X C H A N G E; +EXISTS: E X I S T S; +EXPLAIN: E X P L A I N; +EXPORT: E X P O R T; +EXTENDED: E X T E N D E D; +EXTERNAL: E X T E R N A L; +EXTRACT: E X T R A C T; +FALSE: F A L S E; +FETCH: F E T C H; +FIELDS: F I E L D S; +FILTER: F I L T E R; +FILEFORMAT: F I L E F O R M A T; +FIRST: F I R S T; +FOLLOWING: F O L L O W I N G; +FOR: F O R; +FOREIGN: F O R E I G N; +FORMAT: F O R M A T; +FORMATTED: F O R M A T T E D; +FROM: F R O M; +FULL: F U L L; +FUNCTION: F U N C T I O N; +FUNCTIONS: F U N C T I O N S; +GLOBAL: G L O B A L; +GRANT: G R A N T; +GROUP: G R O U P; +GROUPING: G R O U P I N G; +HAVING: H A V I N G; +HOUR: H O U R; +IF: I F; +IGNORE: I G N O R E; +IMPORT: I M P O R T; +IN: I N; +INDEX: I N D E X; +INDEXES: I N D E X E S; +INNER: I N N E R; +INPATH: I N P A T H; +INPUTFORMAT: I N P U T F O R M A T; +INSERT: I N S E R T; +INTERSECT: I N T E R S E C T; +INTERVAL: I N T E R V A L; +INTO: I N T O; +IS: I S; +ITEMS: I T E M S; +JOIN: J O I N; +KEYS: K E Y S; +LAST: L A S T; +LATERAL: L A T E R A L; +LAZY: L A Z Y; +LEADING: L E A D I N G; +LEFT: L E F T; +LIKE: L I K E; +LIMIT: L I M I T; +LINES: L I N E S; +LIST: L I S T; +LOAD: L O A D; +LOCAL: L O C A L; +LOCATION: L O C A T I O N; +LOCK: L O C K; +LOCKS: L O C K S; +LOGICAL: L O G I C A L; +MACRO: M A C R O; +MAP: M A P; +MATCHED: M A T C H E D; +MERGE: M E R G E; +MINUTE: M I N U T E; +MONTH: M O N T H; +MSCK: M S C K; +NAMESPACE: N A M E S P A C E; +NAMESPACES: N A M E S P A C E S; +NATURAL: N A T U R A L; +NO: N O; +NOT: N O T | EXCLAMATION; +NULL: N U L L; +NULLS: N U L L S; +OF: O F; +OFFSET: O F F S E T; +ON: O N; +ONLY: O N L Y; +OPTION: O P T I O N; +OPTIONS: O P T I O N S; +OR: O R; +ORDER: O R D E R; +OUT: O U T; +OUTER: O U T E R; +OUTPUTFORMAT: O U T P U T F O R M A T; +OVER: O V E R; +OVERLAPS: O V E R L A P S; +OVERLAY: O V E R L A Y; +OVERWRITE: O V E R W R I T E; +PARTITION: P A R T I T I O N; +PARTITIONED: P A R T I T I O N E D; +PARTITIONS: P A R T I T I O N S; +PERCENTLIT: P E R C E N T; +PIVOT: P I V O T; +PLACING: P L A C I N G; +POSITION: P O S I T I O N; +PRECEDING: P R E C E D I N G; +PRIMARY: P R I M A R Y; +PRINCIPALS: P R I N C I P A L S; +PROPERTIES: P R O P E R T I E S; +PURGE: P U R G E; +QUERY: Q U E R Y; +RANGE: R A N G E; +RECORDREADER: R E C O R D R E A D E R; +RECORDWRITER: R E C O R D W R I T E R; +RECOVER: R E C O V E R; +REDUCE: R E D U C E; +REFERENCES: R E F E R E N C E S; +REFRESH: R E F R E S H; +RENAME: R E N A M E; +REPAIR: R E P A I R; +REPLACE: R E P L A C E; +RESET: R E S E T; +RESPECT: R E S P E C T; +RESTRICT: R E S T R I C T; +REVOKE: R E V O K E; +RIGHT: R I G H T; +RLIKE: R L I K E | R E G E X P; +ROLE: R O L E; +ROLES: R O L E S; +ROLLBACK: R O L L B A C K; +ROLLUP: R O L L U P; +ROW: R O W; +ROWS: R O W S; +SECOND: S E C O N D; +SCHEMA: S C H E M A; +SELECT: S E L E C T; +SEMI: S E M I; +SEPARATED: S E P A R A T E D; +SERDE: S E R D E; +SERDEPROPERTIES: S E R D E P R O P E R T I E S; +SESSION_USER: S E S S I O N UNDERSCORE U S E R; +SET: S E T; +SETMINUS: M I N U S; +SETS: S E T S; +SHOW: S H O W; +SKEWED: S K E W E D; +SOME: S O M E; +SORT: S O R T; +SORTED: S O R T E D; +START: S T A R T; +STATISTICS: S T A T I S T I C S; +STORED: S T O R E D; +STRATIFY: S T R A T I F Y; +STRUCT: S T R U C T; +SUBSTR: S U B S T R; +SUBSTRING: S U B S T R I N G; +SYNC: S Y N C; +TABLE: T A B L E; +TABLES: T A B L E S; +TABLESAMPLE: T A B L E S A M P L E; +TBLPROPERTIES: T B L P R O P E R T I E S; +TEMPORARY: T E M P O R A R Y | T E M P; +TERMINATED: T E R M I N A T E D; +THEN: T H E N; +TIME: T I M E; +TO: T O; +TOUCH: T O U C H; +TRAILING: T R A I L I N G; +TRANSACTION: T R A N S A C T I O N; +TRANSACTIONS: T R A N S A C T I O N S; +TRANSFORM: T R A N S F O R M; +TRIM: T R I M; +TRUE: T R U E; +TRUNCATE: T R U N C A T E; +TRY_CAST: T R Y UNDERSCORE C A S T; +TYPE: T Y P E; +UNARCHIVE: U N A R C H I V E; +UNBOUNDED: U N B O U N D E D; +UNCACHE: U N C A C H E; +UNION: U N I O N; +UNIQUE: U N I Q U E; +UNKNOWN: U N K N O W N; +UNLOCK: U N L O C K; +UNSET: U N S E T; +UPDATE: U P D A T E; +USE: U S E; +USER: U S E R; +USING: U S I N G; +VALUES: V A L U E S; +VIEW: V I E W; +VIEWS: V I E W S; +WHEN: W H E N; +WHERE: W H E R E; +WINDOW: W I N D O W; +WITH: W I T H; +YEAR: Y E A R; +ZONE: Z O N E; +//--SPARK-KEYWORD-LIST-END +//============================ +// End of the keywords list +//============================ + +EQ : '=' | '=='; +NSEQ: '<=>'; +NEQ : '<>'; +NEQJ: '!='; +LT : '<'; +LTE : '<=' | '!>'; +GT : '>'; +GTE : '>=' | '!<'; + +PLUS: '+'; +MINUS: '-'; +ASTERISK: '*'; +SLASH: '/'; +PERCENT: '%'; +TILDE: '~'; +AMPERSAND: '&'; +PIPE: '|'; +CONCAT_PIPE: '||'; +HAT: '^'; +UNDERSCORE: '_'; +EXCLAMATION: '!'; +POINT: '.'; +COMMA: ','; +COLON: ':'; +SEMICOLON: ';'; + +STRING + : '\'' ( ~('\''|'\\') | ('\\' .) )* '\'' + | '"' ( ~('"'|'\\') | ('\\' .) )* '"' + ; + +BIGINT_LITERAL + : DIGIT+ 'L' + ; + +SMALLINT_LITERAL + : DIGIT+ 'S' + ; + +TINYINT_LITERAL + : DIGIT+ 'Y' + ; + +INTEGER_VALUE + : DIGIT+ + ; + +EXPONENT_VALUE + : DIGIT+ EXPONENT + | DECIMAL_DIGITS EXPONENT {isValidDecimal()}? + ; + +DECIMAL_VALUE + : DECIMAL_DIGITS {isValidDecimal()}? + ; + +FLOAT_LITERAL + : DIGIT+ EXPONENT? 'F' + | DECIMAL_DIGITS EXPONENT? 'F' {isValidDecimal()}? + ; + +DOUBLE_LITERAL + : DIGIT+ EXPONENT? 'D' + | DECIMAL_DIGITS EXPONENT? 'D' {isValidDecimal()}? + ; + +BIGDECIMAL_LITERAL + : DIGIT+ EXPONENT? 'BD' + | DECIMAL_DIGITS EXPONENT? 'BD' {isValidDecimal()}? + ; + +IDENTIFIER + : (LETTER | DIGIT | '_')+ + ; + +BACKQUOTED_IDENTIFIER + : '`' ( ~'`' | '``' )* '`' + ; + +fragment DECIMAL_DIGITS + : DIGIT+ '.' DIGIT* + | '.' DIGIT+ + ; + +fragment EXPONENT + : 'E' [+-]? DIGIT+ + ; + +fragment DIGIT + : [0-9] + ; + +fragment LETTER + : [A-Za-z] + ; + +fragment A : [aA]; +fragment B : [bB]; +fragment C : [cC]; +fragment D : [dD]; +fragment E : [eE]; +fragment F : [fF]; +fragment G : [gG]; +fragment H : [hH]; +fragment I : [iI]; +fragment J : [jJ]; +fragment K : [kK]; +fragment L : [lL]; +fragment M : [mM]; +fragment N : [nN]; +fragment O : [oO]; +fragment P : [pP]; +fragment Q : [qQ]; +fragment R : [rR]; +fragment S : [sS]; +fragment T : [tT]; +fragment U : [uU]; +fragment V : [vV]; +fragment W : [wW]; +fragment X : [xX]; +fragment Y : [yY]; +fragment Z : [zZ]; + +SIMPLE_COMMENT + : '--' ('\\\n' | ~[\r\n])* '\r'? '\n'? -> channel(HIDDEN) + ; + +BRACKETED_COMMENT + : '/*' {!isHint()}? (BRACKETED_COMMENT|.)*? '*/' -> channel(HIDDEN) + ; + +WS + : [ \r\n\t]+ -> channel(HIDDEN) + ; + +// Catch-all for anything we can't recognize. +// We use this to be able to ignore and recover all the text +// when splitting statements with DelimiterLexer +UNRECOGNIZED + : . + ; diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQL.interp b/mypages/src/main/java/io/leego/mypages/sql/SQL.interp new file mode 100644 index 0000000..fd58dae --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQL.interp @@ -0,0 +1,767 @@ +token literal names: +null +'(' +')' +'/*+' +'*/' +'->' +'[' +']' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +'<=>' +'<>' +'!=' +'<' +null +'>' +null +'+' +'-' +'*' +'/' +'%' +'~' +'&' +'|' +'||' +'^' +'_' +'!' +'.' +',' +':' +';' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +ADD +AFTER +ALL +ALTER +ANALYZE +AND +ANTI +ANY +ARCHIVE +ARRAY +AS +ASC +AT +AUTHORIZATION +BETWEEN +BOTH +BUCKET +BUCKETS +BY +CACHE +CASCADE +CASE +CAST +CHANGE +CHECK +CLEAR +CLUSTER +CLUSTERED +CODEGEN +COLLATE +COLLECTION +COLUMN +COLUMNS +COMMENT +COMMIT +COMPACT +COMPACTIONS +COMPUTE +CONCATENATE +CONSTRAINT +COST +CREATE +CROSS +CUBE +CURRENT +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +CURRENT_USER +DAY +DATA +DATABASE +DATABASES +DBPROPERTIES +DEFINED +DELETE +DELIMITED +DESC +DESCRIBE +DFS +DIRECTORIES +DIRECTORY +DISTINCT +DISTRIBUTE +DIV +DROP +ELSE +END +ESCAPE +ESCAPED +EXCEPT +EXCHANGE +EXISTS +EXPLAIN +EXPORT +EXTENDED +EXTERNAL +EXTRACT +FALSE +FETCH +FIELDS +FILTER +FILEFORMAT +FIRST +FOLLOWING +FOR +FOREIGN +FORMAT +FORMATTED +FROM +FULL +FUNCTION +FUNCTIONS +GLOBAL +GRANT +GROUP +GROUPING +HAVING +HOUR +IF +IGNORE +IMPORT +IN +INDEX +INDEXES +INNER +INPATH +INPUTFORMAT +INSERT +INTERSECT +INTERVAL +INTO +IS +ITEMS +JOIN +KEYS +LAST +LATERAL +LAZY +LEADING +LEFT +LIKE +LIMIT +LINES +LIST +LOAD +LOCAL +LOCATION +LOCK +LOCKS +LOGICAL +MACRO +MAP +MATCHED +MERGE +MINUTE +MONTH +MSCK +NAMESPACE +NAMESPACES +NATURAL +NO +NOT +NULL +NULLS +OF +OFFSET +ON +ONLY +OPTION +OPTIONS +OR +ORDER +OUT +OUTER +OUTPUTFORMAT +OVER +OVERLAPS +OVERLAY +OVERWRITE +PARTITION +PARTITIONED +PARTITIONS +PERCENTLIT +PIVOT +PLACING +POSITION +PRECEDING +PRIMARY +PRINCIPALS +PROPERTIES +PURGE +QUERY +RANGE +RECORDREADER +RECORDWRITER +RECOVER +REDUCE +REFERENCES +REFRESH +RENAME +REPAIR +REPLACE +RESET +RESPECT +RESTRICT +REVOKE +RIGHT +RLIKE +ROLE +ROLES +ROLLBACK +ROLLUP +ROW +ROWS +SECOND +SCHEMA +SELECT +SEMI +SEPARATED +SERDE +SERDEPROPERTIES +SESSION_USER +SET +SETMINUS +SETS +SHOW +SKEWED +SOME +SORT +SORTED +START +STATISTICS +STORED +STRATIFY +STRUCT +SUBSTR +SUBSTRING +SYNC +TABLE +TABLES +TABLESAMPLE +TBLPROPERTIES +TEMPORARY +TERMINATED +THEN +TIME +TO +TOUCH +TRAILING +TRANSACTION +TRANSACTIONS +TRANSFORM +TRIM +TRUE +TRUNCATE +TRY_CAST +TYPE +UNARCHIVE +UNBOUNDED +UNCACHE +UNION +UNIQUE +UNKNOWN +UNLOCK +UNSET +UPDATE +USE +USER +USING +VALUES +VIEW +VIEWS +WHEN +WHERE +WINDOW +WITH +YEAR +ZONE +EQ +NSEQ +NEQ +NEQJ +LT +LTE +GT +GTE +PLUS +MINUS +ASTERISK +SLASH +PERCENT +TILDE +AMPERSAND +PIPE +CONCAT_PIPE +HAT +UNDERSCORE +EXCLAMATION +POINT +COMMA +COLON +SEMICOLON +STRING +BIGINT_LITERAL +SMALLINT_LITERAL +TINYINT_LITERAL +INTEGER_VALUE +EXPONENT_VALUE +DECIMAL_VALUE +FLOAT_LITERAL +DOUBLE_LITERAL +BIGDECIMAL_LITERAL +IDENTIFIER +BACKQUOTED_IDENTIFIER +SIMPLE_COMMENT +BRACKETED_COMMENT +WS +UNRECOGNIZED + +rule names: +singleStatement +singleExpression +singleTableIdentifier +singleMultipartIdentifier +singleFunctionIdentifier +singleDataType +singleTableSchema +statement +configKey +configValue +unsupportedHiveNativeCommands +createTableHeader +replaceTableHeader +bucketSpec +skewSpec +locationSpec +commentSpec +query +insertInto +partitionSpecLocation +partitionSpec +partitionVal +namespace +describeFuncName +describeColName +ctes +namedQuery +tableProvider +createTableClauses +tablePropertyList +tableProperty +tablePropertyKey +tablePropertyValue +constantList +nestedConstantList +createFileFormat +fileFormat +storageHandler +resource +dmlStatementNoWith +queryOrganization +multiInsertQueryBody +queryTerm +queryPrimary +sortItem +fromStatement +fromStatementBody +querySpecification +transformClause +selectClause +setClause +matchedClause +notMatchedClause +matchedAction +notMatchedAction +assignmentList +assignment +whereClause +havingClause +hint +hintStatement +fromClause +aggregationClause +groupByClause +groupingAnalytics +groupingElement +groupingSet +pivotClause +pivotColumn +pivotValue +lateralView +setQuantifier +relation +joinRelation +joinType +joinCriteria +sample +sampleMethod +identifierList +identifierSeq +orderedIdentifierList +orderedIdentifier +identifierCommentList +identifierComment +relationPrimary +inlineTable +functionTable +tableAlias +rowFormat +multipartIdentifierList +multipartIdentifier +tableIdentifier +functionIdentifier +namedExpression +namedExpressionSeq +partitionFieldList +partitionField +transform +transformArgument +expression +expressionSeq +booleanExpression +predicate +valueExpression +primaryExpression +limitExpression +constant +comparisonOperator +arithmeticOperator +predicateOperator +booleanValue +interval +errorCapturingMultiUnitsInterval +multiUnitsInterval +errorCapturingUnitToUnitInterval +unitToUnitInterval +intervalValue +colPosition +dataType +qualifiedColTypeWithPositionList +qualifiedColTypeWithPosition +colTypeList +colType +complexColTypeList +complexColType +whenClause +windowClause +namedWindow +windowSpec +windowFrame +frameBound +qualifiedNameList +functionName +qualifiedName +errorCapturingIdentifier +errorCapturingIdentifierExtra +identifier +strictIdentifier +quotedIdentifier +number +alterColumnAction +ansiNonReserved +strictNonReserved +nonReserved + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 308, 3157, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 3, 2, 3, 2, 7, 2, 293, 10, 2, 12, 2, 14, 2, 296, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 5, 9, 320, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 325, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 333, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 341, 10, 9, 12, 9, 14, 9, 344, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 363, 10, 9, 3, 9, 3, 9, 5, 9, 367, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 373, 10, 9, 3, 9, 5, 9, 376, 10, 9, 3, 9, 5, 9, 379, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 386, 10, 9, 3, 9, 5, 9, 389, 10, 9, 3, 9, 3, 9, 5, 9, 393, 10, 9, 3, 9, 5, 9, 396, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 403, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 414, 10, 9, 12, 9, 14, 9, 417, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 424, 10, 9, 3, 9, 5, 9, 427, 10, 9, 3, 9, 3, 9, 5, 9, 431, 10, 9, 3, 9, 5, 9, 434, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 440, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 451, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 457, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 462, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 526, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 535, 10, 9, 3, 9, 3, 9, 5, 9, 539, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 545, 10, 9, 3, 9, 3, 9, 5, 9, 549, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 554, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 560, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 572, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 580, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 586, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 599, 10, 9, 3, 9, 6, 9, 602, 10, 9, 13, 9, 14, 9, 603, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 620, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 625, 10, 9, 12, 9, 14, 9, 628, 11, 9, 3, 9, 5, 9, 631, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 637, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 652, 10, 9, 3, 9, 3, 9, 5, 9, 656, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 662, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 668, 10, 9, 3, 9, 5, 9, 671, 10, 9, 3, 9, 5, 9, 674, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 680, 10, 9, 3, 9, 3, 9, 5, 9, 684, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 692, 10, 9, 12, 9, 14, 9, 695, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 703, 10, 9, 3, 9, 5, 9, 706, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 715, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 720, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 726, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 733, 10, 9, 3, 9, 5, 9, 736, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 742, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 751, 10, 9, 12, 9, 14, 9, 754, 11, 9, 5, 9, 756, 10, 9, 3, 9, 3, 9, 5, 9, 760, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 765, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 770, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 777, 10, 9, 3, 9, 5, 9, 780, 10, 9, 3, 9, 5, 9, 783, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 790, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 795, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 804, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 812, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 818, 10, 9, 3, 9, 5, 9, 821, 10, 9, 3, 9, 5, 9, 824, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 830, 10, 9, 3, 9, 3, 9, 5, 9, 834, 10, 9, 3, 9, 3, 9, 5, 9, 838, 10, 9, 3, 9, 3, 9, 5, 9, 842, 10, 9, 5, 9, 844, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 852, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 860, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 866, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 872, 10, 9, 3, 9, 5, 9, 875, 10, 9, 3, 9, 3, 9, 5, 9, 879, 10, 9, 3, 9, 5, 9, 882, 10, 9, 3, 9, 3, 9, 5, 9, 886, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 912, 10, 9, 12, 9, 14, 9, 915, 11, 9, 5, 9, 917, 10, 9, 3, 9, 3, 9, 5, 9, 921, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 927, 10, 9, 3, 9, 5, 9, 930, 10, 9, 3, 9, 5, 9, 933, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 939, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 947, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 952, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 958, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 964, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 972, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 977, 10, 9, 12, 9, 14, 9, 980, 11, 9, 3, 9, 3, 9, 3, 9, 7, 9, 985, 10, 9, 12, 9, 14, 9, 988, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 1002, 10, 9, 12, 9, 14, 9, 1005, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 1016, 10, 9, 12, 9, 14, 9, 1019, 11, 9, 5, 9, 1021, 10, 9, 3, 9, 3, 9, 7, 9, 1025, 10, 9, 12, 9, 14, 9, 1028, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 1034, 10, 9, 12, 9, 14, 9, 1037, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 1043, 10, 9, 12, 9, 14, 9, 1046, 11, 9, 3, 9, 3, 9, 7, 9, 1050, 10, 9, 12, 9, 14, 9, 1053, 11, 9, 5, 9, 1055, 10, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 1067, 10, 12, 3, 12, 3, 12, 5, 12, 1071, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 1078, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 1194, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 1202, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 1210, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 1219, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 1229, 10, 12, 3, 13, 3, 13, 5, 13, 1233, 10, 13, 3, 13, 5, 13, 1236, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 1242, 10, 13, 3, 13, 3, 13, 3, 14, 3, 14, 5, 14, 1248, 10, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 1260, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 1272, 10, 16, 3, 16, 3, 16, 3, 16, 5, 16, 1277, 10, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 5, 19, 1286, 10, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 5, 20, 1294, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 1301, 10, 20, 5, 20, 1303, 10, 20, 3, 20, 5, 20, 1306, 10, 20, 3, 20, 3, 20, 3, 20, 5, 20, 1311, 10, 20, 3, 20, 3, 20, 5, 20, 1315, 10, 20, 3, 20, 3, 20, 3, 20, 5, 20, 1320, 10, 20, 3, 20, 5, 20, 1323, 10, 20, 3, 20, 3, 20, 3, 20, 5, 20, 1328, 10, 20, 3, 20, 3, 20, 3, 20, 5, 20, 1333, 10, 20, 3, 20, 5, 20, 1336, 10, 20, 3, 20, 3, 20, 3, 20, 5, 20, 1341, 10, 20, 3, 20, 3, 20, 5, 20, 1345, 10, 20, 3, 20, 3, 20, 3, 20, 5, 20, 1350, 10, 20, 5, 20, 1352, 10, 20, 3, 21, 3, 21, 5, 21, 1356, 10, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 1363, 10, 22, 12, 22, 14, 22, 1366, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 5, 23, 1373, 10, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 1382, 10, 25, 3, 26, 3, 26, 3, 26, 7, 26, 1387, 10, 26, 12, 26, 14, 26, 1390, 11, 26, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 1396, 10, 27, 12, 27, 14, 27, 1399, 11, 27, 3, 28, 3, 28, 5, 28, 1403, 10, 28, 3, 28, 5, 28, 1406, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 1428, 10, 30, 12, 30, 14, 30, 1431, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 1437, 10, 31, 12, 31, 14, 31, 1440, 11, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 1446, 10, 32, 3, 32, 5, 32, 1449, 10, 32, 3, 33, 3, 33, 3, 33, 7, 33, 1454, 10, 33, 12, 33, 14, 33, 1457, 11, 33, 3, 33, 5, 33, 1460, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 1466, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 7, 35, 1472, 10, 35, 12, 35, 14, 35, 1475, 11, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 7, 36, 1483, 10, 36, 12, 36, 14, 36, 1486, 11, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1496, 10, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 1503, 10, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 1509, 10, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 6, 41, 1520, 10, 41, 13, 41, 14, 41, 1521, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 1529, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 1536, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 1548, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 7, 41, 1554, 10, 41, 12, 41, 14, 41, 1557, 11, 41, 3, 41, 7, 41, 1560, 10, 41, 12, 41, 14, 41, 1563, 11, 41, 5, 41, 1565, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 7, 42, 1572, 10, 42, 12, 42, 14, 42, 1575, 11, 42, 5, 42, 1577, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 7, 42, 1584, 10, 42, 12, 42, 14, 42, 1587, 11, 42, 5, 42, 1589, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 7, 42, 1596, 10, 42, 12, 42, 14, 42, 1599, 11, 42, 5, 42, 1601, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 7, 42, 1608, 10, 42, 12, 42, 14, 42, 1611, 11, 42, 5, 42, 1613, 10, 42, 3, 42, 5, 42, 1616, 10, 42, 3, 42, 3, 42, 3, 42, 5, 42, 1621, 10, 42, 5, 42, 1623, 10, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 1635, 10, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 1642, 10, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 1649, 10, 44, 3, 44, 7, 44, 1652, 10, 44, 12, 44, 14, 44, 1655, 11, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 1666, 10, 45, 3, 46, 3, 46, 5, 46, 1670, 10, 46, 3, 46, 3, 46, 5, 46, 1674, 10, 46, 3, 47, 3, 47, 6, 47, 1678, 10, 47, 13, 47, 14, 47, 1679, 3, 48, 3, 48, 5, 48, 1684, 10, 48, 3, 48, 3, 48, 3, 48, 3, 48, 7, 48, 1690, 10, 48, 12, 48, 14, 48, 1693, 11, 48, 3, 48, 5, 48, 1696, 10, 48, 3, 48, 5, 48, 1699, 10, 48, 3, 48, 5, 48, 1702, 10, 48, 3, 48, 5, 48, 1705, 10, 48, 3, 48, 3, 48, 5, 48, 1709, 10, 48, 3, 49, 3, 49, 5, 49, 1713, 10, 49, 3, 49, 7, 49, 1716, 10, 49, 12, 49, 14, 49, 1719, 11, 49, 3, 49, 5, 49, 1722, 10, 49, 3, 49, 5, 49, 1725, 10, 49, 3, 49, 5, 49, 1728, 10, 49, 3, 49, 5, 49, 1731, 10, 49, 3, 49, 3, 49, 5, 49, 1735, 10, 49, 3, 49, 7, 49, 1738, 10, 49, 12, 49, 14, 49, 1741, 11, 49, 3, 49, 5, 49, 1744, 10, 49, 3, 49, 5, 49, 1747, 10, 49, 3, 49, 5, 49, 1750, 10, 49, 3, 49, 5, 49, 1753, 10, 49, 5, 49, 1755, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 1761, 10, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 1768, 10, 50, 3, 50, 3, 50, 3, 50, 5, 50, 1773, 10, 50, 3, 50, 5, 50, 1776, 10, 50, 3, 50, 5, 50, 1779, 10, 50, 3, 50, 3, 50, 5, 50, 1783, 10, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 1793, 10, 50, 3, 50, 3, 50, 5, 50, 1797, 10, 50, 5, 50, 1799, 10, 50, 3, 50, 5, 50, 1802, 10, 50, 3, 50, 3, 50, 5, 50, 1806, 10, 50, 3, 51, 3, 51, 7, 51, 1810, 10, 51, 12, 51, 14, 51, 1813, 11, 51, 3, 51, 5, 51, 1816, 10, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 1827, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 1837, 10, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 1849, 10, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 7, 56, 1862, 10, 56, 12, 56, 14, 56, 1865, 11, 56, 3, 56, 3, 56, 5, 56, 1869, 10, 56, 3, 57, 3, 57, 3, 57, 7, 57, 1874, 10, 57, 12, 57, 14, 57, 1877, 11, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 5, 61, 1892, 10, 61, 3, 61, 7, 61, 1895, 10, 61, 12, 61, 14, 61, 1898, 11, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 7, 62, 1908, 10, 62, 12, 62, 14, 62, 1911, 11, 62, 3, 62, 3, 62, 5, 62, 1915, 10, 62, 3, 63, 3, 63, 3, 63, 3, 63, 7, 63, 1921, 10, 63, 12, 63, 14, 63, 1924, 11, 63, 3, 63, 7, 63, 1927, 10, 63, 12, 63, 14, 63, 1930, 11, 63, 3, 63, 5, 63, 1933, 10, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 7, 64, 1940, 10, 64, 12, 64, 14, 64, 1943, 11, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 7, 64, 1950, 10, 64, 12, 64, 14, 64, 1953, 11, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 7, 64, 1965, 10, 64, 12, 64, 14, 64, 1968, 11, 64, 3, 64, 3, 64, 5, 64, 1972, 10, 64, 5, 64, 1974, 10, 64, 3, 65, 3, 65, 5, 65, 1978, 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 7, 66, 1985, 10, 66, 12, 66, 14, 66, 1988, 11, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 7, 66, 1998, 10, 66, 12, 66, 14, 66, 2001, 11, 66, 3, 66, 3, 66, 5, 66, 2005, 10, 66, 3, 67, 3, 67, 5, 67, 2009, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 2015, 10, 68, 12, 68, 14, 68, 2018, 11, 68, 5, 68, 2020, 10, 68, 3, 68, 3, 68, 5, 68, 2024, 10, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 2036, 10, 69, 12, 69, 14, 69, 2039, 11, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 2049, 10, 70, 12, 70, 14, 70, 2052, 11, 70, 3, 70, 3, 70, 5, 70, 2056, 10, 70, 3, 71, 3, 71, 5, 71, 2060, 10, 71, 3, 71, 5, 71, 2063, 10, 71, 3, 72, 3, 72, 3, 72, 5, 72, 2068, 10, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 7, 72, 2075, 10, 72, 12, 72, 14, 72, 2078, 11, 72, 5, 72, 2080, 10, 72, 3, 72, 3, 72, 3, 72, 5, 72, 2085, 10, 72, 3, 72, 3, 72, 3, 72, 7, 72, 2090, 10, 72, 12, 72, 14, 72, 2093, 11, 72, 5, 72, 2095, 10, 72, 3, 73, 3, 73, 3, 74, 5, 74, 2100, 10, 74, 3, 74, 3, 74, 7, 74, 2104, 10, 74, 12, 74, 14, 74, 2107, 11, 74, 3, 75, 3, 75, 3, 75, 5, 75, 2112, 10, 75, 3, 75, 3, 75, 5, 75, 2116, 10, 75, 3, 75, 3, 75, 3, 75, 3, 75, 5, 75, 2122, 10, 75, 3, 75, 3, 75, 5, 75, 2126, 10, 75, 3, 76, 5, 76, 2129, 10, 76, 3, 76, 3, 76, 3, 76, 5, 76, 2134, 10, 76, 3, 76, 5, 76, 2137, 10, 76, 3, 76, 3, 76, 3, 76, 5, 76, 2142, 10, 76, 3, 76, 3, 76, 5, 76, 2146, 10, 76, 3, 76, 5, 76, 2149, 10, 76, 3, 76, 5, 76, 2152, 10, 76, 3, 77, 3, 77, 3, 77, 3, 77, 5, 77, 2158, 10, 77, 3, 78, 3, 78, 3, 78, 5, 78, 2163, 10, 78, 3, 78, 3, 78, 3, 79, 5, 79, 2168, 10, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 2186, 10, 79, 5, 79, 2188, 10, 79, 3, 79, 5, 79, 2191, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 7, 81, 2200, 10, 81, 12, 81, 14, 81, 2203, 11, 81, 3, 82, 3, 82, 3, 82, 3, 82, 7, 82, 2209, 10, 82, 12, 82, 14, 82, 2212, 11, 82, 3, 82, 3, 82, 3, 83, 3, 83, 5, 83, 2218, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 2224, 10, 84, 12, 84, 14, 84, 2227, 11, 84, 3, 84, 3, 84, 3, 85, 3, 85, 5, 85, 2233, 10, 85, 3, 86, 3, 86, 5, 86, 2237, 10, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 5, 86, 2245, 10, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 5, 86, 2253, 10, 86, 3, 86, 3, 86, 3, 86, 3, 86, 5, 86, 2259, 10, 86, 3, 87, 3, 87, 3, 87, 3, 87, 7, 87, 2265, 10, 87, 12, 87, 14, 87, 2268, 11, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 7, 88, 2277, 10, 88, 12, 88, 14, 88, 2280, 11, 88, 5, 88, 2282, 10, 88, 3, 88, 3, 88, 3, 88, 3, 89, 5, 89, 2288, 10, 89, 3, 89, 3, 89, 5, 89, 2292, 10, 89, 5, 89, 2294, 10, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 5, 90, 2303, 10, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 5, 90, 2315, 10, 90, 5, 90, 2317, 10, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 5, 90, 2324, 10, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 5, 90, 2331, 10, 90, 3, 90, 3, 90, 3, 90, 3, 90, 5, 90, 2337, 10, 90, 3, 90, 3, 90, 3, 90, 3, 90, 5, 90, 2343, 10, 90, 5, 90, 2345, 10, 90, 3, 91, 3, 91, 3, 91, 7, 91, 2350, 10, 91, 12, 91, 14, 91, 2353, 11, 91, 3, 92, 3, 92, 3, 92, 7, 92, 2358, 10, 92, 12, 92, 14, 92, 2361, 11, 92, 3, 93, 3, 93, 3, 93, 5, 93, 2366, 10, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 5, 94, 2373, 10, 94, 3, 94, 3, 94, 3, 95, 3, 95, 5, 95, 2379, 10, 95, 3, 95, 3, 95, 5, 95, 2383, 10, 95, 5, 95, 2385, 10, 95, 3, 96, 3, 96, 3, 96, 7, 96, 2390, 10, 96, 12, 96, 14, 96, 2393, 11, 96, 3, 97, 3, 97, 3, 97, 3, 97, 7, 97, 2399, 10, 97, 12, 97, 14, 97, 2402, 11, 97, 3, 97, 3, 97, 3, 98, 3, 98, 5, 98, 2408, 10, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 7, 99, 2416, 10, 99, 12, 99, 14, 99, 2419, 11, 99, 3, 99, 3, 99, 5, 99, 2423, 10, 99, 3, 100, 3, 100, 5, 100, 2427, 10, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 7, 102, 2434, 10, 102, 12, 102, 14, 102, 2437, 11, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 5, 103, 2449, 10, 103, 5, 103, 2451, 10, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 7, 103, 2459, 10, 103, 12, 103, 14, 103, 2462, 11, 103, 3, 104, 5, 104, 2465, 10, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 5, 104, 2473, 10, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 7, 104, 2480, 10, 104, 12, 104, 14, 104, 2483, 11, 104, 3, 104, 3, 104, 3, 104, 5, 104, 2488, 10, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 5, 104, 2496, 10, 104, 3, 104, 3, 104, 3, 104, 5, 104, 2501, 10, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 7, 104, 2511, 10, 104, 12, 104, 14, 104, 2514, 11, 104, 3, 104, 3, 104, 5, 104, 2518, 10, 104, 3, 104, 5, 104, 2521, 10, 104, 3, 104, 3, 104, 3, 104, 3, 104, 5, 104, 2527, 10, 104, 3, 104, 3, 104, 5, 104, 2531, 10, 104, 3, 104, 3, 104, 3, 104, 5, 104, 2536, 10, 104, 3, 104, 3, 104, 3, 104, 5, 104, 2541, 10, 104, 3, 104, 3, 104, 3, 104, 5, 104, 2546, 10, 104, 3, 105, 3, 105, 3, 105, 3, 105, 5, 105, 2552, 10, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 7, 105, 2573, 10, 105, 12, 105, 14, 105, 2576, 11, 105, 3, 106, 3, 106, 3, 106, 3, 106, 6, 106, 2582, 10, 106, 13, 106, 14, 106, 2583, 3, 106, 3, 106, 5, 106, 2588, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 6, 106, 2595, 10, 106, 13, 106, 14, 106, 2596, 3, 106, 3, 106, 5, 106, 2601, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 7, 106, 2617, 10, 106, 12, 106, 14, 106, 2620, 11, 106, 5, 106, 2622, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 2630, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 2639, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 6, 106, 2660, 10, 106, 13, 106, 14, 106, 2661, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 2673, 10, 106, 3, 106, 3, 106, 3, 106, 7, 106, 2678, 10, 106, 12, 106, 14, 106, 2681, 11, 106, 5, 106, 2683, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 2692, 10, 106, 3, 106, 3, 106, 5, 106, 2696, 10, 106, 3, 106, 3, 106, 5, 106, 2700, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 6, 106, 2710, 10, 106, 13, 106, 14, 106, 2711, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 2737, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 2744, 10, 106, 3, 106, 5, 106, 2747, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 2762, 10, 106, 3, 106, 3, 106, 5, 106, 2766, 10, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 7, 106, 2776, 10, 106, 12, 106, 14, 106, 2779, 11, 106, 3, 107, 3, 107, 5, 107, 2783, 10, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 5, 107, 2790, 10, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 6, 108, 2800, 10, 108, 13, 108, 14, 108, 2801, 5, 108, 2804, 10, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 5, 113, 2817, 10, 113, 3, 114, 3, 114, 5, 114, 2821, 10, 114, 3, 115, 3, 115, 3, 115, 6, 115, 2826, 10, 115, 13, 115, 14, 115, 2827, 3, 116, 3, 116, 3, 116, 5, 116, 2833, 10, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 5, 118, 2841, 10, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 5, 119, 2848, 10, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 5, 120, 2865, 10, 120, 3, 120, 3, 120, 5, 120, 2869, 10, 120, 3, 120, 3, 120, 3, 120, 3, 120, 5, 120, 2875, 10, 120, 3, 120, 3, 120, 3, 120, 3, 120, 5, 120, 2881, 10, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 7, 120, 2888, 10, 120, 12, 120, 14, 120, 2891, 11, 120, 3, 120, 5, 120, 2894, 10, 120, 5, 120, 2896, 10, 120, 3, 121, 3, 121, 3, 121, 7, 121, 2901, 10, 121, 12, 121, 14, 121, 2904, 11, 121, 3, 122, 3, 122, 3, 122, 3, 122, 5, 122, 2910, 10, 122, 3, 122, 5, 122, 2913, 10, 122, 3, 122, 5, 122, 2916, 10, 122, 3, 123, 3, 123, 3, 123, 7, 123, 2921, 10, 123, 12, 123, 14, 123, 2924, 11, 123, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 2930, 10, 124, 3, 124, 5, 124, 2933, 10, 124, 3, 125, 3, 125, 3, 125, 7, 125, 2938, 10, 125, 12, 125, 14, 125, 2941, 11, 125, 3, 126, 3, 126, 5, 126, 2945, 10, 126, 3, 126, 3, 126, 3, 126, 5, 126, 2950, 10, 126, 3, 126, 5, 126, 2953, 10, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 7, 128, 2964, 10, 128, 12, 128, 14, 128, 2967, 11, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 7, 130, 2984, 10, 130, 12, 130, 14, 130, 2987, 11, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 7, 130, 2994, 10, 130, 12, 130, 14, 130, 2997, 11, 130, 5, 130, 2999, 10, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 7, 130, 3006, 10, 130, 12, 130, 14, 130, 3009, 11, 130, 5, 130, 3011, 10, 130, 5, 130, 3013, 10, 130, 3, 130, 5, 130, 3016, 10, 130, 3, 130, 5, 130, 3019, 10, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 5, 131, 3037, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 5, 132, 3046, 10, 132, 3, 133, 3, 133, 3, 133, 7, 133, 3051, 10, 133, 12, 133, 14, 133, 3054, 11, 133, 3, 134, 3, 134, 3, 134, 3, 134, 5, 134, 3060, 10, 134, 3, 135, 3, 135, 3, 135, 7, 135, 3065, 10, 135, 12, 135, 14, 135, 3068, 11, 135, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 6, 137, 3075, 10, 137, 13, 137, 14, 137, 3076, 3, 137, 5, 137, 3080, 10, 137, 3, 138, 3, 138, 3, 138, 5, 138, 3085, 10, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 5, 139, 3093, 10, 139, 3, 140, 3, 140, 3, 141, 3, 141, 5, 141, 3099, 10, 141, 3, 141, 3, 141, 3, 141, 5, 141, 3104, 10, 141, 3, 141, 3, 141, 3, 141, 5, 141, 3109, 10, 141, 3, 141, 3, 141, 5, 141, 3113, 10, 141, 3, 141, 3, 141, 5, 141, 3117, 10, 141, 3, 141, 3, 141, 5, 141, 3121, 10, 141, 3, 141, 3, 141, 5, 141, 3125, 10, 141, 3, 141, 3, 141, 5, 141, 3129, 10, 141, 3, 141, 3, 141, 5, 141, 3133, 10, 141, 3, 141, 3, 141, 5, 141, 3137, 10, 141, 3, 141, 5, 141, 3140, 10, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 5, 142, 3149, 10, 142, 3, 143, 3, 143, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 11, 913, 978, 986, 1003, 1017, 1026, 1035, 1044, 1051, 6, 86, 204, 208, 210, 146, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 2, 53, 4, 2, 63, 63, 180, 180, 4, 2, 30, 30, 195, 195, 4, 2, 62, 62, 149, 149, 4, 2, 99, 99, 112, 112, 3, 2, 41, 42, 4, 2, 229, 229, 261, 261, 4, 2, 13, 13, 33, 33, 7, 2, 38, 38, 50, 50, 85, 85, 98, 98, 140, 140, 3, 2, 67, 68, 4, 2, 85, 85, 98, 98, 4, 2, 153, 153, 293, 293, 5, 2, 10, 10, 75, 75, 228, 228, 4, 2, 10, 10, 134, 134, 4, 2, 136, 136, 293, 293, 5, 2, 61, 61, 148, 148, 206, 206, 6, 2, 80, 80, 119, 119, 214, 214, 251, 251, 5, 2, 80, 80, 214, 214, 251, 251, 4, 2, 21, 21, 67, 67, 4, 2, 93, 93, 126, 126, 4, 2, 53, 53, 202, 202, 4, 2, 12, 12, 72, 72, 4, 2, 297, 297, 299, 299, 5, 2, 12, 12, 17, 17, 218, 218, 5, 2, 88, 88, 244, 244, 253, 253, 4, 2, 277, 278, 282, 282, 4, 2, 74, 74, 279, 281, 4, 2, 277, 278, 285, 285, 4, 2, 55, 55, 57, 58, 4, 2, 32, 32, 246, 246, 4, 2, 110, 110, 194, 194, 3, 2, 226, 227, 4, 2, 99, 99, 290, 290, 4, 2, 95, 95, 290, 290, 5, 2, 25, 25, 129, 129, 239, 239, 3, 2, 269, 276, 4, 2, 74, 74, 277, 286, 6, 2, 15, 15, 112, 112, 152, 152, 161, 161, 4, 2, 88, 88, 244, 244, 3, 2, 277, 278, 5, 2, 293, 293, 297, 297, 299, 299, 4, 2, 146, 146, 267, 267, 6, 2, 59, 59, 108, 108, 145, 145, 205, 205, 5, 2, 108, 108, 145, 145, 205, 205, 4, 2, 73, 73, 170, 170, 4, 2, 162, 162, 219, 219, 4, 2, 94, 94, 177, 177, 3, 2, 298, 299, 4, 2, 75, 75, 213, 213, 51, 2, 10, 11, 13, 14, 16, 16, 18, 19, 21, 22, 24, 24, 26, 30, 33, 33, 35, 38, 40, 40, 42, 48, 50, 50, 53, 54, 59, 71, 73, 75, 79, 79, 81, 87, 90, 90, 92, 94, 97, 98, 101, 103, 106, 106, 108, 111, 113, 114, 116, 118, 120, 120, 123, 123, 125, 126, 128, 128, 131, 149, 151, 151, 154, 155, 159, 160, 163, 163, 165, 166, 168, 177, 179, 187, 189, 196, 198, 206, 208, 211, 213, 217, 219, 228, 230, 234, 238, 238, 240, 250, 254, 257, 260, 262, 265, 265, 267, 268, 18, 2, 16, 16, 52, 52, 80, 80, 100, 100, 115, 115, 119, 119, 124, 124, 127, 127, 130, 130, 150, 150, 157, 157, 197, 197, 208, 208, 214, 214, 251, 251, 259, 259, 19, 2, 10, 15, 17, 51, 53, 79, 81, 99, 101, 114, 116, 118, 120, 123, 125, 126, 128, 129, 131, 149, 151, 156, 158, 196, 198, 207, 209, 213, 215, 250, 252, 258, 260, 268, 2, 3648, 2, 290, 3, 2, 2, 2, 4, 299, 3, 2, 2, 2, 6, 302, 3, 2, 2, 2, 8, 305, 3, 2, 2, 2, 10, 308, 3, 2, 2, 2, 12, 311, 3, 2, 2, 2, 14, 314, 3, 2, 2, 2, 16, 1054, 3, 2, 2, 2, 18, 1056, 3, 2, 2, 2, 20, 1058, 3, 2, 2, 2, 22, 1228, 3, 2, 2, 2, 24, 1230, 3, 2, 2, 2, 26, 1247, 3, 2, 2, 2, 28, 1253, 3, 2, 2, 2, 30, 1265, 3, 2, 2, 2, 32, 1278, 3, 2, 2, 2, 34, 1281, 3, 2, 2, 2, 36, 1285, 3, 2, 2, 2, 38, 1351, 3, 2, 2, 2, 40, 1353, 3, 2, 2, 2, 42, 1357, 3, 2, 2, 2, 44, 1369, 3, 2, 2, 2, 46, 1374, 3, 2, 2, 2, 48, 1381, 3, 2, 2, 2, 50, 1383, 3, 2, 2, 2, 52, 1391, 3, 2, 2, 2, 54, 1400, 3, 2, 2, 2, 56, 1411, 3, 2, 2, 2, 58, 1429, 3, 2, 2, 2, 60, 1432, 3, 2, 2, 2, 62, 1443, 3, 2, 2, 2, 64, 1459, 3, 2, 2, 2, 66, 1465, 3, 2, 2, 2, 68, 1467, 3, 2, 2, 2, 70, 1478, 3, 2, 2, 2, 72, 1495, 3, 2, 2, 2, 74, 1502, 3, 2, 2, 2, 76, 1504, 3, 2, 2, 2, 78, 1510, 3, 2, 2, 2, 80, 1564, 3, 2, 2, 2, 82, 1576, 3, 2, 2, 2, 84, 1624, 3, 2, 2, 2, 86, 1627, 3, 2, 2, 2, 88, 1665, 3, 2, 2, 2, 90, 1667, 3, 2, 2, 2, 92, 1675, 3, 2, 2, 2, 94, 1708, 3, 2, 2, 2, 96, 1754, 3, 2, 2, 2, 98, 1775, 3, 2, 2, 2, 100, 1807, 3, 2, 2, 2, 102, 1819, 3, 2, 2, 2, 104, 1822, 3, 2, 2, 2, 106, 1831, 3, 2, 2, 2, 108, 1848, 3, 2, 2, 2, 110, 1868, 3, 2, 2, 2, 112, 1870, 3, 2, 2, 2, 114, 1878, 3, 2, 2, 2, 116, 1882, 3, 2, 2, 2, 118, 1885, 3, 2, 2, 2, 120, 1888, 3, 2, 2, 2, 122, 1914, 3, 2, 2, 2, 124, 1916, 3, 2, 2, 2, 126, 1973, 3, 2, 2, 2, 128, 1977, 3, 2, 2, 2, 130, 2004, 3, 2, 2, 2, 132, 2008, 3, 2, 2, 2, 134, 2023, 3, 2, 2, 2, 136, 2025, 3, 2, 2, 2, 138, 2055, 3, 2, 2, 2, 140, 2057, 3, 2, 2, 2, 142, 2064, 3, 2, 2, 2, 144, 2096, 3, 2, 2, 2, 146, 2099, 3, 2, 2, 2, 148, 2125, 3, 2, 2, 2, 150, 2151, 3, 2, 2, 2, 152, 2157, 3, 2, 2, 2, 154, 2159, 3, 2, 2, 2, 156, 2190, 3, 2, 2, 2, 158, 2192, 3, 2, 2, 2, 160, 2196, 3, 2, 2, 2, 162, 2204, 3, 2, 2, 2, 164, 2215, 3, 2, 2, 2, 166, 2219, 3, 2, 2, 2, 168, 2230, 3, 2, 2, 2, 170, 2258, 3, 2, 2, 2, 172, 2260, 3, 2, 2, 2, 174, 2271, 3, 2, 2, 2, 176, 2293, 3, 2, 2, 2, 178, 2344, 3, 2, 2, 2, 180, 2346, 3, 2, 2, 2, 182, 2354, 3, 2, 2, 2, 184, 2365, 3, 2, 2, 2, 186, 2372, 3, 2, 2, 2, 188, 2376, 3, 2, 2, 2, 190, 2386, 3, 2, 2, 2, 192, 2394, 3, 2, 2, 2, 194, 2407, 3, 2, 2, 2, 196, 2422, 3, 2, 2, 2, 198, 2426, 3, 2, 2, 2, 200, 2428, 3, 2, 2, 2, 202, 2430, 3, 2, 2, 2, 204, 2450, 3, 2, 2, 2, 206, 2545, 3, 2, 2, 2, 208, 2551, 3, 2, 2, 2, 210, 2765, 3, 2, 2, 2, 212, 2789, 3, 2, 2, 2, 214, 2803, 3, 2, 2, 2, 216, 2805, 3, 2, 2, 2, 218, 2807, 3, 2, 2, 2, 220, 2809, 3, 2, 2, 2, 222, 2811, 3, 2, 2, 2, 224, 2813, 3, 2, 2, 2, 226, 2818, 3, 2, 2, 2, 228, 2825, 3, 2, 2, 2, 230, 2829, 3, 2, 2, 2, 232, 2834, 3, 2, 2, 2, 234, 2840, 3, 2, 2, 2, 236, 2847, 3, 2, 2, 2, 238, 2895, 3, 2, 2, 2, 240, 2897, 3, 2, 2, 2, 242, 2905, 3, 2, 2, 2, 244, 2917, 3, 2, 2, 2, 246, 2925, 3, 2, 2, 2, 248, 2934, 3, 2, 2, 2, 250, 2942, 3, 2, 2, 2, 252, 2954, 3, 2, 2, 2, 254, 2959, 3, 2, 2, 2, 256, 2968, 3, 2, 2, 2, 258, 3018, 3, 2, 2, 2, 260, 3036, 3, 2, 2, 2, 262, 3045, 3, 2, 2, 2, 264, 3047, 3, 2, 2, 2, 266, 3059, 3, 2, 2, 2, 268, 3061, 3, 2, 2, 2, 270, 3069, 3, 2, 2, 2, 272, 3079, 3, 2, 2, 2, 274, 3084, 3, 2, 2, 2, 276, 3092, 3, 2, 2, 2, 278, 3094, 3, 2, 2, 2, 280, 3139, 3, 2, 2, 2, 282, 3148, 3, 2, 2, 2, 284, 3150, 3, 2, 2, 2, 286, 3152, 3, 2, 2, 2, 288, 3154, 3, 2, 2, 2, 290, 294, 5, 16, 9, 2, 291, 293, 7, 292, 2, 2, 292, 291, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 297, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 297, 298, 7, 2, 2, 3, 298, 3, 3, 2, 2, 2, 299, 300, 5, 188, 95, 2, 300, 301, 7, 2, 2, 3, 301, 5, 3, 2, 2, 2, 302, 303, 5, 184, 93, 2, 303, 304, 7, 2, 2, 3, 304, 7, 3, 2, 2, 2, 305, 306, 5, 182, 92, 2, 306, 307, 7, 2, 2, 3, 307, 9, 3, 2, 2, 2, 308, 309, 5, 186, 94, 2, 309, 310, 7, 2, 2, 3, 310, 11, 3, 2, 2, 2, 311, 312, 5, 238, 120, 2, 312, 313, 7, 2, 2, 3, 313, 13, 3, 2, 2, 2, 314, 315, 5, 244, 123, 2, 315, 316, 7, 2, 2, 3, 316, 15, 3, 2, 2, 2, 317, 1055, 5, 36, 19, 2, 318, 320, 5, 52, 27, 2, 319, 318, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 321, 3, 2, 2, 2, 321, 1055, 5, 80, 41, 2, 322, 324, 7, 257, 2, 2, 323, 325, 7, 148, 2, 2, 324, 323, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 1055, 5, 182, 92, 2, 327, 328, 7, 51, 2, 2, 328, 332, 5, 46, 24, 2, 329, 330, 7, 109, 2, 2, 330, 331, 7, 152, 2, 2, 331, 333, 7, 82, 2, 2, 332, 329, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 342, 5, 182, 92, 2, 335, 341, 5, 34, 18, 2, 336, 341, 5, 32, 17, 2, 337, 338, 7, 266, 2, 2, 338, 339, 9, 2, 2, 2, 339, 341, 5, 60, 31, 2, 340, 335, 3, 2, 2, 2, 340, 336, 3, 2, 2, 2, 340, 337, 3, 2, 2, 2, 341, 344, 3, 2, 2, 2, 342, 340, 3, 2, 2, 2, 342, 343, 3, 2, 2, 2, 343, 1055, 3, 2, 2, 2, 344, 342, 3, 2, 2, 2, 345, 346, 7, 13, 2, 2, 346, 347, 5, 46, 24, 2, 347, 348, 5, 182, 92, 2, 348, 349, 7, 213, 2, 2, 349, 350, 9, 2, 2, 2, 350, 351, 5, 60, 31, 2, 351, 1055, 3, 2, 2, 2, 352, 353, 7, 13, 2, 2, 353, 354, 5, 46, 24, 2, 354, 355, 5, 182, 92, 2, 355, 356, 7, 213, 2, 2, 356, 357, 5, 32, 17, 2, 357, 1055, 3, 2, 2, 2, 358, 359, 7, 75, 2, 2, 359, 362, 5, 46, 24, 2, 360, 361, 7, 109, 2, 2, 361, 363, 7, 82, 2, 2, 362, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 366, 5, 182, 92, 2, 365, 367, 9, 3, 2, 2, 366, 365, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 1055, 3, 2, 2, 2, 368, 369, 7, 216, 2, 2, 369, 372, 9, 4, 2, 2, 370, 371, 9, 5, 2, 2, 371, 373, 5, 182, 92, 2, 372, 370, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 378, 3, 2, 2, 2, 374, 376, 7, 131, 2, 2, 375, 374, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 379, 7, 293, 2, 2, 378, 375, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 1055, 3, 2, 2, 2, 380, 385, 5, 24, 13, 2, 381, 382, 7, 3, 2, 2, 382, 383, 5, 244, 123, 2, 383, 384, 7, 4, 2, 2, 384, 386, 3, 2, 2, 2, 385, 381, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 388, 3, 2, 2, 2, 387, 389, 5, 56, 29, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 395, 5, 58, 30, 2, 391, 393, 7, 20, 2, 2, 392, 391, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 396, 5, 36, 19, 2, 395, 392, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 1055, 3, 2, 2, 2, 397, 398, 7, 51, 2, 2, 398, 402, 7, 229, 2, 2, 399, 400, 7, 109, 2, 2, 400, 401, 7, 152, 2, 2, 401, 403, 7, 82, 2, 2, 402, 399, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 5, 184, 93, 2, 405, 406, 7, 131, 2, 2, 406, 415, 5, 184, 93, 2, 407, 414, 5, 56, 29, 2, 408, 414, 5, 178, 90, 2, 409, 414, 5, 72, 37, 2, 410, 414, 5, 32, 17, 2, 411, 412, 7, 232, 2, 2, 412, 414, 5, 60, 31, 2, 413, 407, 3, 2, 2, 2, 413, 408, 3, 2, 2, 2, 413, 409, 3, 2, 2, 2, 413, 410, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 414, 417, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 1055, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 418, 423, 5, 26, 14, 2, 419, 420, 7, 3, 2, 2, 420, 421, 5, 244, 123, 2, 421, 422, 7, 4, 2, 2, 422, 424, 3, 2, 2, 2, 423, 419, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 426, 3, 2, 2, 2, 425, 427, 5, 56, 29, 2, 426, 425, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 433, 5, 58, 30, 2, 429, 431, 7, 20, 2, 2, 430, 429, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 432, 3, 2, 2, 2, 432, 434, 5, 36, 19, 2, 433, 430, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 1055, 3, 2, 2, 2, 435, 436, 7, 14, 2, 2, 436, 437, 7, 229, 2, 2, 437, 439, 5, 182, 92, 2, 438, 440, 5, 42, 22, 2, 439, 438, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 442, 7, 47, 2, 2, 442, 450, 7, 222, 2, 2, 443, 451, 5, 274, 138, 2, 444, 445, 7, 95, 2, 2, 445, 446, 7, 42, 2, 2, 446, 451, 5, 160, 81, 2, 447, 448, 7, 95, 2, 2, 448, 449, 7, 12, 2, 2, 449, 451, 7, 42, 2, 2, 450, 443, 3, 2, 2, 2, 450, 444, 3, 2, 2, 2, 450, 447, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 1055, 3, 2, 2, 2, 452, 453, 7, 14, 2, 2, 453, 456, 7, 230, 2, 2, 454, 455, 9, 5, 2, 2, 455, 457, 5, 182, 92, 2, 456, 454, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 459, 7, 47, 2, 2, 459, 461, 7, 222, 2, 2, 460, 462, 5, 274, 138, 2, 461, 460, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 1055, 3, 2, 2, 2, 463, 464, 7, 13, 2, 2, 464, 465, 7, 229, 2, 2, 465, 466, 5, 182, 92, 2, 466, 467, 7, 10, 2, 2, 467, 468, 9, 6, 2, 2, 468, 469, 5, 240, 121, 2, 469, 1055, 3, 2, 2, 2, 470, 471, 7, 13, 2, 2, 471, 472, 7, 229, 2, 2, 472, 473, 5, 182, 92, 2, 473, 474, 7, 10, 2, 2, 474, 475, 9, 6, 2, 2, 475, 476, 7, 3, 2, 2, 476, 477, 5, 240, 121, 2, 477, 478, 7, 4, 2, 2, 478, 1055, 3, 2, 2, 2, 479, 480, 7, 13, 2, 2, 480, 481, 7, 229, 2, 2, 481, 482, 5, 182, 92, 2, 482, 483, 7, 190, 2, 2, 483, 484, 7, 41, 2, 2, 484, 485, 5, 182, 92, 2, 485, 486, 7, 237, 2, 2, 486, 487, 5, 270, 136, 2, 487, 1055, 3, 2, 2, 2, 488, 489, 7, 13, 2, 2, 489, 490, 7, 229, 2, 2, 490, 491, 5, 182, 92, 2, 491, 492, 7, 75, 2, 2, 492, 493, 9, 6, 2, 2, 493, 494, 7, 3, 2, 2, 494, 495, 5, 180, 91, 2, 495, 496, 7, 4, 2, 2, 496, 1055, 3, 2, 2, 2, 497, 498, 7, 13, 2, 2, 498, 499, 7, 229, 2, 2, 499, 500, 5, 182, 92, 2, 500, 501, 7, 75, 2, 2, 501, 502, 9, 6, 2, 2, 502, 503, 5, 180, 91, 2, 503, 1055, 3, 2, 2, 2, 504, 505, 7, 13, 2, 2, 505, 506, 9, 7, 2, 2, 506, 507, 5, 182, 92, 2, 507, 508, 7, 190, 2, 2, 508, 509, 7, 237, 2, 2, 509, 510, 5, 182, 92, 2, 510, 1055, 3, 2, 2, 2, 511, 512, 7, 13, 2, 2, 512, 513, 9, 7, 2, 2, 513, 514, 5, 182, 92, 2, 514, 515, 7, 213, 2, 2, 515, 516, 7, 232, 2, 2, 516, 517, 5, 60, 31, 2, 517, 1055, 3, 2, 2, 2, 518, 519, 7, 13, 2, 2, 519, 520, 9, 7, 2, 2, 520, 521, 5, 182, 92, 2, 521, 522, 7, 255, 2, 2, 522, 525, 7, 232, 2, 2, 523, 524, 7, 109, 2, 2, 524, 526, 7, 82, 2, 2, 525, 523, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 528, 5, 60, 31, 2, 528, 1055, 3, 2, 2, 2, 529, 530, 7, 13, 2, 2, 530, 531, 7, 229, 2, 2, 531, 532, 5, 182, 92, 2, 532, 534, 9, 8, 2, 2, 533, 535, 7, 41, 2, 2, 534, 533, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 538, 5, 182, 92, 2, 537, 539, 5, 282, 142, 2, 538, 537, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 1055, 3, 2, 2, 2, 540, 541, 7, 13, 2, 2, 541, 542, 7, 229, 2, 2, 542, 544, 5, 182, 92, 2, 543, 545, 5, 42, 22, 2, 544, 543, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 7, 33, 2, 2, 547, 549, 7, 41, 2, 2, 548, 547, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 551, 5, 182, 92, 2, 551, 553, 5, 246, 124, 2, 552, 554, 5, 236, 119, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 1055, 3, 2, 2, 2, 555, 556, 7, 13, 2, 2, 556, 557, 7, 229, 2, 2, 557, 559, 5, 182, 92, 2, 558, 560, 5, 42, 22, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 192, 2, 2, 562, 563, 7, 42, 2, 2, 563, 564, 7, 3, 2, 2, 564, 565, 5, 240, 121, 2, 565, 566, 7, 4, 2, 2, 566, 1055, 3, 2, 2, 2, 567, 568, 7, 13, 2, 2, 568, 569, 7, 229, 2, 2, 569, 571, 5, 182, 92, 2, 570, 572, 5, 42, 22, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 213, 2, 2, 574, 575, 7, 210, 2, 2, 575, 579, 7, 293, 2, 2, 576, 577, 7, 266, 2, 2, 577, 578, 7, 211, 2, 2, 578, 580, 5, 60, 31, 2, 579, 576, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 1055, 3, 2, 2, 2, 581, 582, 7, 13, 2, 2, 582, 583, 7, 229, 2, 2, 583, 585, 5, 182, 92, 2, 584, 586, 5, 42, 22, 2, 585, 584, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 588, 7, 213, 2, 2, 588, 589, 7, 211, 2, 2, 589, 590, 5, 60, 31, 2, 590, 1055, 3, 2, 2, 2, 591, 592, 7, 13, 2, 2, 592, 593, 9, 7, 2, 2, 593, 594, 5, 182, 92, 2, 594, 598, 7, 10, 2, 2, 595, 596, 7, 109, 2, 2, 596, 597, 7, 152, 2, 2, 597, 599, 7, 82, 2, 2, 598, 595, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 601, 3, 2, 2, 2, 600, 602, 5, 40, 21, 2, 601, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 601, 3, 2, 2, 2, 603, 604, 3, 2, 2, 2, 604, 1055, 3, 2, 2, 2, 605, 606, 7, 13, 2, 2, 606, 607, 7, 229, 2, 2, 607, 608, 5, 182, 92, 2, 608, 609, 5, 42, 22, 2, 609, 610, 7, 190, 2, 2, 610, 611, 7, 237, 2, 2, 611, 612, 5, 42, 22, 2, 612, 1055, 3, 2, 2, 2, 613, 614, 7, 13, 2, 2, 614, 615, 9, 7, 2, 2, 615, 616, 5, 182, 92, 2, 616, 619, 7, 75, 2, 2, 617, 618, 7, 109, 2, 2, 618, 620, 7, 82, 2, 2, 619, 617, 3, 2, 2, 2, 619, 620, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 626, 5, 42, 22, 2, 622, 623, 7, 290, 2, 2, 623, 625, 5, 42, 22, 2, 624, 622, 3, 2, 2, 2, 625, 628, 3, 2, 2, 2, 626, 624, 3, 2, 2, 2, 626, 627, 3, 2, 2, 2, 627, 630, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 629, 631, 7, 181, 2, 2, 630, 629, 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 1055, 3, 2, 2, 2, 632, 633, 7, 13, 2, 2, 633, 634, 7, 229, 2, 2, 634, 636, 5, 182, 92, 2, 635, 637, 5, 42, 22, 2, 636, 635, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 638, 3, 2, 2, 2, 638, 639, 7, 213, 2, 2, 639, 640, 5, 32, 17, 2, 640, 1055, 3, 2, 2, 2, 641, 642, 7, 13, 2, 2, 642, 643, 7, 229, 2, 2, 643, 644, 5, 182, 92, 2, 644, 645, 7, 186, 2, 2, 645, 646, 7, 172, 2, 2, 646, 1055, 3, 2, 2, 2, 647, 648, 7, 75, 2, 2, 648, 651, 7, 229, 2, 2, 649, 650, 7, 109, 2, 2, 650, 652, 7, 82, 2, 2, 651, 649, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 5, 182, 92, 2, 654, 656, 7, 181, 2, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 1055, 3, 2, 2, 2, 657, 658, 7, 75, 2, 2, 658, 661, 7, 261, 2, 2, 659, 660, 7, 109, 2, 2, 660, 662, 7, 82, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 1055, 5, 182, 92, 2, 664, 667, 7, 51, 2, 2, 665, 666, 7, 161, 2, 2, 666, 668, 7, 192, 2, 2, 667, 665, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 673, 3, 2, 2, 2, 669, 671, 7, 103, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 674, 7, 233, 2, 2, 673, 670, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 679, 7, 261, 2, 2, 676, 677, 7, 109, 2, 2, 677, 678, 7, 152, 2, 2, 678, 680, 7, 82, 2, 2, 679, 676, 3, 2, 2, 2, 679, 680, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 683, 5, 182, 92, 2, 682, 684, 5, 166, 84, 2, 683, 682, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 693, 3, 2, 2, 2, 685, 692, 5, 34, 18, 2, 686, 687, 7, 171, 2, 2, 687, 688, 7, 157, 2, 2, 688, 692, 5, 158, 80, 2, 689, 690, 7, 232, 2, 2, 690, 692, 5, 60, 31, 2, 691, 685, 3, 2, 2, 2, 691, 686, 3, 2, 2, 2, 691, 689, 3, 2, 2, 2, 692, 695, 3, 2, 2, 2, 693, 691, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 696, 3, 2, 2, 2, 695, 693, 3, 2, 2, 2, 696, 697, 7, 20, 2, 2, 697, 698, 5, 36, 19, 2, 698, 1055, 3, 2, 2, 2, 699, 702, 7, 51, 2, 2, 700, 701, 7, 161, 2, 2, 701, 703, 7, 192, 2, 2, 702, 700, 3, 2, 2, 2, 702, 703, 3, 2, 2, 2, 703, 705, 3, 2, 2, 2, 704, 706, 7, 103, 2, 2, 705, 704, 3, 2, 2, 2, 705, 706, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 7, 233, 2, 2, 708, 709, 7, 261, 2, 2, 709, 714, 5, 184, 93, 2, 710, 711, 7, 3, 2, 2, 711, 712, 5, 244, 123, 2, 712, 713, 7, 4, 2, 2, 713, 715, 3, 2, 2, 2, 714, 710, 3, 2, 2, 2, 714, 715, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 719, 5, 56, 29, 2, 717, 718, 7, 160, 2, 2, 718, 720, 5, 60, 31, 2, 719, 717, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 1055, 3, 2, 2, 2, 721, 722, 7, 13, 2, 2, 722, 723, 7, 261, 2, 2, 723, 725, 5, 182, 92, 2, 724, 726, 7, 20, 2, 2, 725, 724, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 727, 3, 2, 2, 2, 727, 728, 5, 36, 19, 2, 728, 1055, 3, 2, 2, 2, 729, 732, 7, 51, 2, 2, 730, 731, 7, 161, 2, 2, 731, 733, 7, 192, 2, 2, 732, 730, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 735, 3, 2, 2, 2, 734, 736, 7, 233, 2, 2, 735, 734, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 741, 7, 101, 2, 2, 738, 739, 7, 109, 2, 2, 739, 740, 7, 152, 2, 2, 740, 742, 7, 82, 2, 2, 741, 738, 3, 2, 2, 2, 741, 742, 3, 2, 2, 2, 742, 743, 3, 2, 2, 2, 743, 744, 5, 182, 92, 2, 744, 745, 7, 20, 2, 2, 745, 755, 7, 293, 2, 2, 746, 747, 7, 259, 2, 2, 747, 752, 5, 78, 40, 2, 748, 749, 7, 290, 2, 2, 749, 751, 5, 78, 40, 2, 750, 748, 3, 2, 2, 2, 751, 754, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 756, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 755, 746, 3, 2, 2, 2, 755, 756, 3, 2, 2, 2, 756, 1055, 3, 2, 2, 2, 757, 759, 7, 75, 2, 2, 758, 760, 7, 233, 2, 2, 759, 758, 3, 2, 2, 2, 759, 760, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 764, 7, 101, 2, 2, 762, 763, 7, 109, 2, 2, 763, 765, 7, 82, 2, 2, 764, 762, 3, 2, 2, 2, 764, 765, 3, 2, 2, 2, 765, 766, 3, 2, 2, 2, 766, 1055, 5, 182, 92, 2, 767, 769, 7, 83, 2, 2, 768, 770, 9, 9, 2, 2, 769, 768, 3, 2, 2, 2, 769, 770, 3, 2, 2, 2, 770, 771, 3, 2, 2, 2, 771, 1055, 5, 16, 9, 2, 772, 773, 7, 216, 2, 2, 773, 776, 7, 230, 2, 2, 774, 775, 9, 5, 2, 2, 775, 777, 5, 182, 92, 2, 776, 774, 3, 2, 2, 2, 776, 777, 3, 2, 2, 2, 777, 782, 3, 2, 2, 2, 778, 780, 7, 131, 2, 2, 779, 778, 3, 2, 2, 2, 779, 780, 3, 2, 2, 2, 780, 781, 3, 2, 2, 2, 781, 783, 7, 293, 2, 2, 782, 779, 3, 2, 2, 2, 782, 783, 3, 2, 2, 2, 783, 1055, 3, 2, 2, 2, 784, 785, 7, 216, 2, 2, 785, 786, 7, 229, 2, 2, 786, 789, 7, 85, 2, 2, 787, 788, 9, 5, 2, 2, 788, 790, 5, 182, 92, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 792, 7, 131, 2, 2, 792, 794, 7, 293, 2, 2, 793, 795, 5, 42, 22, 2, 794, 793, 3, 2, 2, 2, 794, 795, 3, 2, 2, 2, 795, 1055, 3, 2, 2, 2, 796, 797, 7, 216, 2, 2, 797, 798, 7, 232, 2, 2, 798, 803, 5, 182, 92, 2, 799, 800, 7, 3, 2, 2, 800, 801, 5, 64, 33, 2, 801, 802, 7, 4, 2, 2, 802, 804, 3, 2, 2, 2, 803, 799, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 1055, 3, 2, 2, 2, 805, 806, 7, 216, 2, 2, 806, 807, 7, 42, 2, 2, 807, 808, 9, 5, 2, 2, 808, 811, 5, 182, 92, 2, 809, 810, 9, 5, 2, 2, 810, 812, 5, 182, 92, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 1055, 3, 2, 2, 2, 813, 814, 7, 216, 2, 2, 814, 817, 7, 262, 2, 2, 815, 816, 9, 5, 2, 2, 816, 818, 5, 182, 92, 2, 817, 815, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 823, 3, 2, 2, 2, 819, 821, 7, 131, 2, 2, 820, 819, 3, 2, 2, 2, 820, 821, 3, 2, 2, 2, 821, 822, 3, 2, 2, 2, 822, 824, 7, 293, 2, 2, 823, 820, 3, 2, 2, 2, 823, 824, 3, 2, 2, 2, 824, 1055, 3, 2, 2, 2, 825, 826, 7, 216, 2, 2, 826, 827, 7, 172, 2, 2, 827, 829, 5, 182, 92, 2, 828, 830, 5, 42, 22, 2, 829, 828, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 1055, 3, 2, 2, 2, 831, 833, 7, 216, 2, 2, 832, 834, 5, 274, 138, 2, 833, 832, 3, 2, 2, 2, 833, 834, 3, 2, 2, 2, 834, 835, 3, 2, 2, 2, 835, 843, 7, 102, 2, 2, 836, 838, 7, 131, 2, 2, 837, 836, 3, 2, 2, 2, 837, 838, 3, 2, 2, 2, 838, 841, 3, 2, 2, 2, 839, 842, 5, 182, 92, 2, 840, 842, 7, 293, 2, 2, 841, 839, 3, 2, 2, 2, 841, 840, 3, 2, 2, 2, 842, 844, 3, 2, 2, 2, 843, 837, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 1055, 3, 2, 2, 2, 845, 846, 7, 216, 2, 2, 846, 847, 7, 51, 2, 2, 847, 848, 7, 229, 2, 2, 848, 851, 5, 182, 92, 2, 849, 850, 7, 20, 2, 2, 850, 852, 7, 210, 2, 2, 851, 849, 3, 2, 2, 2, 851, 852, 3, 2, 2, 2, 852, 1055, 3, 2, 2, 2, 853, 854, 7, 216, 2, 2, 854, 855, 7, 54, 2, 2, 855, 1055, 7, 148, 2, 2, 856, 857, 9, 10, 2, 2, 857, 859, 7, 101, 2, 2, 858, 860, 7, 85, 2, 2, 859, 858, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 1055, 5, 48, 25, 2, 862, 863, 9, 10, 2, 2, 863, 865, 5, 46, 24, 2, 864, 866, 7, 85, 2, 2, 865, 864, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 867, 3, 2, 2, 2, 867, 868, 5, 182, 92, 2, 868, 1055, 3, 2, 2, 2, 869, 871, 9, 10, 2, 2, 870, 872, 7, 229, 2, 2, 871, 870, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 874, 3, 2, 2, 2, 873, 875, 9, 11, 2, 2, 874, 873, 3, 2, 2, 2, 874, 875, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 878, 5, 182, 92, 2, 877, 879, 5, 42, 22, 2, 878, 877, 3, 2, 2, 2, 878, 879, 3, 2, 2, 2, 879, 881, 3, 2, 2, 2, 880, 882, 5, 50, 26, 2, 881, 880, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 1055, 3, 2, 2, 2, 883, 885, 9, 10, 2, 2, 884, 886, 7, 182, 2, 2, 885, 884, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 887, 3, 2, 2, 2, 887, 1055, 5, 36, 19, 2, 888, 889, 7, 43, 2, 2, 889, 890, 7, 157, 2, 2, 890, 891, 5, 46, 24, 2, 891, 892, 5, 182, 92, 2, 892, 893, 7, 122, 2, 2, 893, 894, 9, 12, 2, 2, 894, 1055, 3, 2, 2, 2, 895, 896, 7, 43, 2, 2, 896, 897, 7, 157, 2, 2, 897, 898, 7, 229, 2, 2, 898, 899, 5, 182, 92, 2, 899, 900, 7, 122, 2, 2, 900, 901, 9, 12, 2, 2, 901, 1055, 3, 2, 2, 2, 902, 903, 7, 189, 2, 2, 903, 904, 7, 229, 2, 2, 904, 1055, 5, 182, 92, 2, 905, 906, 7, 189, 2, 2, 906, 907, 7, 101, 2, 2, 907, 1055, 5, 182, 92, 2, 908, 916, 7, 189, 2, 2, 909, 917, 7, 293, 2, 2, 910, 912, 11, 2, 2, 2, 911, 910, 3, 2, 2, 2, 912, 915, 3, 2, 2, 2, 913, 914, 3, 2, 2, 2, 913, 911, 3, 2, 2, 2, 914, 917, 3, 2, 2, 2, 915, 913, 3, 2, 2, 2, 916, 909, 3, 2, 2, 2, 916, 913, 3, 2, 2, 2, 917, 1055, 3, 2, 2, 2, 918, 920, 7, 29, 2, 2, 919, 921, 7, 128, 2, 2, 920, 919, 3, 2, 2, 2, 920, 921, 3, 2, 2, 2, 921, 922, 3, 2, 2, 2, 922, 923, 7, 229, 2, 2, 923, 926, 5, 182, 92, 2, 924, 925, 7, 160, 2, 2, 925, 927, 5, 60, 31, 2, 926, 924, 3, 2, 2, 2, 926, 927, 3, 2, 2, 2, 927, 932, 3, 2, 2, 2, 928, 930, 7, 20, 2, 2, 929, 928, 3, 2, 2, 2, 929, 930, 3, 2, 2, 2, 930, 931, 3, 2, 2, 2, 931, 933, 5, 36, 19, 2, 932, 929, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 1055, 3, 2, 2, 2, 934, 935, 7, 250, 2, 2, 935, 938, 7, 229, 2, 2, 936, 937, 7, 109, 2, 2, 937, 939, 7, 82, 2, 2, 938, 936, 3, 2, 2, 2, 938, 939, 3, 2, 2, 2, 939, 940, 3, 2, 2, 2, 940, 1055, 5, 182, 92, 2, 941, 942, 7, 35, 2, 2, 942, 1055, 7, 29, 2, 2, 943, 944, 7, 135, 2, 2, 944, 946, 7, 60, 2, 2, 945, 947, 7, 136, 2, 2, 946, 945, 3, 2, 2, 2, 946, 947, 3, 2, 2, 2, 947, 948, 3, 2, 2, 2, 948, 949, 7, 116, 2, 2, 949, 951, 7, 293, 2, 2, 950, 952, 7, 169, 2, 2, 951, 950, 3, 2, 2, 2, 951, 952, 3, 2, 2, 2, 952, 953, 3, 2, 2, 2, 953, 954, 7, 121, 2, 2, 954, 955, 7, 229, 2, 2, 955, 957, 5, 182, 92, 2, 956, 958, 5, 42, 22, 2, 957, 956, 3, 2, 2, 2, 957, 958, 3, 2, 2, 2, 958, 1055, 3, 2, 2, 2, 959, 960, 7, 245, 2, 2, 960, 961, 7, 229, 2, 2, 961, 963, 5, 182, 92, 2, 962, 964, 5, 42, 22, 2, 963, 962, 3, 2, 2, 2, 963, 964, 3, 2, 2, 2, 964, 1055, 3, 2, 2, 2, 965, 966, 7, 147, 2, 2, 966, 967, 7, 191, 2, 2, 967, 968, 7, 229, 2, 2, 968, 971, 5, 182, 92, 2, 969, 970, 9, 13, 2, 2, 970, 972, 7, 172, 2, 2, 971, 969, 3, 2, 2, 2, 971, 972, 3, 2, 2, 2, 972, 1055, 3, 2, 2, 2, 973, 974, 9, 14, 2, 2, 974, 978, 5, 274, 138, 2, 975, 977, 11, 2, 2, 2, 976, 975, 3, 2, 2, 2, 977, 980, 3, 2, 2, 2, 978, 979, 3, 2, 2, 2, 978, 976, 3, 2, 2, 2, 979, 1055, 3, 2, 2, 2, 980, 978, 3, 2, 2, 2, 981, 982, 7, 213, 2, 2, 982, 986, 7, 199, 2, 2, 983, 985, 11, 2, 2, 2, 984, 983, 3, 2, 2, 2, 985, 988, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 986, 984, 3, 2, 2, 2, 987, 1055, 3, 2, 2, 2, 988, 986, 3, 2, 2, 2, 989, 990, 7, 213, 2, 2, 990, 991, 7, 236, 2, 2, 991, 992, 7, 268, 2, 2, 992, 1055, 5, 224, 113, 2, 993, 994, 7, 213, 2, 2, 994, 995, 7, 236, 2, 2, 995, 996, 7, 268, 2, 2, 996, 1055, 9, 15, 2, 2, 997, 998, 7, 213, 2, 2, 998, 999, 7, 236, 2, 2, 999, 1003, 7, 268, 2, 2, 1000, 1002, 11, 2, 2, 2, 1001, 1000, 3, 2, 2, 2, 1002, 1005, 3, 2, 2, 2, 1003, 1004, 3, 2, 2, 2, 1003, 1001, 3, 2, 2, 2, 1004, 1055, 3, 2, 2, 2, 1005, 1003, 3, 2, 2, 2, 1006, 1007, 7, 213, 2, 2, 1007, 1008, 5, 18, 10, 2, 1008, 1009, 7, 269, 2, 2, 1009, 1010, 5, 20, 11, 2, 1010, 1055, 3, 2, 2, 2, 1011, 1012, 7, 213, 2, 2, 1012, 1020, 5, 18, 10, 2, 1013, 1017, 7, 269, 2, 2, 1014, 1016, 11, 2, 2, 2, 1015, 1014, 3, 2, 2, 2, 1016, 1019, 3, 2, 2, 2, 1017, 1018, 3, 2, 2, 2, 1017, 1015, 3, 2, 2, 2, 1018, 1021, 3, 2, 2, 2, 1019, 1017, 3, 2, 2, 2, 1020, 1013, 3, 2, 2, 2, 1020, 1021, 3, 2, 2, 2, 1021, 1055, 3, 2, 2, 2, 1022, 1026, 7, 213, 2, 2, 1023, 1025, 11, 2, 2, 2, 1024, 1023, 3, 2, 2, 2, 1025, 1028, 3, 2, 2, 2, 1026, 1027, 3, 2, 2, 2, 1026, 1024, 3, 2, 2, 2, 1027, 1029, 3, 2, 2, 2, 1028, 1026, 3, 2, 2, 2, 1029, 1030, 7, 269, 2, 2, 1030, 1055, 5, 20, 11, 2, 1031, 1035, 7, 213, 2, 2, 1032, 1034, 11, 2, 2, 2, 1033, 1032, 3, 2, 2, 2, 1034, 1037, 3, 2, 2, 2, 1035, 1036, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1055, 3, 2, 2, 2, 1037, 1035, 3, 2, 2, 2, 1038, 1039, 7, 193, 2, 2, 1039, 1055, 5, 18, 10, 2, 1040, 1044, 7, 193, 2, 2, 1041, 1043, 11, 2, 2, 2, 1042, 1041, 3, 2, 2, 2, 1043, 1046, 3, 2, 2, 2, 1044, 1045, 3, 2, 2, 2, 1044, 1042, 3, 2, 2, 2, 1045, 1055, 3, 2, 2, 2, 1046, 1044, 3, 2, 2, 2, 1047, 1051, 5, 22, 12, 2, 1048, 1050, 11, 2, 2, 2, 1049, 1048, 3, 2, 2, 2, 1050, 1053, 3, 2, 2, 2, 1051, 1052, 3, 2, 2, 2, 1051, 1049, 3, 2, 2, 2, 1052, 1055, 3, 2, 2, 2, 1053, 1051, 3, 2, 2, 2, 1054, 317, 3, 2, 2, 2, 1054, 319, 3, 2, 2, 2, 1054, 322, 3, 2, 2, 2, 1054, 327, 3, 2, 2, 2, 1054, 345, 3, 2, 2, 2, 1054, 352, 3, 2, 2, 2, 1054, 358, 3, 2, 2, 2, 1054, 368, 3, 2, 2, 2, 1054, 380, 3, 2, 2, 2, 1054, 397, 3, 2, 2, 2, 1054, 418, 3, 2, 2, 2, 1054, 435, 3, 2, 2, 2, 1054, 452, 3, 2, 2, 2, 1054, 463, 3, 2, 2, 2, 1054, 470, 3, 2, 2, 2, 1054, 479, 3, 2, 2, 2, 1054, 488, 3, 2, 2, 2, 1054, 497, 3, 2, 2, 2, 1054, 504, 3, 2, 2, 2, 1054, 511, 3, 2, 2, 2, 1054, 518, 3, 2, 2, 2, 1054, 529, 3, 2, 2, 2, 1054, 540, 3, 2, 2, 2, 1054, 555, 3, 2, 2, 2, 1054, 567, 3, 2, 2, 2, 1054, 581, 3, 2, 2, 2, 1054, 591, 3, 2, 2, 2, 1054, 605, 3, 2, 2, 2, 1054, 613, 3, 2, 2, 2, 1054, 632, 3, 2, 2, 2, 1054, 641, 3, 2, 2, 2, 1054, 647, 3, 2, 2, 2, 1054, 657, 3, 2, 2, 2, 1054, 664, 3, 2, 2, 2, 1054, 699, 3, 2, 2, 2, 1054, 721, 3, 2, 2, 2, 1054, 729, 3, 2, 2, 2, 1054, 757, 3, 2, 2, 2, 1054, 767, 3, 2, 2, 2, 1054, 772, 3, 2, 2, 2, 1054, 784, 3, 2, 2, 2, 1054, 796, 3, 2, 2, 2, 1054, 805, 3, 2, 2, 2, 1054, 813, 3, 2, 2, 2, 1054, 825, 3, 2, 2, 2, 1054, 831, 3, 2, 2, 2, 1054, 845, 3, 2, 2, 2, 1054, 853, 3, 2, 2, 2, 1054, 856, 3, 2, 2, 2, 1054, 862, 3, 2, 2, 2, 1054, 869, 3, 2, 2, 2, 1054, 883, 3, 2, 2, 2, 1054, 888, 3, 2, 2, 2, 1054, 895, 3, 2, 2, 2, 1054, 902, 3, 2, 2, 2, 1054, 905, 3, 2, 2, 2, 1054, 908, 3, 2, 2, 2, 1054, 918, 3, 2, 2, 2, 1054, 934, 3, 2, 2, 2, 1054, 941, 3, 2, 2, 2, 1054, 943, 3, 2, 2, 2, 1054, 959, 3, 2, 2, 2, 1054, 965, 3, 2, 2, 2, 1054, 973, 3, 2, 2, 2, 1054, 981, 3, 2, 2, 2, 1054, 989, 3, 2, 2, 2, 1054, 993, 3, 2, 2, 2, 1054, 997, 3, 2, 2, 2, 1054, 1006, 3, 2, 2, 2, 1054, 1011, 3, 2, 2, 2, 1054, 1022, 3, 2, 2, 2, 1054, 1031, 3, 2, 2, 2, 1054, 1038, 3, 2, 2, 2, 1054, 1040, 3, 2, 2, 2, 1054, 1047, 3, 2, 2, 2, 1055, 17, 3, 2, 2, 2, 1056, 1057, 5, 278, 140, 2, 1057, 19, 3, 2, 2, 2, 1058, 1059, 5, 278, 140, 2, 1059, 21, 3, 2, 2, 2, 1060, 1061, 7, 51, 2, 2, 1061, 1229, 7, 199, 2, 2, 1062, 1063, 7, 75, 2, 2, 1063, 1229, 7, 199, 2, 2, 1064, 1066, 7, 104, 2, 2, 1065, 1067, 7, 199, 2, 2, 1066, 1065, 3, 2, 2, 2, 1066, 1067, 3, 2, 2, 2, 1067, 1229, 3, 2, 2, 2, 1068, 1070, 7, 196, 2, 2, 1069, 1071, 7, 199, 2, 2, 1070, 1069, 3, 2, 2, 2, 1070, 1071, 3, 2, 2, 2, 1071, 1229, 3, 2, 2, 2, 1072, 1073, 7, 216, 2, 2, 1073, 1229, 7, 104, 2, 2, 1074, 1075, 7, 216, 2, 2, 1075, 1077, 7, 199, 2, 2, 1076, 1078, 7, 104, 2, 2, 1077, 1076, 3, 2, 2, 2, 1077, 1078, 3, 2, 2, 2, 1078, 1229, 3, 2, 2, 2, 1079, 1080, 7, 216, 2, 2, 1080, 1229, 7, 179, 2, 2, 1081, 1082, 7, 216, 2, 2, 1082, 1229, 7, 200, 2, 2, 1083, 1084, 7, 216, 2, 2, 1084, 1085, 7, 54, 2, 2, 1085, 1229, 7, 200, 2, 2, 1086, 1087, 7, 84, 2, 2, 1087, 1229, 7, 229, 2, 2, 1088, 1089, 7, 111, 2, 2, 1089, 1229, 7, 229, 2, 2, 1090, 1091, 7, 216, 2, 2, 1091, 1229, 7, 46, 2, 2, 1092, 1093, 7, 216, 2, 2, 1093, 1094, 7, 51, 2, 2, 1094, 1229, 7, 229, 2, 2, 1095, 1096, 7, 216, 2, 2, 1096, 1229, 7, 241, 2, 2, 1097, 1098, 7, 216, 2, 2, 1098, 1229, 7, 114, 2, 2, 1099, 1100, 7, 216, 2, 2, 1100, 1229, 7, 139, 2, 2, 1101, 1102, 7, 51, 2, 2, 1102, 1229, 7, 113, 2, 2, 1103, 1104, 7, 75, 2, 2, 1104, 1229, 7, 113, 2, 2, 1105, 1106, 7, 13, 2, 2, 1106, 1229, 7, 113, 2, 2, 1107, 1108, 7, 138, 2, 2, 1108, 1229, 7, 229, 2, 2, 1109, 1110, 7, 138, 2, 2, 1110, 1229, 7, 61, 2, 2, 1111, 1112, 7, 254, 2, 2, 1112, 1229, 7, 229, 2, 2, 1113, 1114, 7, 254, 2, 2, 1114, 1229, 7, 61, 2, 2, 1115, 1116, 7, 51, 2, 2, 1116, 1117, 7, 233, 2, 2, 1117, 1229, 7, 141, 2, 2, 1118, 1119, 7, 75, 2, 2, 1119, 1120, 7, 233, 2, 2, 1120, 1229, 7, 141, 2, 2, 1121, 1122, 7, 13, 2, 2, 1122, 1123, 7, 229, 2, 2, 1123, 1124, 5, 184, 93, 2, 1124, 1125, 7, 152, 2, 2, 1125, 1126, 7, 37, 2, 2, 1126, 1229, 3, 2, 2, 2, 1127, 1128, 7, 13, 2, 2, 1128, 1129, 7, 229, 2, 2, 1129, 1130, 5, 184, 93, 2, 1130, 1131, 7, 37, 2, 2, 1131, 1132, 7, 28, 2, 2, 1132, 1229, 3, 2, 2, 2, 1133, 1134, 7, 13, 2, 2, 1134, 1135, 7, 229, 2, 2, 1135, 1136, 5, 184, 93, 2, 1136, 1137, 7, 152, 2, 2, 1137, 1138, 7, 220, 2, 2, 1138, 1229, 3, 2, 2, 2, 1139, 1140, 7, 13, 2, 2, 1140, 1141, 7, 229, 2, 2, 1141, 1142, 5, 184, 93, 2, 1142, 1143, 7, 217, 2, 2, 1143, 1144, 7, 28, 2, 2, 1144, 1229, 3, 2, 2, 2, 1145, 1146, 7, 13, 2, 2, 1146, 1147, 7, 229, 2, 2, 1147, 1148, 5, 184, 93, 2, 1148, 1149, 7, 152, 2, 2, 1149, 1150, 7, 217, 2, 2, 1150, 1229, 3, 2, 2, 2, 1151, 1152, 7, 13, 2, 2, 1152, 1153, 7, 229, 2, 2, 1153, 1154, 5, 184, 93, 2, 1154, 1155, 7, 152, 2, 2, 1155, 1156, 7, 223, 2, 2, 1156, 1157, 7, 20, 2, 2, 1157, 1158, 7, 70, 2, 2, 1158, 1229, 3, 2, 2, 2, 1159, 1160, 7, 13, 2, 2, 1160, 1161, 7, 229, 2, 2, 1161, 1162, 5, 184, 93, 2, 1162, 1163, 7, 213, 2, 2, 1163, 1164, 7, 217, 2, 2, 1164, 1165, 7, 137, 2, 2, 1165, 1229, 3, 2, 2, 2, 1166, 1167, 7, 13, 2, 2, 1167, 1168, 7, 229, 2, 2, 1168, 1169, 5, 184, 93, 2, 1169, 1170, 7, 81, 2, 2, 1170, 1171, 7, 170, 2, 2, 1171, 1229, 3, 2, 2, 2, 1172, 1173, 7, 13, 2, 2, 1173, 1174, 7, 229, 2, 2, 1174, 1175, 5, 184, 93, 2, 1175, 1176, 7, 18, 2, 2, 1176, 1177, 7, 170, 2, 2, 1177, 1229, 3, 2, 2, 2, 1178, 1179, 7, 13, 2, 2, 1179, 1180, 7, 229, 2, 2, 1180, 1181, 5, 184, 93, 2, 1181, 1182, 7, 248, 2, 2, 1182, 1183, 7, 170, 2, 2, 1183, 1229, 3, 2, 2, 2, 1184, 1185, 7, 13, 2, 2, 1185, 1186, 7, 229, 2, 2, 1186, 1187, 5, 184, 93, 2, 1187, 1188, 7, 238, 2, 2, 1188, 1229, 3, 2, 2, 2, 1189, 1190, 7, 13, 2, 2, 1190, 1191, 7, 229, 2, 2, 1191, 1193, 5, 184, 93, 2, 1192, 1194, 5, 42, 22, 2, 1193, 1192, 3, 2, 2, 2, 1193, 1194, 3, 2, 2, 2, 1194, 1195, 3, 2, 2, 2, 1195, 1196, 7, 45, 2, 2, 1196, 1229, 3, 2, 2, 2, 1197, 1198, 7, 13, 2, 2, 1198, 1199, 7, 229, 2, 2, 1199, 1201, 5, 184, 93, 2, 1200, 1202, 5, 42, 22, 2, 1201, 1200, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 1203, 3, 2, 2, 2, 1203, 1204, 7, 48, 2, 2, 1204, 1229, 3, 2, 2, 2, 1205, 1206, 7, 13, 2, 2, 1206, 1207, 7, 229, 2, 2, 1207, 1209, 5, 184, 93, 2, 1208, 1210, 5, 42, 22, 2, 1209, 1208, 3, 2, 2, 2, 1209, 1210, 3, 2, 2, 2, 1210, 1211, 3, 2, 2, 2, 1211, 1212, 7, 213, 2, 2, 1212, 1213, 7, 92, 2, 2, 1213, 1229, 3, 2, 2, 2, 1214, 1215, 7, 13, 2, 2, 1215, 1216, 7, 229, 2, 2, 1216, 1218, 5, 184, 93, 2, 1217, 1219, 5, 42, 22, 2, 1218, 1217, 3, 2, 2, 2, 1218, 1219, 3, 2, 2, 2, 1219, 1220, 3, 2, 2, 2, 1220, 1221, 7, 192, 2, 2, 1221, 1222, 7, 42, 2, 2, 1222, 1229, 3, 2, 2, 2, 1223, 1224, 7, 221, 2, 2, 1224, 1229, 7, 240, 2, 2, 1225, 1229, 7, 44, 2, 2, 1226, 1229, 7, 201, 2, 2, 1227, 1229, 7, 69, 2, 2, 1228, 1060, 3, 2, 2, 2, 1228, 1062, 3, 2, 2, 2, 1228, 1064, 3, 2, 2, 2, 1228, 1068, 3, 2, 2, 2, 1228, 1072, 3, 2, 2, 2, 1228, 1074, 3, 2, 2, 2, 1228, 1079, 3, 2, 2, 2, 1228, 1081, 3, 2, 2, 2, 1228, 1083, 3, 2, 2, 2, 1228, 1086, 3, 2, 2, 2, 1228, 1088, 3, 2, 2, 2, 1228, 1090, 3, 2, 2, 2, 1228, 1092, 3, 2, 2, 2, 1228, 1095, 3, 2, 2, 2, 1228, 1097, 3, 2, 2, 2, 1228, 1099, 3, 2, 2, 2, 1228, 1101, 3, 2, 2, 2, 1228, 1103, 3, 2, 2, 2, 1228, 1105, 3, 2, 2, 2, 1228, 1107, 3, 2, 2, 2, 1228, 1109, 3, 2, 2, 2, 1228, 1111, 3, 2, 2, 2, 1228, 1113, 3, 2, 2, 2, 1228, 1115, 3, 2, 2, 2, 1228, 1118, 3, 2, 2, 2, 1228, 1121, 3, 2, 2, 2, 1228, 1127, 3, 2, 2, 2, 1228, 1133, 3, 2, 2, 2, 1228, 1139, 3, 2, 2, 2, 1228, 1145, 3, 2, 2, 2, 1228, 1151, 3, 2, 2, 2, 1228, 1159, 3, 2, 2, 2, 1228, 1166, 3, 2, 2, 2, 1228, 1172, 3, 2, 2, 2, 1228, 1178, 3, 2, 2, 2, 1228, 1184, 3, 2, 2, 2, 1228, 1189, 3, 2, 2, 2, 1228, 1197, 3, 2, 2, 2, 1228, 1205, 3, 2, 2, 2, 1228, 1214, 3, 2, 2, 2, 1228, 1223, 3, 2, 2, 2, 1228, 1225, 3, 2, 2, 2, 1228, 1226, 3, 2, 2, 2, 1228, 1227, 3, 2, 2, 2, 1229, 23, 3, 2, 2, 2, 1230, 1232, 7, 51, 2, 2, 1231, 1233, 7, 233, 2, 2, 1232, 1231, 3, 2, 2, 2, 1232, 1233, 3, 2, 2, 2, 1233, 1235, 3, 2, 2, 2, 1234, 1236, 7, 86, 2, 2, 1235, 1234, 3, 2, 2, 2, 1235, 1236, 3, 2, 2, 2, 1236, 1237, 3, 2, 2, 2, 1237, 1241, 7, 229, 2, 2, 1238, 1239, 7, 109, 2, 2, 1239, 1240, 7, 152, 2, 2, 1240, 1242, 7, 82, 2, 2, 1241, 1238, 3, 2, 2, 2, 1241, 1242, 3, 2, 2, 2, 1242, 1243, 3, 2, 2, 2, 1243, 1244, 5, 182, 92, 2, 1244, 25, 3, 2, 2, 2, 1245, 1246, 7, 51, 2, 2, 1246, 1248, 7, 161, 2, 2, 1247, 1245, 3, 2, 2, 2, 1247, 1248, 3, 2, 2, 2, 1248, 1249, 3, 2, 2, 2, 1249, 1250, 7, 192, 2, 2, 1250, 1251, 7, 229, 2, 2, 1251, 1252, 5, 182, 92, 2, 1252, 27, 3, 2, 2, 2, 1253, 1254, 7, 37, 2, 2, 1254, 1255, 7, 28, 2, 2, 1255, 1259, 5, 158, 80, 2, 1256, 1257, 7, 220, 2, 2, 1257, 1258, 7, 28, 2, 2, 1258, 1260, 5, 162, 82, 2, 1259, 1256, 3, 2, 2, 2, 1259, 1260, 3, 2, 2, 2, 1260, 1261, 3, 2, 2, 2, 1261, 1262, 7, 121, 2, 2, 1262, 1263, 7, 297, 2, 2, 1263, 1264, 7, 27, 2, 2, 1264, 29, 3, 2, 2, 2, 1265, 1266, 7, 217, 2, 2, 1266, 1267, 7, 28, 2, 2, 1267, 1268, 5, 158, 80, 2, 1268, 1271, 7, 157, 2, 2, 1269, 1272, 5, 68, 35, 2, 1270, 1272, 5, 70, 36, 2, 1271, 1269, 3, 2, 2, 2, 1271, 1270, 3, 2, 2, 2, 1272, 1276, 3, 2, 2, 2, 1273, 1274, 7, 223, 2, 2, 1274, 1275, 7, 20, 2, 2, 1275, 1277, 7, 70, 2, 2, 1276, 1273, 3, 2, 2, 2, 1276, 1277, 3, 2, 2, 2, 1277, 31, 3, 2, 2, 2, 1278, 1279, 7, 137, 2, 2, 1279, 1280, 7, 293, 2, 2, 1280, 33, 3, 2, 2, 2, 1281, 1282, 7, 43, 2, 2, 1282, 1283, 7, 293, 2, 2, 1283, 35, 3, 2, 2, 2, 1284, 1286, 5, 52, 27, 2, 1285, 1284, 3, 2, 2, 2, 1285, 1286, 3, 2, 2, 2, 1286, 1287, 3, 2, 2, 2, 1287, 1288, 5, 86, 44, 2, 1288, 1289, 5, 82, 42, 2, 1289, 37, 3, 2, 2, 2, 1290, 1291, 7, 118, 2, 2, 1291, 1293, 7, 169, 2, 2, 1292, 1294, 7, 229, 2, 2, 1293, 1292, 3, 2, 2, 2, 1293, 1294, 3, 2, 2, 2, 1294, 1295, 3, 2, 2, 2, 1295, 1302, 5, 182, 92, 2, 1296, 1300, 5, 42, 22, 2, 1297, 1298, 7, 109, 2, 2, 1298, 1299, 7, 152, 2, 2, 1299, 1301, 7, 82, 2, 2, 1300, 1297, 3, 2, 2, 2, 1300, 1301, 3, 2, 2, 2, 1301, 1303, 3, 2, 2, 2, 1302, 1296, 3, 2, 2, 2, 1302, 1303, 3, 2, 2, 2, 1303, 1305, 3, 2, 2, 2, 1304, 1306, 5, 158, 80, 2, 1305, 1304, 3, 2, 2, 2, 1305, 1306, 3, 2, 2, 2, 1306, 1352, 3, 2, 2, 2, 1307, 1308, 7, 118, 2, 2, 1308, 1310, 7, 121, 2, 2, 1309, 1311, 7, 229, 2, 2, 1310, 1309, 3, 2, 2, 2, 1310, 1311, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 5, 182, 92, 2, 1313, 1315, 5, 42, 22, 2, 1314, 1313, 3, 2, 2, 2, 1314, 1315, 3, 2, 2, 2, 1315, 1319, 3, 2, 2, 2, 1316, 1317, 7, 109, 2, 2, 1317, 1318, 7, 152, 2, 2, 1318, 1320, 7, 82, 2, 2, 1319, 1316, 3, 2, 2, 2, 1319, 1320, 3, 2, 2, 2, 1320, 1322, 3, 2, 2, 2, 1321, 1323, 5, 158, 80, 2, 1322, 1321, 3, 2, 2, 2, 1322, 1323, 3, 2, 2, 2, 1323, 1352, 3, 2, 2, 2, 1324, 1325, 7, 118, 2, 2, 1325, 1327, 7, 169, 2, 2, 1326, 1328, 7, 136, 2, 2, 1327, 1326, 3, 2, 2, 2, 1327, 1328, 3, 2, 2, 2, 1328, 1329, 3, 2, 2, 2, 1329, 1330, 7, 71, 2, 2, 1330, 1332, 7, 293, 2, 2, 1331, 1333, 5, 178, 90, 2, 1332, 1331, 3, 2, 2, 2, 1332, 1333, 3, 2, 2, 2, 1333, 1335, 3, 2, 2, 2, 1334, 1336, 5, 72, 37, 2, 1335, 1334, 3, 2, 2, 2, 1335, 1336, 3, 2, 2, 2, 1336, 1352, 3, 2, 2, 2, 1337, 1338, 7, 118, 2, 2, 1338, 1340, 7, 169, 2, 2, 1339, 1341, 7, 136, 2, 2, 1340, 1339, 3, 2, 2, 2, 1340, 1341, 3, 2, 2, 2, 1341, 1342, 3, 2, 2, 2, 1342, 1344, 7, 71, 2, 2, 1343, 1345, 7, 293, 2, 2, 1344, 1343, 3, 2, 2, 2, 1344, 1345, 3, 2, 2, 2, 1345, 1346, 3, 2, 2, 2, 1346, 1349, 5, 56, 29, 2, 1347, 1348, 7, 160, 2, 2, 1348, 1350, 5, 60, 31, 2, 1349, 1347, 3, 2, 2, 2, 1349, 1350, 3, 2, 2, 2, 1350, 1352, 3, 2, 2, 2, 1351, 1290, 3, 2, 2, 2, 1351, 1307, 3, 2, 2, 2, 1351, 1324, 3, 2, 2, 2, 1351, 1337, 3, 2, 2, 2, 1352, 39, 3, 2, 2, 2, 1353, 1355, 5, 42, 22, 2, 1354, 1356, 5, 32, 17, 2, 1355, 1354, 3, 2, 2, 2, 1355, 1356, 3, 2, 2, 2, 1356, 41, 3, 2, 2, 2, 1357, 1358, 7, 170, 2, 2, 1358, 1359, 7, 3, 2, 2, 1359, 1364, 5, 44, 23, 2, 1360, 1361, 7, 290, 2, 2, 1361, 1363, 5, 44, 23, 2, 1362, 1360, 3, 2, 2, 2, 1363, 1366, 3, 2, 2, 2, 1364, 1362, 3, 2, 2, 2, 1364, 1365, 3, 2, 2, 2, 1365, 1367, 3, 2, 2, 2, 1366, 1364, 3, 2, 2, 2, 1367, 1368, 7, 4, 2, 2, 1368, 43, 3, 2, 2, 2, 1369, 1372, 5, 274, 138, 2, 1370, 1371, 7, 269, 2, 2, 1371, 1373, 5, 214, 108, 2, 1372, 1370, 3, 2, 2, 2, 1372, 1373, 3, 2, 2, 2, 1373, 45, 3, 2, 2, 2, 1374, 1375, 9, 16, 2, 2, 1375, 47, 3, 2, 2, 2, 1376, 1382, 5, 268, 135, 2, 1377, 1382, 7, 293, 2, 2, 1378, 1382, 5, 216, 109, 2, 1379, 1382, 5, 218, 110, 2, 1380, 1382, 5, 220, 111, 2, 1381, 1376, 3, 2, 2, 2, 1381, 1377, 3, 2, 2, 2, 1381, 1378, 3, 2, 2, 2, 1381, 1379, 3, 2, 2, 2, 1381, 1380, 3, 2, 2, 2, 1382, 49, 3, 2, 2, 2, 1383, 1388, 5, 274, 138, 2, 1384, 1385, 7, 289, 2, 2, 1385, 1387, 5, 274, 138, 2, 1386, 1384, 3, 2, 2, 2, 1387, 1390, 3, 2, 2, 2, 1388, 1386, 3, 2, 2, 2, 1388, 1389, 3, 2, 2, 2, 1389, 51, 3, 2, 2, 2, 1390, 1388, 3, 2, 2, 2, 1391, 1392, 7, 266, 2, 2, 1392, 1397, 5, 54, 28, 2, 1393, 1394, 7, 290, 2, 2, 1394, 1396, 5, 54, 28, 2, 1395, 1393, 3, 2, 2, 2, 1396, 1399, 3, 2, 2, 2, 1397, 1395, 3, 2, 2, 2, 1397, 1398, 3, 2, 2, 2, 1398, 53, 3, 2, 2, 2, 1399, 1397, 3, 2, 2, 2, 1400, 1402, 5, 270, 136, 2, 1401, 1403, 5, 158, 80, 2, 1402, 1401, 3, 2, 2, 2, 1402, 1403, 3, 2, 2, 2, 1403, 1405, 3, 2, 2, 2, 1404, 1406, 7, 20, 2, 2, 1405, 1404, 3, 2, 2, 2, 1405, 1406, 3, 2, 2, 2, 1406, 1407, 3, 2, 2, 2, 1407, 1408, 7, 3, 2, 2, 1408, 1409, 5, 36, 19, 2, 1409, 1410, 7, 4, 2, 2, 1410, 55, 3, 2, 2, 2, 1411, 1412, 7, 259, 2, 2, 1412, 1413, 5, 182, 92, 2, 1413, 57, 3, 2, 2, 2, 1414, 1415, 7, 160, 2, 2, 1415, 1428, 5, 60, 31, 2, 1416, 1417, 7, 171, 2, 2, 1417, 1418, 7, 28, 2, 2, 1418, 1428, 5, 192, 97, 2, 1419, 1428, 5, 30, 16, 2, 1420, 1428, 5, 28, 15, 2, 1421, 1428, 5, 178, 90, 2, 1422, 1428, 5, 72, 37, 2, 1423, 1428, 5, 32, 17, 2, 1424, 1428, 5, 34, 18, 2, 1425, 1426, 7, 232, 2, 2, 1426, 1428, 5, 60, 31, 2, 1427, 1414, 3, 2, 2, 2, 1427, 1416, 3, 2, 2, 2, 1427, 1419, 3, 2, 2, 2, 1427, 1420, 3, 2, 2, 2, 1427, 1421, 3, 2, 2, 2, 1427, 1422, 3, 2, 2, 2, 1427, 1423, 3, 2, 2, 2, 1427, 1424, 3, 2, 2, 2, 1427, 1425, 3, 2, 2, 2, 1428, 1431, 3, 2, 2, 2, 1429, 1427, 3, 2, 2, 2, 1429, 1430, 3, 2, 2, 2, 1430, 59, 3, 2, 2, 2, 1431, 1429, 3, 2, 2, 2, 1432, 1433, 7, 3, 2, 2, 1433, 1438, 5, 62, 32, 2, 1434, 1435, 7, 290, 2, 2, 1435, 1437, 5, 62, 32, 2, 1436, 1434, 3, 2, 2, 2, 1437, 1440, 3, 2, 2, 2, 1438, 1436, 3, 2, 2, 2, 1438, 1439, 3, 2, 2, 2, 1439, 1441, 3, 2, 2, 2, 1440, 1438, 3, 2, 2, 2, 1441, 1442, 7, 4, 2, 2, 1442, 61, 3, 2, 2, 2, 1443, 1448, 5, 64, 33, 2, 1444, 1446, 7, 269, 2, 2, 1445, 1444, 3, 2, 2, 2, 1445, 1446, 3, 2, 2, 2, 1446, 1447, 3, 2, 2, 2, 1447, 1449, 5, 66, 34, 2, 1448, 1445, 3, 2, 2, 2, 1448, 1449, 3, 2, 2, 2, 1449, 63, 3, 2, 2, 2, 1450, 1455, 5, 274, 138, 2, 1451, 1452, 7, 289, 2, 2, 1452, 1454, 5, 274, 138, 2, 1453, 1451, 3, 2, 2, 2, 1454, 1457, 3, 2, 2, 2, 1455, 1453, 3, 2, 2, 2, 1455, 1456, 3, 2, 2, 2, 1456, 1460, 3, 2, 2, 2, 1457, 1455, 3, 2, 2, 2, 1458, 1460, 7, 293, 2, 2, 1459, 1450, 3, 2, 2, 2, 1459, 1458, 3, 2, 2, 2, 1460, 65, 3, 2, 2, 2, 1461, 1466, 7, 297, 2, 2, 1462, 1466, 7, 299, 2, 2, 1463, 1466, 5, 222, 112, 2, 1464, 1466, 7, 293, 2, 2, 1465, 1461, 3, 2, 2, 2, 1465, 1462, 3, 2, 2, 2, 1465, 1463, 3, 2, 2, 2, 1465, 1464, 3, 2, 2, 2, 1466, 67, 3, 2, 2, 2, 1467, 1468, 7, 3, 2, 2, 1468, 1473, 5, 214, 108, 2, 1469, 1470, 7, 290, 2, 2, 1470, 1472, 5, 214, 108, 2, 1471, 1469, 3, 2, 2, 2, 1472, 1475, 3, 2, 2, 2, 1473, 1471, 3, 2, 2, 2, 1473, 1474, 3, 2, 2, 2, 1474, 1476, 3, 2, 2, 2, 1475, 1473, 3, 2, 2, 2, 1476, 1477, 7, 4, 2, 2, 1477, 69, 3, 2, 2, 2, 1478, 1479, 7, 3, 2, 2, 1479, 1484, 5, 68, 35, 2, 1480, 1481, 7, 290, 2, 2, 1481, 1483, 5, 68, 35, 2, 1482, 1480, 3, 2, 2, 2, 1483, 1486, 3, 2, 2, 2, 1484, 1482, 3, 2, 2, 2, 1484, 1485, 3, 2, 2, 2, 1485, 1487, 3, 2, 2, 2, 1486, 1484, 3, 2, 2, 2, 1487, 1488, 7, 4, 2, 2, 1488, 71, 3, 2, 2, 2, 1489, 1490, 7, 223, 2, 2, 1490, 1491, 7, 20, 2, 2, 1491, 1496, 5, 74, 38, 2, 1492, 1493, 7, 223, 2, 2, 1493, 1494, 7, 28, 2, 2, 1494, 1496, 5, 76, 39, 2, 1495, 1489, 3, 2, 2, 2, 1495, 1492, 3, 2, 2, 2, 1496, 73, 3, 2, 2, 2, 1497, 1498, 7, 117, 2, 2, 1498, 1499, 7, 293, 2, 2, 1499, 1500, 7, 165, 2, 2, 1500, 1503, 7, 293, 2, 2, 1501, 1503, 5, 274, 138, 2, 1502, 1497, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 75, 3, 2, 2, 2, 1504, 1508, 7, 293, 2, 2, 1505, 1506, 7, 266, 2, 2, 1506, 1507, 7, 211, 2, 2, 1507, 1509, 5, 60, 31, 2, 1508, 1505, 3, 2, 2, 2, 1508, 1509, 3, 2, 2, 2, 1509, 77, 3, 2, 2, 2, 1510, 1511, 5, 274, 138, 2, 1511, 1512, 7, 293, 2, 2, 1512, 79, 3, 2, 2, 2, 1513, 1514, 5, 38, 20, 2, 1514, 1515, 5, 86, 44, 2, 1515, 1516, 5, 82, 42, 2, 1516, 1565, 3, 2, 2, 2, 1517, 1519, 5, 124, 63, 2, 1518, 1520, 5, 84, 43, 2, 1519, 1518, 3, 2, 2, 2, 1520, 1521, 3, 2, 2, 2, 1521, 1519, 3, 2, 2, 2, 1521, 1522, 3, 2, 2, 2, 1522, 1565, 3, 2, 2, 2, 1523, 1524, 7, 65, 2, 2, 1524, 1525, 7, 99, 2, 2, 1525, 1526, 5, 182, 92, 2, 1526, 1528, 5, 176, 89, 2, 1527, 1529, 5, 116, 59, 2, 1528, 1527, 3, 2, 2, 2, 1528, 1529, 3, 2, 2, 2, 1529, 1565, 3, 2, 2, 2, 1530, 1531, 7, 256, 2, 2, 1531, 1532, 5, 182, 92, 2, 1532, 1533, 5, 176, 89, 2, 1533, 1535, 5, 102, 52, 2, 1534, 1536, 5, 116, 59, 2, 1535, 1534, 3, 2, 2, 2, 1535, 1536, 3, 2, 2, 2, 1536, 1565, 3, 2, 2, 2, 1537, 1538, 7, 144, 2, 2, 1538, 1539, 7, 121, 2, 2, 1539, 1540, 5, 182, 92, 2, 1540, 1541, 5, 176, 89, 2, 1541, 1547, 7, 259, 2, 2, 1542, 1548, 5, 182, 92, 2, 1543, 1544, 7, 3, 2, 2, 1544, 1545, 5, 36, 19, 2, 1545, 1546, 7, 4, 2, 2, 1546, 1548, 3, 2, 2, 2, 1547, 1542, 3, 2, 2, 2, 1547, 1543, 3, 2, 2, 2, 1548, 1549, 3, 2, 2, 2, 1549, 1550, 5, 176, 89, 2, 1550, 1551, 7, 157, 2, 2, 1551, 1555, 5, 204, 103, 2, 1552, 1554, 5, 104, 53, 2, 1553, 1552, 3, 2, 2, 2, 1554, 1557, 3, 2, 2, 2, 1555, 1553, 3, 2, 2, 2, 1555, 1556, 3, 2, 2, 2, 1556, 1561, 3, 2, 2, 2, 1557, 1555, 3, 2, 2, 2, 1558, 1560, 5, 106, 54, 2, 1559, 1558, 3, 2, 2, 2, 1560, 1563, 3, 2, 2, 2, 1561, 1559, 3, 2, 2, 2, 1561, 1562, 3, 2, 2, 2, 1562, 1565, 3, 2, 2, 2, 1563, 1561, 3, 2, 2, 2, 1564, 1513, 3, 2, 2, 2, 1564, 1517, 3, 2, 2, 2, 1564, 1523, 3, 2, 2, 2, 1564, 1530, 3, 2, 2, 2, 1564, 1537, 3, 2, 2, 2, 1565, 81, 3, 2, 2, 2, 1566, 1567, 7, 162, 2, 2, 1567, 1568, 7, 28, 2, 2, 1568, 1573, 5, 90, 46, 2, 1569, 1570, 7, 290, 2, 2, 1570, 1572, 5, 90, 46, 2, 1571, 1569, 3, 2, 2, 2, 1572, 1575, 3, 2, 2, 2, 1573, 1571, 3, 2, 2, 2, 1573, 1574, 3, 2, 2, 2, 1574, 1577, 3, 2, 2, 2, 1575, 1573, 3, 2, 2, 2, 1576, 1566, 3, 2, 2, 2, 1576, 1577, 3, 2, 2, 2, 1577, 1588, 3, 2, 2, 2, 1578, 1579, 7, 36, 2, 2, 1579, 1580, 7, 28, 2, 2, 1580, 1585, 5, 200, 101, 2, 1581, 1582, 7, 290, 2, 2, 1582, 1584, 5, 200, 101, 2, 1583, 1581, 3, 2, 2, 2, 1584, 1587, 3, 2, 2, 2, 1585, 1583, 3, 2, 2, 2, 1585, 1586, 3, 2, 2, 2, 1586, 1589, 3, 2, 2, 2, 1587, 1585, 3, 2, 2, 2, 1588, 1578, 3, 2, 2, 2, 1588, 1589, 3, 2, 2, 2, 1589, 1600, 3, 2, 2, 2, 1590, 1591, 7, 73, 2, 2, 1591, 1592, 7, 28, 2, 2, 1592, 1597, 5, 200, 101, 2, 1593, 1594, 7, 290, 2, 2, 1594, 1596, 5, 200, 101, 2, 1595, 1593, 3, 2, 2, 2, 1596, 1599, 3, 2, 2, 2, 1597, 1595, 3, 2, 2, 2, 1597, 1598, 3, 2, 2, 2, 1598, 1601, 3, 2, 2, 2, 1599, 1597, 3, 2, 2, 2, 1600, 1590, 3, 2, 2, 2, 1600, 1601, 3, 2, 2, 2, 1601, 1612, 3, 2, 2, 2, 1602, 1603, 7, 219, 2, 2, 1603, 1604, 7, 28, 2, 2, 1604, 1609, 5, 90, 46, 2, 1605, 1606, 7, 290, 2, 2, 1606, 1608, 5, 90, 46, 2, 1607, 1605, 3, 2, 2, 2, 1608, 1611, 3, 2, 2, 2, 1609, 1607, 3, 2, 2, 2, 1609, 1610, 3, 2, 2, 2, 1610, 1613, 3, 2, 2, 2, 1611, 1609, 3, 2, 2, 2, 1612, 1602, 3, 2, 2, 2, 1612, 1613, 3, 2, 2, 2, 1613, 1615, 3, 2, 2, 2, 1614, 1616, 5, 254, 128, 2, 1615, 1614, 3, 2, 2, 2, 1615, 1616, 3, 2, 2, 2, 1616, 1622, 3, 2, 2, 2, 1617, 1620, 7, 132, 2, 2, 1618, 1621, 7, 12, 2, 2, 1619, 1621, 5, 212, 107, 2, 1620, 1618, 3, 2, 2, 2, 1620, 1619, 3, 2, 2, 2, 1621, 1623, 3, 2, 2, 2, 1622, 1617, 3, 2, 2, 2, 1622, 1623, 3, 2, 2, 2, 1623, 83, 3, 2, 2, 2, 1624, 1625, 5, 38, 20, 2, 1625, 1626, 5, 94, 48, 2, 1626, 85, 3, 2, 2, 2, 1627, 1628, 8, 44, 1, 2, 1628, 1629, 5, 88, 45, 2, 1629, 1653, 3, 2, 2, 2, 1630, 1631, 12, 5, 2, 2, 1631, 1632, 6, 44, 3, 2, 1632, 1634, 9, 17, 2, 2, 1633, 1635, 5, 144, 73, 2, 1634, 1633, 3, 2, 2, 2, 1634, 1635, 3, 2, 2, 2, 1635, 1636, 3, 2, 2, 2, 1636, 1652, 5, 86, 44, 6, 1637, 1638, 12, 4, 2, 2, 1638, 1639, 6, 44, 5, 2, 1639, 1641, 7, 119, 2, 2, 1640, 1642, 5, 144, 73, 2, 1641, 1640, 3, 2, 2, 2, 1641, 1642, 3, 2, 2, 2, 1642, 1643, 3, 2, 2, 2, 1643, 1652, 5, 86, 44, 5, 1644, 1645, 12, 3, 2, 2, 1645, 1646, 6, 44, 7, 2, 1646, 1648, 9, 18, 2, 2, 1647, 1649, 5, 144, 73, 2, 1648, 1647, 3, 2, 2, 2, 1648, 1649, 3, 2, 2, 2, 1649, 1650, 3, 2, 2, 2, 1650, 1652, 5, 86, 44, 4, 1651, 1630, 3, 2, 2, 2, 1651, 1637, 3, 2, 2, 2, 1651, 1644, 3, 2, 2, 2, 1652, 1655, 3, 2, 2, 2, 1653, 1651, 3, 2, 2, 2, 1653, 1654, 3, 2, 2, 2, 1654, 87, 3, 2, 2, 2, 1655, 1653, 3, 2, 2, 2, 1656, 1666, 5, 96, 49, 2, 1657, 1666, 5, 92, 47, 2, 1658, 1659, 7, 229, 2, 2, 1659, 1666, 5, 182, 92, 2, 1660, 1666, 5, 172, 87, 2, 1661, 1662, 7, 3, 2, 2, 1662, 1663, 5, 36, 19, 2, 1663, 1664, 7, 4, 2, 2, 1664, 1666, 3, 2, 2, 2, 1665, 1656, 3, 2, 2, 2, 1665, 1657, 3, 2, 2, 2, 1665, 1658, 3, 2, 2, 2, 1665, 1660, 3, 2, 2, 2, 1665, 1661, 3, 2, 2, 2, 1666, 89, 3, 2, 2, 2, 1667, 1669, 5, 200, 101, 2, 1668, 1670, 9, 19, 2, 2, 1669, 1668, 3, 2, 2, 2, 1669, 1670, 3, 2, 2, 2, 1670, 1673, 3, 2, 2, 2, 1671, 1672, 7, 154, 2, 2, 1672, 1674, 9, 20, 2, 2, 1673, 1671, 3, 2, 2, 2, 1673, 1674, 3, 2, 2, 2, 1674, 91, 3, 2, 2, 2, 1675, 1677, 5, 124, 63, 2, 1676, 1678, 5, 94, 48, 2, 1677, 1676, 3, 2, 2, 2, 1678, 1679, 3, 2, 2, 2, 1679, 1677, 3, 2, 2, 2, 1679, 1680, 3, 2, 2, 2, 1680, 93, 3, 2, 2, 2, 1681, 1683, 5, 98, 50, 2, 1682, 1684, 5, 116, 59, 2, 1683, 1682, 3, 2, 2, 2, 1683, 1684, 3, 2, 2, 2, 1684, 1685, 3, 2, 2, 2, 1685, 1686, 5, 82, 42, 2, 1686, 1709, 3, 2, 2, 2, 1687, 1691, 5, 100, 51, 2, 1688, 1690, 5, 142, 72, 2, 1689, 1688, 3, 2, 2, 2, 1690, 1693, 3, 2, 2, 2, 1691, 1689, 3, 2, 2, 2, 1691, 1692, 3, 2, 2, 2, 1692, 1695, 3, 2, 2, 2, 1693, 1691, 3, 2, 2, 2, 1694, 1696, 5, 116, 59, 2, 1695, 1694, 3, 2, 2, 2, 1695, 1696, 3, 2, 2, 2, 1696, 1698, 3, 2, 2, 2, 1697, 1699, 5, 126, 64, 2, 1698, 1697, 3, 2, 2, 2, 1698, 1699, 3, 2, 2, 2, 1699, 1701, 3, 2, 2, 2, 1700, 1702, 5, 118, 60, 2, 1701, 1700, 3, 2, 2, 2, 1701, 1702, 3, 2, 2, 2, 1702, 1704, 3, 2, 2, 2, 1703, 1705, 5, 254, 128, 2, 1704, 1703, 3, 2, 2, 2, 1704, 1705, 3, 2, 2, 2, 1705, 1706, 3, 2, 2, 2, 1706, 1707, 5, 82, 42, 2, 1707, 1709, 3, 2, 2, 2, 1708, 1681, 3, 2, 2, 2, 1708, 1687, 3, 2, 2, 2, 1709, 95, 3, 2, 2, 2, 1710, 1712, 5, 98, 50, 2, 1711, 1713, 5, 124, 63, 2, 1712, 1711, 3, 2, 2, 2, 1712, 1713, 3, 2, 2, 2, 1713, 1717, 3, 2, 2, 2, 1714, 1716, 5, 142, 72, 2, 1715, 1714, 3, 2, 2, 2, 1716, 1719, 3, 2, 2, 2, 1717, 1715, 3, 2, 2, 2, 1717, 1718, 3, 2, 2, 2, 1718, 1721, 3, 2, 2, 2, 1719, 1717, 3, 2, 2, 2, 1720, 1722, 5, 116, 59, 2, 1721, 1720, 3, 2, 2, 2, 1721, 1722, 3, 2, 2, 2, 1722, 1724, 3, 2, 2, 2, 1723, 1725, 5, 126, 64, 2, 1724, 1723, 3, 2, 2, 2, 1724, 1725, 3, 2, 2, 2, 1725, 1727, 3, 2, 2, 2, 1726, 1728, 5, 118, 60, 2, 1727, 1726, 3, 2, 2, 2, 1727, 1728, 3, 2, 2, 2, 1728, 1730, 3, 2, 2, 2, 1729, 1731, 5, 254, 128, 2, 1730, 1729, 3, 2, 2, 2, 1730, 1731, 3, 2, 2, 2, 1731, 1755, 3, 2, 2, 2, 1732, 1734, 5, 100, 51, 2, 1733, 1735, 5, 124, 63, 2, 1734, 1733, 3, 2, 2, 2, 1734, 1735, 3, 2, 2, 2, 1735, 1739, 3, 2, 2, 2, 1736, 1738, 5, 142, 72, 2, 1737, 1736, 3, 2, 2, 2, 1738, 1741, 3, 2, 2, 2, 1739, 1737, 3, 2, 2, 2, 1739, 1740, 3, 2, 2, 2, 1740, 1743, 3, 2, 2, 2, 1741, 1739, 3, 2, 2, 2, 1742, 1744, 5, 116, 59, 2, 1743, 1742, 3, 2, 2, 2, 1743, 1744, 3, 2, 2, 2, 1744, 1746, 3, 2, 2, 2, 1745, 1747, 5, 126, 64, 2, 1746, 1745, 3, 2, 2, 2, 1746, 1747, 3, 2, 2, 2, 1747, 1749, 3, 2, 2, 2, 1748, 1750, 5, 118, 60, 2, 1749, 1748, 3, 2, 2, 2, 1749, 1750, 3, 2, 2, 2, 1750, 1752, 3, 2, 2, 2, 1751, 1753, 5, 254, 128, 2, 1752, 1751, 3, 2, 2, 2, 1752, 1753, 3, 2, 2, 2, 1753, 1755, 3, 2, 2, 2, 1754, 1710, 3, 2, 2, 2, 1754, 1732, 3, 2, 2, 2, 1755, 97, 3, 2, 2, 2, 1756, 1757, 7, 207, 2, 2, 1757, 1758, 7, 242, 2, 2, 1758, 1760, 7, 3, 2, 2, 1759, 1761, 5, 144, 73, 2, 1760, 1759, 3, 2, 2, 2, 1760, 1761, 3, 2, 2, 2, 1761, 1762, 3, 2, 2, 2, 1762, 1763, 5, 202, 102, 2, 1763, 1764, 7, 4, 2, 2, 1764, 1776, 3, 2, 2, 2, 1765, 1767, 7, 142, 2, 2, 1766, 1768, 5, 144, 73, 2, 1767, 1766, 3, 2, 2, 2, 1767, 1768, 3, 2, 2, 2, 1768, 1769, 3, 2, 2, 2, 1769, 1776, 5, 202, 102, 2, 1770, 1772, 7, 187, 2, 2, 1771, 1773, 5, 144, 73, 2, 1772, 1771, 3, 2, 2, 2, 1772, 1773, 3, 2, 2, 2, 1773, 1774, 3, 2, 2, 2, 1774, 1776, 5, 202, 102, 2, 1775, 1756, 3, 2, 2, 2, 1775, 1765, 3, 2, 2, 2, 1775, 1770, 3, 2, 2, 2, 1776, 1778, 3, 2, 2, 2, 1777, 1779, 5, 178, 90, 2, 1778, 1777, 3, 2, 2, 2, 1778, 1779, 3, 2, 2, 2, 1779, 1782, 3, 2, 2, 2, 1780, 1781, 7, 185, 2, 2, 1781, 1783, 7, 293, 2, 2, 1782, 1780, 3, 2, 2, 2, 1782, 1783, 3, 2, 2, 2, 1783, 1784, 3, 2, 2, 2, 1784, 1785, 7, 259, 2, 2, 1785, 1798, 7, 293, 2, 2, 1786, 1796, 7, 20, 2, 2, 1787, 1797, 5, 160, 81, 2, 1788, 1797, 5, 244, 123, 2, 1789, 1792, 7, 3, 2, 2, 1790, 1793, 5, 160, 81, 2, 1791, 1793, 5, 244, 123, 2, 1792, 1790, 3, 2, 2, 2, 1792, 1791, 3, 2, 2, 2, 1793, 1794, 3, 2, 2, 2, 1794, 1795, 7, 4, 2, 2, 1795, 1797, 3, 2, 2, 2, 1796, 1787, 3, 2, 2, 2, 1796, 1788, 3, 2, 2, 2, 1796, 1789, 3, 2, 2, 2, 1797, 1799, 3, 2, 2, 2, 1798, 1786, 3, 2, 2, 2, 1798, 1799, 3, 2, 2, 2, 1799, 1801, 3, 2, 2, 2, 1800, 1802, 5, 178, 90, 2, 1801, 1800, 3, 2, 2, 2, 1801, 1802, 3, 2, 2, 2, 1802, 1805, 3, 2, 2, 2, 1803, 1804, 7, 184, 2, 2, 1804, 1806, 7, 293, 2, 2, 1805, 1803, 3, 2, 2, 2, 1805, 1806, 3, 2, 2, 2, 1806, 99, 3, 2, 2, 2, 1807, 1811, 7, 207, 2, 2, 1808, 1810, 5, 120, 61, 2, 1809, 1808, 3, 2, 2, 2, 1810, 1813, 3, 2, 2, 2, 1811, 1809, 3, 2, 2, 2, 1811, 1812, 3, 2, 2, 2, 1812, 1815, 3, 2, 2, 2, 1813, 1811, 3, 2, 2, 2, 1814, 1816, 5, 144, 73, 2, 1815, 1814, 3, 2, 2, 2, 1815, 1816, 3, 2, 2, 2, 1816, 1817, 3, 2, 2, 2, 1817, 1818, 5, 190, 96, 2, 1818, 101, 3, 2, 2, 2, 1819, 1820, 7, 213, 2, 2, 1820, 1821, 5, 112, 57, 2, 1821, 103, 3, 2, 2, 2, 1822, 1823, 7, 263, 2, 2, 1823, 1826, 7, 143, 2, 2, 1824, 1825, 7, 15, 2, 2, 1825, 1827, 5, 204, 103, 2, 1826, 1824, 3, 2, 2, 2, 1826, 1827, 3, 2, 2, 2, 1827, 1828, 3, 2, 2, 2, 1828, 1829, 7, 235, 2, 2, 1829, 1830, 5, 108, 55, 2, 1830, 105, 3, 2, 2, 2, 1831, 1832, 7, 263, 2, 2, 1832, 1833, 7, 152, 2, 2, 1833, 1836, 7, 143, 2, 2, 1834, 1835, 7, 15, 2, 2, 1835, 1837, 5, 204, 103, 2, 1836, 1834, 3, 2, 2, 2, 1836, 1837, 3, 2, 2, 2, 1837, 1838, 3, 2, 2, 2, 1838, 1839, 7, 235, 2, 2, 1839, 1840, 5, 110, 56, 2, 1840, 107, 3, 2, 2, 2, 1841, 1849, 7, 65, 2, 2, 1842, 1843, 7, 256, 2, 2, 1843, 1844, 7, 213, 2, 2, 1844, 1849, 7, 279, 2, 2, 1845, 1846, 7, 256, 2, 2, 1846, 1847, 7, 213, 2, 2, 1847, 1849, 5, 112, 57, 2, 1848, 1841, 3, 2, 2, 2, 1848, 1842, 3, 2, 2, 2, 1848, 1845, 3, 2, 2, 2, 1849, 109, 3, 2, 2, 2, 1850, 1851, 7, 118, 2, 2, 1851, 1869, 7, 279, 2, 2, 1852, 1853, 7, 118, 2, 2, 1853, 1854, 7, 3, 2, 2, 1854, 1855, 5, 180, 91, 2, 1855, 1856, 7, 4, 2, 2, 1856, 1857, 7, 260, 2, 2, 1857, 1858, 7, 3, 2, 2, 1858, 1863, 5, 200, 101, 2, 1859, 1860, 7, 290, 2, 2, 1860, 1862, 5, 200, 101, 2, 1861, 1859, 3, 2, 2, 2, 1862, 1865, 3, 2, 2, 2, 1863, 1861, 3, 2, 2, 2, 1863, 1864, 3, 2, 2, 2, 1864, 1866, 3, 2, 2, 2, 1865, 1863, 3, 2, 2, 2, 1866, 1867, 7, 4, 2, 2, 1867, 1869, 3, 2, 2, 2, 1868, 1850, 3, 2, 2, 2, 1868, 1852, 3, 2, 2, 2, 1869, 111, 3, 2, 2, 2, 1870, 1875, 5, 114, 58, 2, 1871, 1872, 7, 290, 2, 2, 1872, 1874, 5, 114, 58, 2, 1873, 1871, 3, 2, 2, 2, 1874, 1877, 3, 2, 2, 2, 1875, 1873, 3, 2, 2, 2, 1875, 1876, 3, 2, 2, 2, 1876, 113, 3, 2, 2, 2, 1877, 1875, 3, 2, 2, 2, 1878, 1879, 5, 182, 92, 2, 1879, 1880, 7, 269, 2, 2, 1880, 1881, 5, 200, 101, 2, 1881, 115, 3, 2, 2, 2, 1882, 1883, 7, 264, 2, 2, 1883, 1884, 5, 204, 103, 2, 1884, 117, 3, 2, 2, 2, 1885, 1886, 7, 107, 2, 2, 1886, 1887, 5, 204, 103, 2, 1887, 119, 3, 2, 2, 2, 1888, 1889, 7, 5, 2, 2, 1889, 1896, 5, 122, 62, 2, 1890, 1892, 7, 290, 2, 2, 1891, 1890, 3, 2, 2, 2, 1891, 1892, 3, 2, 2, 2, 1892, 1893, 3, 2, 2, 2, 1893, 1895, 5, 122, 62, 2, 1894, 1891, 3, 2, 2, 2, 1895, 1898, 3, 2, 2, 2, 1896, 1894, 3, 2, 2, 2, 1896, 1897, 3, 2, 2, 2, 1897, 1899, 3, 2, 2, 2, 1898, 1896, 3, 2, 2, 2, 1899, 1900, 7, 6, 2, 2, 1900, 121, 3, 2, 2, 2, 1901, 1915, 5, 274, 138, 2, 1902, 1903, 5, 274, 138, 2, 1903, 1904, 7, 3, 2, 2, 1904, 1909, 5, 210, 106, 2, 1905, 1906, 7, 290, 2, 2, 1906, 1908, 5, 210, 106, 2, 1907, 1905, 3, 2, 2, 2, 1908, 1911, 3, 2, 2, 2, 1909, 1907, 3, 2, 2, 2, 1909, 1910, 3, 2, 2, 2, 1910, 1912, 3, 2, 2, 2, 1911, 1909, 3, 2, 2, 2, 1912, 1913, 7, 4, 2, 2, 1913, 1915, 3, 2, 2, 2, 1914, 1901, 3, 2, 2, 2, 1914, 1902, 3, 2, 2, 2, 1915, 123, 3, 2, 2, 2, 1916, 1917, 7, 99, 2, 2, 1917, 1922, 5, 146, 74, 2, 1918, 1919, 7, 290, 2, 2, 1919, 1921, 5, 146, 74, 2, 1920, 1918, 3, 2, 2, 2, 1921, 1924, 3, 2, 2, 2, 1922, 1920, 3, 2, 2, 2, 1922, 1923, 3, 2, 2, 2, 1923, 1928, 3, 2, 2, 2, 1924, 1922, 3, 2, 2, 2, 1925, 1927, 5, 142, 72, 2, 1926, 1925, 3, 2, 2, 2, 1927, 1930, 3, 2, 2, 2, 1928, 1926, 3, 2, 2, 2, 1928, 1929, 3, 2, 2, 2, 1929, 1932, 3, 2, 2, 2, 1930, 1928, 3, 2, 2, 2, 1931, 1933, 5, 136, 69, 2, 1932, 1931, 3, 2, 2, 2, 1932, 1933, 3, 2, 2, 2, 1933, 125, 3, 2, 2, 2, 1934, 1935, 7, 105, 2, 2, 1935, 1936, 7, 28, 2, 2, 1936, 1941, 5, 128, 65, 2, 1937, 1938, 7, 290, 2, 2, 1938, 1940, 5, 128, 65, 2, 1939, 1937, 3, 2, 2, 2, 1940, 1943, 3, 2, 2, 2, 1941, 1939, 3, 2, 2, 2, 1941, 1942, 3, 2, 2, 2, 1942, 1974, 3, 2, 2, 2, 1943, 1941, 3, 2, 2, 2, 1944, 1945, 7, 105, 2, 2, 1945, 1946, 7, 28, 2, 2, 1946, 1951, 5, 200, 101, 2, 1947, 1948, 7, 290, 2, 2, 1948, 1950, 5, 200, 101, 2, 1949, 1947, 3, 2, 2, 2, 1950, 1953, 3, 2, 2, 2, 1951, 1949, 3, 2, 2, 2, 1951, 1952, 3, 2, 2, 2, 1952, 1971, 3, 2, 2, 2, 1953, 1951, 3, 2, 2, 2, 1954, 1955, 7, 266, 2, 2, 1955, 1972, 7, 202, 2, 2, 1956, 1957, 7, 266, 2, 2, 1957, 1972, 7, 53, 2, 2, 1958, 1959, 7, 106, 2, 2, 1959, 1960, 7, 215, 2, 2, 1960, 1961, 7, 3, 2, 2, 1961, 1966, 5, 134, 68, 2, 1962, 1963, 7, 290, 2, 2, 1963, 1965, 5, 134, 68, 2, 1964, 1962, 3, 2, 2, 2, 1965, 1968, 3, 2, 2, 2, 1966, 1964, 3, 2, 2, 2, 1966, 1967, 3, 2, 2, 2, 1967, 1969, 3, 2, 2, 2, 1968, 1966, 3, 2, 2, 2, 1969, 1970, 7, 4, 2, 2, 1970, 1972, 3, 2, 2, 2, 1971, 1954, 3, 2, 2, 2, 1971, 1956, 3, 2, 2, 2, 1971, 1958, 3, 2, 2, 2, 1971, 1972, 3, 2, 2, 2, 1972, 1974, 3, 2, 2, 2, 1973, 1934, 3, 2, 2, 2, 1973, 1944, 3, 2, 2, 2, 1974, 127, 3, 2, 2, 2, 1975, 1978, 5, 130, 66, 2, 1976, 1978, 5, 200, 101, 2, 1977, 1975, 3, 2, 2, 2, 1977, 1976, 3, 2, 2, 2, 1978, 129, 3, 2, 2, 2, 1979, 1980, 9, 21, 2, 2, 1980, 1981, 7, 3, 2, 2, 1981, 1986, 5, 134, 68, 2, 1982, 1983, 7, 290, 2, 2, 1983, 1985, 5, 134, 68, 2, 1984, 1982, 3, 2, 2, 2, 1985, 1988, 3, 2, 2, 2, 1986, 1984, 3, 2, 2, 2, 1986, 1987, 3, 2, 2, 2, 1987, 1989, 3, 2, 2, 2, 1988, 1986, 3, 2, 2, 2, 1989, 1990, 7, 4, 2, 2, 1990, 2005, 3, 2, 2, 2, 1991, 1992, 7, 106, 2, 2, 1992, 1993, 7, 215, 2, 2, 1993, 1994, 7, 3, 2, 2, 1994, 1999, 5, 132, 67, 2, 1995, 1996, 7, 290, 2, 2, 1996, 1998, 5, 132, 67, 2, 1997, 1995, 3, 2, 2, 2, 1998, 2001, 3, 2, 2, 2, 1999, 1997, 3, 2, 2, 2, 1999, 2000, 3, 2, 2, 2, 2000, 2002, 3, 2, 2, 2, 2001, 1999, 3, 2, 2, 2, 2002, 2003, 7, 4, 2, 2, 2003, 2005, 3, 2, 2, 2, 2004, 1979, 3, 2, 2, 2, 2004, 1991, 3, 2, 2, 2, 2005, 131, 3, 2, 2, 2, 2006, 2009, 5, 130, 66, 2, 2007, 2009, 5, 134, 68, 2, 2008, 2006, 3, 2, 2, 2, 2008, 2007, 3, 2, 2, 2, 2009, 133, 3, 2, 2, 2, 2010, 2019, 7, 3, 2, 2, 2011, 2016, 5, 200, 101, 2, 2012, 2013, 7, 290, 2, 2, 2013, 2015, 5, 200, 101, 2, 2014, 2012, 3, 2, 2, 2, 2015, 2018, 3, 2, 2, 2, 2016, 2014, 3, 2, 2, 2, 2016, 2017, 3, 2, 2, 2, 2017, 2020, 3, 2, 2, 2, 2018, 2016, 3, 2, 2, 2, 2019, 2011, 3, 2, 2, 2, 2019, 2020, 3, 2, 2, 2, 2020, 2021, 3, 2, 2, 2, 2021, 2024, 7, 4, 2, 2, 2022, 2024, 5, 200, 101, 2, 2023, 2010, 3, 2, 2, 2, 2023, 2022, 3, 2, 2, 2, 2024, 135, 3, 2, 2, 2, 2025, 2026, 7, 174, 2, 2, 2026, 2027, 7, 3, 2, 2, 2027, 2028, 5, 190, 96, 2, 2028, 2029, 7, 95, 2, 2, 2029, 2030, 5, 138, 70, 2, 2030, 2031, 7, 112, 2, 2, 2031, 2032, 7, 3, 2, 2, 2032, 2037, 5, 140, 71, 2, 2033, 2034, 7, 290, 2, 2, 2034, 2036, 5, 140, 71, 2, 2035, 2033, 3, 2, 2, 2, 2036, 2039, 3, 2, 2, 2, 2037, 2035, 3, 2, 2, 2, 2037, 2038, 3, 2, 2, 2, 2038, 2040, 3, 2, 2, 2, 2039, 2037, 3, 2, 2, 2, 2040, 2041, 7, 4, 2, 2, 2041, 2042, 7, 4, 2, 2, 2042, 137, 3, 2, 2, 2, 2043, 2056, 5, 274, 138, 2, 2044, 2045, 7, 3, 2, 2, 2045, 2050, 5, 274, 138, 2, 2046, 2047, 7, 290, 2, 2, 2047, 2049, 5, 274, 138, 2, 2048, 2046, 3, 2, 2, 2, 2049, 2052, 3, 2, 2, 2, 2050, 2048, 3, 2, 2, 2, 2050, 2051, 3, 2, 2, 2, 2051, 2053, 3, 2, 2, 2, 2052, 2050, 3, 2, 2, 2, 2053, 2054, 7, 4, 2, 2, 2054, 2056, 3, 2, 2, 2, 2055, 2043, 3, 2, 2, 2, 2055, 2044, 3, 2, 2, 2, 2056, 139, 3, 2, 2, 2, 2057, 2062, 5, 200, 101, 2, 2058, 2060, 7, 20, 2, 2, 2059, 2058, 3, 2, 2, 2, 2059, 2060, 3, 2, 2, 2, 2060, 2061, 3, 2, 2, 2, 2061, 2063, 5, 274, 138, 2, 2062, 2059, 3, 2, 2, 2, 2062, 2063, 3, 2, 2, 2, 2063, 141, 3, 2, 2, 2, 2064, 2065, 7, 127, 2, 2, 2065, 2067, 7, 261, 2, 2, 2066, 2068, 7, 164, 2, 2, 2067, 2066, 3, 2, 2, 2, 2067, 2068, 3, 2, 2, 2, 2068, 2069, 3, 2, 2, 2, 2069, 2070, 5, 268, 135, 2, 2070, 2079, 7, 3, 2, 2, 2071, 2076, 5, 200, 101, 2, 2072, 2073, 7, 290, 2, 2, 2073, 2075, 5, 200, 101, 2, 2074, 2072, 3, 2, 2, 2, 2075, 2078, 3, 2, 2, 2, 2076, 2074, 3, 2, 2, 2, 2076, 2077, 3, 2, 2, 2, 2077, 2080, 3, 2, 2, 2, 2078, 2076, 3, 2, 2, 2, 2079, 2071, 3, 2, 2, 2, 2079, 2080, 3, 2, 2, 2, 2080, 2081, 3, 2, 2, 2, 2081, 2082, 7, 4, 2, 2, 2082, 2094, 5, 274, 138, 2, 2083, 2085, 7, 20, 2, 2, 2084, 2083, 3, 2, 2, 2, 2084, 2085, 3, 2, 2, 2, 2085, 2086, 3, 2, 2, 2, 2086, 2091, 5, 274, 138, 2, 2087, 2088, 7, 290, 2, 2, 2088, 2090, 5, 274, 138, 2, 2089, 2087, 3, 2, 2, 2, 2090, 2093, 3, 2, 2, 2, 2091, 2089, 3, 2, 2, 2, 2091, 2092, 3, 2, 2, 2, 2092, 2095, 3, 2, 2, 2, 2093, 2091, 3, 2, 2, 2, 2094, 2084, 3, 2, 2, 2, 2094, 2095, 3, 2, 2, 2, 2095, 143, 3, 2, 2, 2, 2096, 2097, 9, 22, 2, 2, 2097, 145, 3, 2, 2, 2, 2098, 2100, 7, 127, 2, 2, 2099, 2098, 3, 2, 2, 2, 2099, 2100, 3, 2, 2, 2, 2100, 2101, 3, 2, 2, 2, 2101, 2105, 5, 170, 86, 2, 2102, 2104, 5, 148, 75, 2, 2103, 2102, 3, 2, 2, 2, 2104, 2107, 3, 2, 2, 2, 2105, 2103, 3, 2, 2, 2, 2105, 2106, 3, 2, 2, 2, 2106, 147, 3, 2, 2, 2, 2107, 2105, 3, 2, 2, 2, 2108, 2109, 5, 150, 76, 2, 2109, 2111, 7, 124, 2, 2, 2110, 2112, 7, 127, 2, 2, 2111, 2110, 3, 2, 2, 2, 2111, 2112, 3, 2, 2, 2, 2112, 2113, 3, 2, 2, 2, 2113, 2115, 5, 170, 86, 2, 2114, 2116, 5, 152, 77, 2, 2115, 2114, 3, 2, 2, 2, 2115, 2116, 3, 2, 2, 2, 2116, 2126, 3, 2, 2, 2, 2117, 2118, 7, 150, 2, 2, 2118, 2119, 5, 150, 76, 2, 2119, 2121, 7, 124, 2, 2, 2120, 2122, 7, 127, 2, 2, 2121, 2120, 3, 2, 2, 2, 2121, 2122, 3, 2, 2, 2, 2122, 2123, 3, 2, 2, 2, 2123, 2124, 5, 170, 86, 2, 2124, 2126, 3, 2, 2, 2, 2125, 2108, 3, 2, 2, 2, 2125, 2117, 3, 2, 2, 2, 2126, 149, 3, 2, 2, 2, 2127, 2129, 7, 115, 2, 2, 2128, 2127, 3, 2, 2, 2, 2128, 2129, 3, 2, 2, 2, 2129, 2152, 3, 2, 2, 2, 2130, 2152, 7, 52, 2, 2, 2131, 2133, 7, 130, 2, 2, 2132, 2134, 7, 164, 2, 2, 2133, 2132, 3, 2, 2, 2, 2133, 2134, 3, 2, 2, 2, 2134, 2152, 3, 2, 2, 2, 2135, 2137, 7, 130, 2, 2, 2136, 2135, 3, 2, 2, 2, 2136, 2137, 3, 2, 2, 2, 2137, 2138, 3, 2, 2, 2, 2138, 2152, 7, 208, 2, 2, 2139, 2141, 7, 197, 2, 2, 2140, 2142, 7, 164, 2, 2, 2141, 2140, 3, 2, 2, 2, 2141, 2142, 3, 2, 2, 2, 2142, 2152, 3, 2, 2, 2, 2143, 2145, 7, 100, 2, 2, 2144, 2146, 7, 164, 2, 2, 2145, 2144, 3, 2, 2, 2, 2145, 2146, 3, 2, 2, 2, 2146, 2152, 3, 2, 2, 2, 2147, 2149, 7, 130, 2, 2, 2148, 2147, 3, 2, 2, 2, 2148, 2149, 3, 2, 2, 2, 2149, 2150, 3, 2, 2, 2, 2150, 2152, 7, 16, 2, 2, 2151, 2128, 3, 2, 2, 2, 2151, 2130, 3, 2, 2, 2, 2151, 2131, 3, 2, 2, 2, 2151, 2136, 3, 2, 2, 2, 2151, 2139, 3, 2, 2, 2, 2151, 2143, 3, 2, 2, 2, 2151, 2148, 3, 2, 2, 2, 2152, 151, 3, 2, 2, 2, 2153, 2154, 7, 157, 2, 2, 2154, 2158, 5, 204, 103, 2, 2155, 2156, 7, 259, 2, 2, 2156, 2158, 5, 158, 80, 2, 2157, 2153, 3, 2, 2, 2, 2157, 2155, 3, 2, 2, 2, 2158, 153, 3, 2, 2, 2, 2159, 2160, 7, 231, 2, 2, 2160, 2162, 7, 3, 2, 2, 2161, 2163, 5, 156, 79, 2, 2162, 2161, 3, 2, 2, 2, 2162, 2163, 3, 2, 2, 2, 2163, 2164, 3, 2, 2, 2, 2164, 2165, 7, 4, 2, 2, 2165, 155, 3, 2, 2, 2, 2166, 2168, 7, 278, 2, 2, 2167, 2166, 3, 2, 2, 2, 2167, 2168, 3, 2, 2, 2, 2168, 2169, 3, 2, 2, 2, 2169, 2170, 9, 23, 2, 2, 2170, 2191, 7, 173, 2, 2, 2171, 2172, 5, 200, 101, 2, 2172, 2173, 7, 204, 2, 2, 2173, 2191, 3, 2, 2, 2, 2174, 2175, 7, 26, 2, 2, 2175, 2176, 7, 297, 2, 2, 2176, 2177, 7, 163, 2, 2, 2177, 2178, 7, 155, 2, 2, 2178, 2187, 7, 297, 2, 2, 2179, 2185, 7, 157, 2, 2, 2180, 2186, 5, 274, 138, 2, 2181, 2182, 5, 268, 135, 2, 2182, 2183, 7, 3, 2, 2, 2183, 2184, 7, 4, 2, 2, 2184, 2186, 3, 2, 2, 2, 2185, 2180, 3, 2, 2, 2, 2185, 2181, 3, 2, 2, 2, 2186, 2188, 3, 2, 2, 2, 2187, 2179, 3, 2, 2, 2, 2187, 2188, 3, 2, 2, 2, 2188, 2191, 3, 2, 2, 2, 2189, 2191, 5, 200, 101, 2, 2190, 2167, 3, 2, 2, 2, 2190, 2171, 3, 2, 2, 2, 2190, 2174, 3, 2, 2, 2, 2190, 2189, 3, 2, 2, 2, 2191, 157, 3, 2, 2, 2, 2192, 2193, 7, 3, 2, 2, 2193, 2194, 5, 160, 81, 2, 2194, 2195, 7, 4, 2, 2, 2195, 159, 3, 2, 2, 2, 2196, 2201, 5, 270, 136, 2, 2197, 2198, 7, 290, 2, 2, 2198, 2200, 5, 270, 136, 2, 2199, 2197, 3, 2, 2, 2, 2200, 2203, 3, 2, 2, 2, 2201, 2199, 3, 2, 2, 2, 2201, 2202, 3, 2, 2, 2, 2202, 161, 3, 2, 2, 2, 2203, 2201, 3, 2, 2, 2, 2204, 2205, 7, 3, 2, 2, 2205, 2210, 5, 164, 83, 2, 2206, 2207, 7, 290, 2, 2, 2207, 2209, 5, 164, 83, 2, 2208, 2206, 3, 2, 2, 2, 2209, 2212, 3, 2, 2, 2, 2210, 2208, 3, 2, 2, 2, 2210, 2211, 3, 2, 2, 2, 2211, 2213, 3, 2, 2, 2, 2212, 2210, 3, 2, 2, 2, 2213, 2214, 7, 4, 2, 2, 2214, 163, 3, 2, 2, 2, 2215, 2217, 5, 270, 136, 2, 2216, 2218, 9, 19, 2, 2, 2217, 2216, 3, 2, 2, 2, 2217, 2218, 3, 2, 2, 2, 2218, 165, 3, 2, 2, 2, 2219, 2220, 7, 3, 2, 2, 2220, 2225, 5, 168, 85, 2, 2221, 2222, 7, 290, 2, 2, 2222, 2224, 5, 168, 85, 2, 2223, 2221, 3, 2, 2, 2, 2224, 2227, 3, 2, 2, 2, 2225, 2223, 3, 2, 2, 2, 2225, 2226, 3, 2, 2, 2, 2226, 2228, 3, 2, 2, 2, 2227, 2225, 3, 2, 2, 2, 2228, 2229, 7, 4, 2, 2, 2229, 167, 3, 2, 2, 2, 2230, 2232, 5, 274, 138, 2, 2231, 2233, 5, 34, 18, 2, 2232, 2231, 3, 2, 2, 2, 2232, 2233, 3, 2, 2, 2, 2233, 169, 3, 2, 2, 2, 2234, 2236, 5, 182, 92, 2, 2235, 2237, 5, 154, 78, 2, 2236, 2235, 3, 2, 2, 2, 2236, 2237, 3, 2, 2, 2, 2237, 2238, 3, 2, 2, 2, 2238, 2239, 5, 176, 89, 2, 2239, 2259, 3, 2, 2, 2, 2240, 2241, 7, 3, 2, 2, 2241, 2242, 5, 36, 19, 2, 2242, 2244, 7, 4, 2, 2, 2243, 2245, 5, 154, 78, 2, 2244, 2243, 3, 2, 2, 2, 2244, 2245, 3, 2, 2, 2, 2245, 2246, 3, 2, 2, 2, 2246, 2247, 5, 176, 89, 2, 2247, 2259, 3, 2, 2, 2, 2248, 2249, 7, 3, 2, 2, 2249, 2250, 5, 146, 74, 2, 2250, 2252, 7, 4, 2, 2, 2251, 2253, 5, 154, 78, 2, 2252, 2251, 3, 2, 2, 2, 2252, 2253, 3, 2, 2, 2, 2253, 2254, 3, 2, 2, 2, 2254, 2255, 5, 176, 89, 2, 2255, 2259, 3, 2, 2, 2, 2256, 2259, 5, 172, 87, 2, 2257, 2259, 5, 174, 88, 2, 2258, 2234, 3, 2, 2, 2, 2258, 2240, 3, 2, 2, 2, 2258, 2248, 3, 2, 2, 2, 2258, 2256, 3, 2, 2, 2, 2258, 2257, 3, 2, 2, 2, 2259, 171, 3, 2, 2, 2, 2260, 2261, 7, 260, 2, 2, 2261, 2266, 5, 200, 101, 2, 2262, 2263, 7, 290, 2, 2, 2263, 2265, 5, 200, 101, 2, 2264, 2262, 3, 2, 2, 2, 2265, 2268, 3, 2, 2, 2, 2266, 2264, 3, 2, 2, 2, 2266, 2267, 3, 2, 2, 2, 2267, 2269, 3, 2, 2, 2, 2268, 2266, 3, 2, 2, 2, 2269, 2270, 5, 176, 89, 2, 2270, 173, 3, 2, 2, 2, 2271, 2272, 5, 266, 134, 2, 2272, 2281, 7, 3, 2, 2, 2273, 2278, 5, 200, 101, 2, 2274, 2275, 7, 290, 2, 2, 2275, 2277, 5, 200, 101, 2, 2276, 2274, 3, 2, 2, 2, 2277, 2280, 3, 2, 2, 2, 2278, 2276, 3, 2, 2, 2, 2278, 2279, 3, 2, 2, 2, 2279, 2282, 3, 2, 2, 2, 2280, 2278, 3, 2, 2, 2, 2281, 2273, 3, 2, 2, 2, 2281, 2282, 3, 2, 2, 2, 2282, 2283, 3, 2, 2, 2, 2283, 2284, 7, 4, 2, 2, 2284, 2285, 5, 176, 89, 2, 2285, 175, 3, 2, 2, 2, 2286, 2288, 7, 20, 2, 2, 2287, 2286, 3, 2, 2, 2, 2287, 2288, 3, 2, 2, 2, 2288, 2289, 3, 2, 2, 2, 2289, 2291, 5, 276, 139, 2, 2290, 2292, 5, 158, 80, 2, 2291, 2290, 3, 2, 2, 2, 2291, 2292, 3, 2, 2, 2, 2292, 2294, 3, 2, 2, 2, 2293, 2287, 3, 2, 2, 2, 2293, 2294, 3, 2, 2, 2, 2294, 177, 3, 2, 2, 2, 2295, 2296, 7, 203, 2, 2, 2296, 2297, 7, 97, 2, 2, 2297, 2298, 7, 210, 2, 2, 2298, 2302, 7, 293, 2, 2, 2299, 2300, 7, 266, 2, 2, 2300, 2301, 7, 211, 2, 2, 2301, 2303, 5, 60, 31, 2, 2302, 2299, 3, 2, 2, 2, 2302, 2303, 3, 2, 2, 2, 2303, 2345, 3, 2, 2, 2, 2304, 2305, 7, 203, 2, 2, 2305, 2306, 7, 97, 2, 2, 2306, 2316, 7, 66, 2, 2, 2307, 2308, 7, 90, 2, 2, 2308, 2309, 7, 234, 2, 2, 2309, 2310, 7, 28, 2, 2, 2310, 2314, 7, 293, 2, 2, 2311, 2312, 7, 79, 2, 2, 2312, 2313, 7, 28, 2, 2, 2313, 2315, 7, 293, 2, 2, 2314, 2311, 3, 2, 2, 2, 2314, 2315, 3, 2, 2, 2, 2315, 2317, 3, 2, 2, 2, 2316, 2307, 3, 2, 2, 2, 2316, 2317, 3, 2, 2, 2, 2317, 2323, 3, 2, 2, 2, 2318, 2319, 7, 40, 2, 2, 2319, 2320, 7, 123, 2, 2, 2320, 2321, 7, 234, 2, 2, 2321, 2322, 7, 28, 2, 2, 2322, 2324, 7, 293, 2, 2, 2323, 2318, 3, 2, 2, 2, 2323, 2324, 3, 2, 2, 2, 2324, 2330, 3, 2, 2, 2, 2325, 2326, 7, 142, 2, 2, 2326, 2327, 7, 125, 2, 2, 2327, 2328, 7, 234, 2, 2, 2328, 2329, 7, 28, 2, 2, 2329, 2331, 7, 293, 2, 2, 2330, 2325, 3, 2, 2, 2, 2330, 2331, 3, 2, 2, 2, 2331, 2336, 3, 2, 2, 2, 2332, 2333, 7, 133, 2, 2, 2333, 2334, 7, 234, 2, 2, 2334, 2335, 7, 28, 2, 2, 2335, 2337, 7, 293, 2, 2, 2336, 2332, 3, 2, 2, 2, 2336, 2337, 3, 2, 2, 2, 2337, 2342, 3, 2, 2, 2, 2338, 2339, 7, 153, 2, 2, 2339, 2340, 7, 64, 2, 2, 2340, 2341, 7, 20, 2, 2, 2341, 2343, 7, 293, 2, 2, 2342, 2338, 3, 2, 2, 2, 2342, 2343, 3, 2, 2, 2, 2343, 2345, 3, 2, 2, 2, 2344, 2295, 3, 2, 2, 2, 2344, 2304, 3, 2, 2, 2, 2345, 179, 3, 2, 2, 2, 2346, 2351, 5, 182, 92, 2, 2347, 2348, 7, 290, 2, 2, 2348, 2350, 5, 182, 92, 2, 2349, 2347, 3, 2, 2, 2, 2350, 2353, 3, 2, 2, 2, 2351, 2349, 3, 2, 2, 2, 2351, 2352, 3, 2, 2, 2, 2352, 181, 3, 2, 2, 2, 2353, 2351, 3, 2, 2, 2, 2354, 2359, 5, 270, 136, 2, 2355, 2356, 7, 289, 2, 2, 2356, 2358, 5, 270, 136, 2, 2357, 2355, 3, 2, 2, 2, 2358, 2361, 3, 2, 2, 2, 2359, 2357, 3, 2, 2, 2, 2359, 2360, 3, 2, 2, 2, 2360, 183, 3, 2, 2, 2, 2361, 2359, 3, 2, 2, 2, 2362, 2363, 5, 270, 136, 2, 2363, 2364, 7, 289, 2, 2, 2364, 2366, 3, 2, 2, 2, 2365, 2362, 3, 2, 2, 2, 2365, 2366, 3, 2, 2, 2, 2366, 2367, 3, 2, 2, 2, 2367, 2368, 5, 270, 136, 2, 2368, 185, 3, 2, 2, 2, 2369, 2370, 5, 270, 136, 2, 2370, 2371, 7, 289, 2, 2, 2371, 2373, 3, 2, 2, 2, 2372, 2369, 3, 2, 2, 2, 2372, 2373, 3, 2, 2, 2, 2373, 2374, 3, 2, 2, 2, 2374, 2375, 5, 270, 136, 2, 2375, 187, 3, 2, 2, 2, 2376, 2384, 5, 200, 101, 2, 2377, 2379, 7, 20, 2, 2, 2378, 2377, 3, 2, 2, 2, 2378, 2379, 3, 2, 2, 2, 2379, 2382, 3, 2, 2, 2, 2380, 2383, 5, 270, 136, 2, 2381, 2383, 5, 158, 80, 2, 2382, 2380, 3, 2, 2, 2, 2382, 2381, 3, 2, 2, 2, 2383, 2385, 3, 2, 2, 2, 2384, 2378, 3, 2, 2, 2, 2384, 2385, 3, 2, 2, 2, 2385, 189, 3, 2, 2, 2, 2386, 2391, 5, 188, 95, 2, 2387, 2388, 7, 290, 2, 2, 2388, 2390, 5, 188, 95, 2, 2389, 2387, 3, 2, 2, 2, 2390, 2393, 3, 2, 2, 2, 2391, 2389, 3, 2, 2, 2, 2391, 2392, 3, 2, 2, 2, 2392, 191, 3, 2, 2, 2, 2393, 2391, 3, 2, 2, 2, 2394, 2395, 7, 3, 2, 2, 2395, 2400, 5, 194, 98, 2, 2396, 2397, 7, 290, 2, 2, 2397, 2399, 5, 194, 98, 2, 2398, 2396, 3, 2, 2, 2, 2399, 2402, 3, 2, 2, 2, 2400, 2398, 3, 2, 2, 2, 2400, 2401, 3, 2, 2, 2, 2401, 2403, 3, 2, 2, 2, 2402, 2400, 3, 2, 2, 2, 2403, 2404, 7, 4, 2, 2, 2404, 193, 3, 2, 2, 2, 2405, 2408, 5, 196, 99, 2, 2406, 2408, 5, 246, 124, 2, 2407, 2405, 3, 2, 2, 2, 2407, 2406, 3, 2, 2, 2, 2408, 195, 3, 2, 2, 2, 2409, 2423, 5, 268, 135, 2, 2410, 2411, 5, 274, 138, 2, 2411, 2412, 7, 3, 2, 2, 2412, 2417, 5, 198, 100, 2, 2413, 2414, 7, 290, 2, 2, 2414, 2416, 5, 198, 100, 2, 2415, 2413, 3, 2, 2, 2, 2416, 2419, 3, 2, 2, 2, 2417, 2415, 3, 2, 2, 2, 2417, 2418, 3, 2, 2, 2, 2418, 2420, 3, 2, 2, 2, 2419, 2417, 3, 2, 2, 2, 2420, 2421, 7, 4, 2, 2, 2421, 2423, 3, 2, 2, 2, 2422, 2409, 3, 2, 2, 2, 2422, 2410, 3, 2, 2, 2, 2423, 197, 3, 2, 2, 2, 2424, 2427, 5, 268, 135, 2, 2425, 2427, 5, 214, 108, 2, 2426, 2424, 3, 2, 2, 2, 2426, 2425, 3, 2, 2, 2, 2427, 199, 3, 2, 2, 2, 2428, 2429, 5, 204, 103, 2, 2429, 201, 3, 2, 2, 2, 2430, 2435, 5, 200, 101, 2, 2431, 2432, 7, 290, 2, 2, 2432, 2434, 5, 200, 101, 2, 2433, 2431, 3, 2, 2, 2, 2434, 2437, 3, 2, 2, 2, 2435, 2433, 3, 2, 2, 2, 2435, 2436, 3, 2, 2, 2, 2436, 203, 3, 2, 2, 2, 2437, 2435, 3, 2, 2, 2, 2438, 2439, 8, 103, 1, 2, 2439, 2440, 7, 152, 2, 2, 2440, 2451, 5, 204, 103, 7, 2441, 2442, 7, 82, 2, 2, 2442, 2443, 7, 3, 2, 2, 2443, 2444, 5, 36, 19, 2, 2444, 2445, 7, 4, 2, 2, 2445, 2451, 3, 2, 2, 2, 2446, 2448, 5, 208, 105, 2, 2447, 2449, 5, 206, 104, 2, 2448, 2447, 3, 2, 2, 2, 2448, 2449, 3, 2, 2, 2, 2449, 2451, 3, 2, 2, 2, 2450, 2438, 3, 2, 2, 2, 2450, 2441, 3, 2, 2, 2, 2450, 2446, 3, 2, 2, 2, 2451, 2460, 3, 2, 2, 2, 2452, 2453, 12, 4, 2, 2, 2453, 2454, 7, 15, 2, 2, 2454, 2459, 5, 204, 103, 5, 2455, 2456, 12, 3, 2, 2, 2456, 2457, 7, 161, 2, 2, 2457, 2459, 5, 204, 103, 4, 2458, 2452, 3, 2, 2, 2, 2458, 2455, 3, 2, 2, 2, 2459, 2462, 3, 2, 2, 2, 2460, 2458, 3, 2, 2, 2, 2460, 2461, 3, 2, 2, 2, 2461, 205, 3, 2, 2, 2, 2462, 2460, 3, 2, 2, 2, 2463, 2465, 7, 152, 2, 2, 2464, 2463, 3, 2, 2, 2, 2464, 2465, 3, 2, 2, 2, 2465, 2466, 3, 2, 2, 2, 2466, 2467, 7, 24, 2, 2, 2467, 2468, 5, 208, 105, 2, 2468, 2469, 7, 15, 2, 2, 2469, 2470, 5, 208, 105, 2, 2470, 2546, 3, 2, 2, 2, 2471, 2473, 7, 152, 2, 2, 2472, 2471, 3, 2, 2, 2, 2472, 2473, 3, 2, 2, 2, 2473, 2474, 3, 2, 2, 2, 2474, 2475, 7, 112, 2, 2, 2475, 2476, 7, 3, 2, 2, 2476, 2481, 5, 200, 101, 2, 2477, 2478, 7, 290, 2, 2, 2478, 2480, 5, 200, 101, 2, 2479, 2477, 3, 2, 2, 2, 2480, 2483, 3, 2, 2, 2, 2481, 2479, 3, 2, 2, 2, 2481, 2482, 3, 2, 2, 2, 2482, 2484, 3, 2, 2, 2, 2483, 2481, 3, 2, 2, 2, 2484, 2485, 7, 4, 2, 2, 2485, 2546, 3, 2, 2, 2, 2486, 2488, 7, 152, 2, 2, 2487, 2486, 3, 2, 2, 2, 2487, 2488, 3, 2, 2, 2, 2488, 2489, 3, 2, 2, 2, 2489, 2490, 7, 112, 2, 2, 2490, 2491, 7, 3, 2, 2, 2491, 2492, 5, 36, 19, 2, 2492, 2493, 7, 4, 2, 2, 2493, 2546, 3, 2, 2, 2, 2494, 2496, 7, 152, 2, 2, 2495, 2494, 3, 2, 2, 2, 2495, 2496, 3, 2, 2, 2, 2496, 2497, 3, 2, 2, 2, 2497, 2498, 7, 198, 2, 2, 2498, 2546, 5, 208, 105, 2, 2499, 2501, 7, 152, 2, 2, 2500, 2499, 3, 2, 2, 2, 2500, 2501, 3, 2, 2, 2, 2501, 2502, 3, 2, 2, 2, 2502, 2503, 7, 131, 2, 2, 2503, 2517, 9, 24, 2, 2, 2504, 2505, 7, 3, 2, 2, 2505, 2518, 7, 4, 2, 2, 2506, 2507, 7, 3, 2, 2, 2507, 2512, 5, 200, 101, 2, 2508, 2509, 7, 290, 2, 2, 2509, 2511, 5, 200, 101, 2, 2510, 2508, 3, 2, 2, 2, 2511, 2514, 3, 2, 2, 2, 2512, 2510, 3, 2, 2, 2, 2512, 2513, 3, 2, 2, 2, 2513, 2515, 3, 2, 2, 2, 2514, 2512, 3, 2, 2, 2, 2515, 2516, 7, 4, 2, 2, 2516, 2518, 3, 2, 2, 2, 2517, 2504, 3, 2, 2, 2, 2517, 2506, 3, 2, 2, 2, 2518, 2546, 3, 2, 2, 2, 2519, 2521, 7, 152, 2, 2, 2520, 2519, 3, 2, 2, 2, 2520, 2521, 3, 2, 2, 2, 2521, 2522, 3, 2, 2, 2, 2522, 2523, 7, 131, 2, 2, 2523, 2526, 5, 208, 105, 2, 2524, 2525, 7, 78, 2, 2, 2525, 2527, 7, 293, 2, 2, 2526, 2524, 3, 2, 2, 2, 2526, 2527, 3, 2, 2, 2, 2527, 2546, 3, 2, 2, 2, 2528, 2530, 7, 122, 2, 2, 2529, 2531, 7, 152, 2, 2, 2530, 2529, 3, 2, 2, 2, 2530, 2531, 3, 2, 2, 2, 2531, 2532, 3, 2, 2, 2, 2532, 2546, 7, 153, 2, 2, 2533, 2535, 7, 122, 2, 2, 2534, 2536, 7, 152, 2, 2, 2535, 2534, 3, 2, 2, 2, 2535, 2536, 3, 2, 2, 2, 2536, 2537, 3, 2, 2, 2, 2537, 2546, 9, 25, 2, 2, 2538, 2540, 7, 122, 2, 2, 2539, 2541, 7, 152, 2, 2, 2540, 2539, 3, 2, 2, 2, 2540, 2541, 3, 2, 2, 2, 2541, 2542, 3, 2, 2, 2, 2542, 2543, 7, 72, 2, 2, 2543, 2544, 7, 99, 2, 2, 2544, 2546, 5, 208, 105, 2, 2545, 2464, 3, 2, 2, 2, 2545, 2472, 3, 2, 2, 2, 2545, 2487, 3, 2, 2, 2, 2545, 2495, 3, 2, 2, 2, 2545, 2500, 3, 2, 2, 2, 2545, 2520, 3, 2, 2, 2, 2545, 2528, 3, 2, 2, 2, 2545, 2533, 3, 2, 2, 2, 2545, 2538, 3, 2, 2, 2, 2546, 207, 3, 2, 2, 2, 2547, 2548, 8, 105, 1, 2, 2548, 2552, 5, 210, 106, 2, 2549, 2550, 9, 26, 2, 2, 2550, 2552, 5, 208, 105, 9, 2551, 2547, 3, 2, 2, 2, 2551, 2549, 3, 2, 2, 2, 2552, 2574, 3, 2, 2, 2, 2553, 2554, 12, 8, 2, 2, 2554, 2555, 9, 27, 2, 2, 2555, 2573, 5, 208, 105, 9, 2556, 2557, 12, 7, 2, 2, 2557, 2558, 9, 28, 2, 2, 2558, 2573, 5, 208, 105, 8, 2559, 2560, 12, 6, 2, 2, 2560, 2561, 7, 283, 2, 2, 2561, 2573, 5, 208, 105, 7, 2562, 2563, 12, 5, 2, 2, 2563, 2564, 7, 286, 2, 2, 2564, 2573, 5, 208, 105, 6, 2565, 2566, 12, 4, 2, 2, 2566, 2567, 7, 284, 2, 2, 2567, 2573, 5, 208, 105, 5, 2568, 2569, 12, 3, 2, 2, 2569, 2570, 5, 216, 109, 2, 2570, 2571, 5, 208, 105, 4, 2571, 2573, 3, 2, 2, 2, 2572, 2553, 3, 2, 2, 2, 2572, 2556, 3, 2, 2, 2, 2572, 2559, 3, 2, 2, 2, 2572, 2562, 3, 2, 2, 2, 2572, 2565, 3, 2, 2, 2, 2572, 2568, 3, 2, 2, 2, 2573, 2576, 3, 2, 2, 2, 2574, 2572, 3, 2, 2, 2, 2574, 2575, 3, 2, 2, 2, 2575, 209, 3, 2, 2, 2, 2576, 2574, 3, 2, 2, 2, 2577, 2578, 8, 106, 1, 2, 2578, 2766, 9, 29, 2, 2, 2579, 2581, 7, 31, 2, 2, 2580, 2582, 5, 252, 127, 2, 2581, 2580, 3, 2, 2, 2, 2582, 2583, 3, 2, 2, 2, 2583, 2581, 3, 2, 2, 2, 2583, 2584, 3, 2, 2, 2, 2584, 2587, 3, 2, 2, 2, 2585, 2586, 7, 76, 2, 2, 2586, 2588, 5, 200, 101, 2, 2587, 2585, 3, 2, 2, 2, 2587, 2588, 3, 2, 2, 2, 2588, 2589, 3, 2, 2, 2, 2589, 2590, 7, 77, 2, 2, 2590, 2766, 3, 2, 2, 2, 2591, 2592, 7, 31, 2, 2, 2592, 2594, 5, 200, 101, 2, 2593, 2595, 5, 252, 127, 2, 2594, 2593, 3, 2, 2, 2, 2595, 2596, 3, 2, 2, 2, 2596, 2594, 3, 2, 2, 2, 2596, 2597, 3, 2, 2, 2, 2597, 2600, 3, 2, 2, 2, 2598, 2599, 7, 76, 2, 2, 2599, 2601, 5, 200, 101, 2, 2600, 2598, 3, 2, 2, 2, 2600, 2601, 3, 2, 2, 2, 2601, 2602, 3, 2, 2, 2, 2602, 2603, 7, 77, 2, 2, 2603, 2766, 3, 2, 2, 2, 2604, 2605, 9, 30, 2, 2, 2605, 2606, 7, 3, 2, 2, 2606, 2607, 5, 200, 101, 2, 2607, 2608, 7, 20, 2, 2, 2608, 2609, 5, 238, 120, 2, 2609, 2610, 7, 4, 2, 2, 2610, 2766, 3, 2, 2, 2, 2611, 2612, 7, 225, 2, 2, 2612, 2621, 7, 3, 2, 2, 2613, 2618, 5, 188, 95, 2, 2614, 2615, 7, 290, 2, 2, 2615, 2617, 5, 188, 95, 2, 2616, 2614, 3, 2, 2, 2, 2617, 2620, 3, 2, 2, 2, 2618, 2616, 3, 2, 2, 2, 2618, 2619, 3, 2, 2, 2, 2619, 2622, 3, 2, 2, 2, 2620, 2618, 3, 2, 2, 2, 2621, 2613, 3, 2, 2, 2, 2621, 2622, 3, 2, 2, 2, 2622, 2623, 3, 2, 2, 2, 2623, 2766, 7, 4, 2, 2, 2624, 2625, 7, 93, 2, 2, 2625, 2626, 7, 3, 2, 2, 2626, 2629, 5, 200, 101, 2, 2627, 2628, 7, 110, 2, 2, 2628, 2630, 7, 154, 2, 2, 2629, 2627, 3, 2, 2, 2, 2629, 2630, 3, 2, 2, 2, 2630, 2631, 3, 2, 2, 2, 2631, 2632, 7, 4, 2, 2, 2632, 2766, 3, 2, 2, 2, 2633, 2634, 7, 126, 2, 2, 2634, 2635, 7, 3, 2, 2, 2635, 2638, 5, 200, 101, 2, 2636, 2637, 7, 110, 2, 2, 2637, 2639, 7, 154, 2, 2, 2638, 2636, 3, 2, 2, 2, 2638, 2639, 3, 2, 2, 2, 2639, 2640, 3, 2, 2, 2, 2640, 2641, 7, 4, 2, 2, 2641, 2766, 3, 2, 2, 2, 2642, 2643, 7, 176, 2, 2, 2643, 2644, 7, 3, 2, 2, 2644, 2645, 5, 208, 105, 2, 2645, 2646, 7, 112, 2, 2, 2646, 2647, 5, 208, 105, 2, 2647, 2648, 7, 4, 2, 2, 2648, 2766, 3, 2, 2, 2, 2649, 2766, 5, 214, 108, 2, 2650, 2766, 7, 279, 2, 2, 2651, 2652, 5, 268, 135, 2, 2652, 2653, 7, 289, 2, 2, 2653, 2654, 7, 279, 2, 2, 2654, 2766, 3, 2, 2, 2, 2655, 2656, 7, 3, 2, 2, 2656, 2659, 5, 188, 95, 2, 2657, 2658, 7, 290, 2, 2, 2658, 2660, 5, 188, 95, 2, 2659, 2657, 3, 2, 2, 2, 2660, 2661, 3, 2, 2, 2, 2661, 2659, 3, 2, 2, 2, 2661, 2662, 3, 2, 2, 2, 2662, 2663, 3, 2, 2, 2, 2663, 2664, 7, 4, 2, 2, 2664, 2766, 3, 2, 2, 2, 2665, 2666, 7, 3, 2, 2, 2666, 2667, 5, 36, 19, 2, 2667, 2668, 7, 4, 2, 2, 2668, 2766, 3, 2, 2, 2, 2669, 2670, 5, 266, 134, 2, 2670, 2682, 7, 3, 2, 2, 2671, 2673, 5, 144, 73, 2, 2672, 2671, 3, 2, 2, 2, 2672, 2673, 3, 2, 2, 2, 2673, 2674, 3, 2, 2, 2, 2674, 2679, 5, 200, 101, 2, 2675, 2676, 7, 290, 2, 2, 2676, 2678, 5, 200, 101, 2, 2677, 2675, 3, 2, 2, 2, 2678, 2681, 3, 2, 2, 2, 2679, 2677, 3, 2, 2, 2, 2679, 2680, 3, 2, 2, 2, 2680, 2683, 3, 2, 2, 2, 2681, 2679, 3, 2, 2, 2, 2682, 2672, 3, 2, 2, 2, 2682, 2683, 3, 2, 2, 2, 2683, 2684, 3, 2, 2, 2, 2684, 2691, 7, 4, 2, 2, 2685, 2686, 7, 91, 2, 2, 2686, 2687, 7, 3, 2, 2, 2687, 2688, 7, 264, 2, 2, 2688, 2689, 5, 204, 103, 2, 2689, 2690, 7, 4, 2, 2, 2690, 2692, 3, 2, 2, 2, 2691, 2685, 3, 2, 2, 2, 2691, 2692, 3, 2, 2, 2, 2692, 2695, 3, 2, 2, 2, 2693, 2694, 9, 31, 2, 2, 2694, 2696, 7, 154, 2, 2, 2695, 2693, 3, 2, 2, 2, 2695, 2696, 3, 2, 2, 2, 2696, 2699, 3, 2, 2, 2, 2697, 2698, 7, 166, 2, 2, 2698, 2700, 5, 258, 130, 2, 2699, 2697, 3, 2, 2, 2, 2699, 2700, 3, 2, 2, 2, 2700, 2766, 3, 2, 2, 2, 2701, 2702, 5, 274, 138, 2, 2702, 2703, 7, 7, 2, 2, 2703, 2704, 5, 200, 101, 2, 2704, 2766, 3, 2, 2, 2, 2705, 2706, 7, 3, 2, 2, 2706, 2709, 5, 274, 138, 2, 2707, 2708, 7, 290, 2, 2, 2708, 2710, 5, 274, 138, 2, 2709, 2707, 3, 2, 2, 2, 2710, 2711, 3, 2, 2, 2, 2711, 2709, 3, 2, 2, 2, 2711, 2712, 3, 2, 2, 2, 2712, 2713, 3, 2, 2, 2, 2713, 2714, 7, 4, 2, 2, 2714, 2715, 7, 7, 2, 2, 2715, 2716, 5, 200, 101, 2, 2716, 2766, 3, 2, 2, 2, 2717, 2766, 5, 274, 138, 2, 2718, 2719, 7, 3, 2, 2, 2719, 2720, 5, 200, 101, 2, 2720, 2721, 7, 4, 2, 2, 2721, 2766, 3, 2, 2, 2, 2722, 2723, 7, 87, 2, 2, 2723, 2724, 7, 3, 2, 2, 2724, 2725, 5, 274, 138, 2, 2725, 2726, 7, 99, 2, 2, 2726, 2727, 5, 208, 105, 2, 2727, 2728, 7, 4, 2, 2, 2728, 2766, 3, 2, 2, 2, 2729, 2730, 9, 32, 2, 2, 2730, 2731, 7, 3, 2, 2, 2731, 2732, 5, 208, 105, 2, 2732, 2733, 9, 33, 2, 2, 2733, 2736, 5, 208, 105, 2, 2734, 2735, 9, 34, 2, 2, 2735, 2737, 5, 208, 105, 2, 2736, 2734, 3, 2, 2, 2, 2736, 2737, 3, 2, 2, 2, 2737, 2738, 3, 2, 2, 2, 2738, 2739, 7, 4, 2, 2, 2739, 2766, 3, 2, 2, 2, 2740, 2741, 7, 243, 2, 2, 2741, 2743, 7, 3, 2, 2, 2742, 2744, 9, 35, 2, 2, 2743, 2742, 3, 2, 2, 2, 2743, 2744, 3, 2, 2, 2, 2744, 2746, 3, 2, 2, 2, 2745, 2747, 5, 208, 105, 2, 2746, 2745, 3, 2, 2, 2, 2746, 2747, 3, 2, 2, 2, 2747, 2748, 3, 2, 2, 2, 2748, 2749, 7, 99, 2, 2, 2749, 2750, 5, 208, 105, 2, 2750, 2751, 7, 4, 2, 2, 2751, 2766, 3, 2, 2, 2, 2752, 2753, 7, 168, 2, 2, 2753, 2754, 7, 3, 2, 2, 2754, 2755, 5, 208, 105, 2, 2755, 2756, 7, 175, 2, 2, 2756, 2757, 5, 208, 105, 2, 2757, 2758, 7, 99, 2, 2, 2758, 2761, 5, 208, 105, 2, 2759, 2760, 7, 95, 2, 2, 2760, 2762, 5, 208, 105, 2, 2761, 2759, 3, 2, 2, 2, 2761, 2762, 3, 2, 2, 2, 2762, 2763, 3, 2, 2, 2, 2763, 2764, 7, 4, 2, 2, 2764, 2766, 3, 2, 2, 2, 2765, 2577, 3, 2, 2, 2, 2765, 2579, 3, 2, 2, 2, 2765, 2591, 3, 2, 2, 2, 2765, 2604, 3, 2, 2, 2, 2765, 2611, 3, 2, 2, 2, 2765, 2624, 3, 2, 2, 2, 2765, 2633, 3, 2, 2, 2, 2765, 2642, 3, 2, 2, 2, 2765, 2649, 3, 2, 2, 2, 2765, 2650, 3, 2, 2, 2, 2765, 2651, 3, 2, 2, 2, 2765, 2655, 3, 2, 2, 2, 2765, 2665, 3, 2, 2, 2, 2765, 2669, 3, 2, 2, 2, 2765, 2701, 3, 2, 2, 2, 2765, 2705, 3, 2, 2, 2, 2765, 2717, 3, 2, 2, 2, 2765, 2718, 3, 2, 2, 2, 2765, 2722, 3, 2, 2, 2, 2765, 2729, 3, 2, 2, 2, 2765, 2740, 3, 2, 2, 2, 2765, 2752, 3, 2, 2, 2, 2766, 2777, 3, 2, 2, 2, 2767, 2768, 12, 10, 2, 2, 2768, 2769, 7, 8, 2, 2, 2769, 2770, 5, 208, 105, 2, 2770, 2771, 7, 9, 2, 2, 2771, 2776, 3, 2, 2, 2, 2772, 2773, 12, 8, 2, 2, 2773, 2774, 7, 289, 2, 2, 2774, 2776, 5, 274, 138, 2, 2775, 2767, 3, 2, 2, 2, 2775, 2772, 3, 2, 2, 2, 2776, 2779, 3, 2, 2, 2, 2777, 2775, 3, 2, 2, 2, 2777, 2778, 3, 2, 2, 2, 2778, 211, 3, 2, 2, 2, 2779, 2777, 3, 2, 2, 2, 2780, 2781, 7, 297, 2, 2, 2781, 2783, 7, 290, 2, 2, 2782, 2780, 3, 2, 2, 2, 2782, 2783, 3, 2, 2, 2, 2783, 2784, 3, 2, 2, 2, 2784, 2790, 7, 297, 2, 2, 2785, 2786, 7, 297, 2, 2, 2786, 2787, 7, 156, 2, 2, 2787, 2790, 7, 297, 2, 2, 2788, 2790, 5, 204, 103, 2, 2789, 2782, 3, 2, 2, 2, 2789, 2785, 3, 2, 2, 2, 2789, 2788, 3, 2, 2, 2, 2790, 213, 3, 2, 2, 2, 2791, 2804, 7, 153, 2, 2, 2792, 2804, 5, 224, 113, 2, 2793, 2794, 5, 274, 138, 2, 2794, 2795, 7, 293, 2, 2, 2795, 2804, 3, 2, 2, 2, 2796, 2804, 5, 280, 141, 2, 2797, 2804, 5, 222, 112, 2, 2798, 2800, 7, 293, 2, 2, 2799, 2798, 3, 2, 2, 2, 2800, 2801, 3, 2, 2, 2, 2801, 2799, 3, 2, 2, 2, 2801, 2802, 3, 2, 2, 2, 2802, 2804, 3, 2, 2, 2, 2803, 2791, 3, 2, 2, 2, 2803, 2792, 3, 2, 2, 2, 2803, 2793, 3, 2, 2, 2, 2803, 2796, 3, 2, 2, 2, 2803, 2797, 3, 2, 2, 2, 2803, 2799, 3, 2, 2, 2, 2804, 215, 3, 2, 2, 2, 2805, 2806, 9, 36, 2, 2, 2806, 217, 3, 2, 2, 2, 2807, 2808, 9, 37, 2, 2, 2808, 219, 3, 2, 2, 2, 2809, 2810, 9, 38, 2, 2, 2810, 221, 3, 2, 2, 2, 2811, 2812, 9, 39, 2, 2, 2812, 223, 3, 2, 2, 2, 2813, 2816, 7, 120, 2, 2, 2814, 2817, 5, 226, 114, 2, 2815, 2817, 5, 230, 116, 2, 2816, 2814, 3, 2, 2, 2, 2816, 2815, 3, 2, 2, 2, 2816, 2817, 3, 2, 2, 2, 2817, 225, 3, 2, 2, 2, 2818, 2820, 5, 228, 115, 2, 2819, 2821, 5, 232, 117, 2, 2820, 2819, 3, 2, 2, 2, 2820, 2821, 3, 2, 2, 2, 2821, 227, 3, 2, 2, 2, 2822, 2823, 5, 234, 118, 2, 2823, 2824, 5, 274, 138, 2, 2824, 2826, 3, 2, 2, 2, 2825, 2822, 3, 2, 2, 2, 2826, 2827, 3, 2, 2, 2, 2827, 2825, 3, 2, 2, 2, 2827, 2828, 3, 2, 2, 2, 2828, 229, 3, 2, 2, 2, 2829, 2832, 5, 232, 117, 2, 2830, 2833, 5, 228, 115, 2, 2831, 2833, 5, 232, 117, 2, 2832, 2830, 3, 2, 2, 2, 2832, 2831, 3, 2, 2, 2, 2832, 2833, 3, 2, 2, 2, 2833, 231, 3, 2, 2, 2, 2834, 2835, 5, 234, 118, 2, 2835, 2836, 5, 274, 138, 2, 2836, 2837, 7, 237, 2, 2, 2837, 2838, 5, 274, 138, 2, 2838, 233, 3, 2, 2, 2, 2839, 2841, 9, 40, 2, 2, 2840, 2839, 3, 2, 2, 2, 2840, 2841, 3, 2, 2, 2, 2841, 2842, 3, 2, 2, 2, 2842, 2843, 9, 41, 2, 2, 2843, 235, 3, 2, 2, 2, 2844, 2848, 7, 93, 2, 2, 2845, 2846, 7, 11, 2, 2, 2846, 2848, 5, 270, 136, 2, 2847, 2844, 3, 2, 2, 2, 2847, 2845, 3, 2, 2, 2, 2848, 237, 3, 2, 2, 2, 2849, 2850, 7, 19, 2, 2, 2850, 2851, 7, 273, 2, 2, 2851, 2852, 5, 238, 120, 2, 2852, 2853, 7, 275, 2, 2, 2853, 2896, 3, 2, 2, 2, 2854, 2855, 7, 142, 2, 2, 2855, 2856, 7, 273, 2, 2, 2856, 2857, 5, 238, 120, 2, 2857, 2858, 7, 290, 2, 2, 2858, 2859, 5, 238, 120, 2, 2859, 2860, 7, 275, 2, 2, 2860, 2896, 3, 2, 2, 2, 2861, 2868, 7, 225, 2, 2, 2862, 2864, 7, 273, 2, 2, 2863, 2865, 5, 248, 125, 2, 2864, 2863, 3, 2, 2, 2, 2864, 2865, 3, 2, 2, 2, 2865, 2866, 3, 2, 2, 2, 2866, 2869, 7, 275, 2, 2, 2867, 2869, 7, 271, 2, 2, 2868, 2862, 3, 2, 2, 2, 2868, 2867, 3, 2, 2, 2, 2869, 2896, 3, 2, 2, 2, 2870, 2871, 7, 120, 2, 2, 2871, 2874, 9, 42, 2, 2, 2872, 2873, 7, 237, 2, 2, 2873, 2875, 7, 146, 2, 2, 2874, 2872, 3, 2, 2, 2, 2874, 2875, 3, 2, 2, 2, 2875, 2896, 3, 2, 2, 2, 2876, 2877, 7, 120, 2, 2, 2877, 2880, 9, 43, 2, 2, 2878, 2879, 7, 237, 2, 2, 2879, 2881, 9, 44, 2, 2, 2880, 2878, 3, 2, 2, 2, 2880, 2881, 3, 2, 2, 2, 2881, 2896, 3, 2, 2, 2, 2882, 2893, 5, 274, 138, 2, 2883, 2884, 7, 3, 2, 2, 2884, 2889, 7, 297, 2, 2, 2885, 2886, 7, 290, 2, 2, 2886, 2888, 7, 297, 2, 2, 2887, 2885, 3, 2, 2, 2, 2888, 2891, 3, 2, 2, 2, 2889, 2887, 3, 2, 2, 2, 2889, 2890, 3, 2, 2, 2, 2890, 2892, 3, 2, 2, 2, 2891, 2889, 3, 2, 2, 2, 2892, 2894, 7, 4, 2, 2, 2893, 2883, 3, 2, 2, 2, 2893, 2894, 3, 2, 2, 2, 2894, 2896, 3, 2, 2, 2, 2895, 2849, 3, 2, 2, 2, 2895, 2854, 3, 2, 2, 2, 2895, 2861, 3, 2, 2, 2, 2895, 2870, 3, 2, 2, 2, 2895, 2876, 3, 2, 2, 2, 2895, 2882, 3, 2, 2, 2, 2896, 239, 3, 2, 2, 2, 2897, 2902, 5, 242, 122, 2, 2898, 2899, 7, 290, 2, 2, 2899, 2901, 5, 242, 122, 2, 2900, 2898, 3, 2, 2, 2, 2901, 2904, 3, 2, 2, 2, 2902, 2900, 3, 2, 2, 2, 2902, 2903, 3, 2, 2, 2, 2903, 241, 3, 2, 2, 2, 2904, 2902, 3, 2, 2, 2, 2905, 2906, 5, 182, 92, 2, 2906, 2909, 5, 238, 120, 2, 2907, 2908, 7, 152, 2, 2, 2908, 2910, 7, 153, 2, 2, 2909, 2907, 3, 2, 2, 2, 2909, 2910, 3, 2, 2, 2, 2910, 2912, 3, 2, 2, 2, 2911, 2913, 5, 34, 18, 2, 2912, 2911, 3, 2, 2, 2, 2912, 2913, 3, 2, 2, 2, 2913, 2915, 3, 2, 2, 2, 2914, 2916, 5, 236, 119, 2, 2915, 2914, 3, 2, 2, 2, 2915, 2916, 3, 2, 2, 2, 2916, 243, 3, 2, 2, 2, 2917, 2922, 5, 246, 124, 2, 2918, 2919, 7, 290, 2, 2, 2919, 2921, 5, 246, 124, 2, 2920, 2918, 3, 2, 2, 2, 2921, 2924, 3, 2, 2, 2, 2922, 2920, 3, 2, 2, 2, 2922, 2923, 3, 2, 2, 2, 2923, 245, 3, 2, 2, 2, 2924, 2922, 3, 2, 2, 2, 2925, 2926, 5, 270, 136, 2, 2926, 2929, 5, 238, 120, 2, 2927, 2928, 7, 152, 2, 2, 2928, 2930, 7, 153, 2, 2, 2929, 2927, 3, 2, 2, 2, 2929, 2930, 3, 2, 2, 2, 2930, 2932, 3, 2, 2, 2, 2931, 2933, 5, 34, 18, 2, 2932, 2931, 3, 2, 2, 2, 2932, 2933, 3, 2, 2, 2, 2933, 247, 3, 2, 2, 2, 2934, 2939, 5, 250, 126, 2, 2935, 2936, 7, 290, 2, 2, 2936, 2938, 5, 250, 126, 2, 2937, 2935, 3, 2, 2, 2, 2938, 2941, 3, 2, 2, 2, 2939, 2937, 3, 2, 2, 2, 2939, 2940, 3, 2, 2, 2, 2940, 249, 3, 2, 2, 2, 2941, 2939, 3, 2, 2, 2, 2942, 2944, 5, 274, 138, 2, 2943, 2945, 7, 291, 2, 2, 2944, 2943, 3, 2, 2, 2, 2944, 2945, 3, 2, 2, 2, 2945, 2946, 3, 2, 2, 2, 2946, 2949, 5, 238, 120, 2, 2947, 2948, 7, 152, 2, 2, 2948, 2950, 7, 153, 2, 2, 2949, 2947, 3, 2, 2, 2, 2949, 2950, 3, 2, 2, 2, 2950, 2952, 3, 2, 2, 2, 2951, 2953, 5, 34, 18, 2, 2952, 2951, 3, 2, 2, 2, 2952, 2953, 3, 2, 2, 2, 2953, 251, 3, 2, 2, 2, 2954, 2955, 7, 263, 2, 2, 2955, 2956, 5, 200, 101, 2, 2956, 2957, 7, 235, 2, 2, 2957, 2958, 5, 200, 101, 2, 2958, 253, 3, 2, 2, 2, 2959, 2960, 7, 265, 2, 2, 2960, 2965, 5, 256, 129, 2, 2961, 2962, 7, 290, 2, 2, 2962, 2964, 5, 256, 129, 2, 2963, 2961, 3, 2, 2, 2, 2964, 2967, 3, 2, 2, 2, 2965, 2963, 3, 2, 2, 2, 2965, 2966, 3, 2, 2, 2, 2966, 255, 3, 2, 2, 2, 2967, 2965, 3, 2, 2, 2, 2968, 2969, 5, 270, 136, 2, 2969, 2970, 7, 20, 2, 2, 2970, 2971, 5, 258, 130, 2, 2971, 257, 3, 2, 2, 2, 2972, 3019, 5, 270, 136, 2, 2973, 2974, 7, 3, 2, 2, 2974, 2975, 5, 270, 136, 2, 2975, 2976, 7, 4, 2, 2, 2976, 3019, 3, 2, 2, 2, 2977, 3012, 7, 3, 2, 2, 2978, 2979, 7, 36, 2, 2, 2979, 2980, 7, 28, 2, 2, 2980, 2985, 5, 200, 101, 2, 2981, 2982, 7, 290, 2, 2, 2982, 2984, 5, 200, 101, 2, 2983, 2981, 3, 2, 2, 2, 2984, 2987, 3, 2, 2, 2, 2985, 2983, 3, 2, 2, 2, 2985, 2986, 3, 2, 2, 2, 2986, 3013, 3, 2, 2, 2, 2987, 2985, 3, 2, 2, 2, 2988, 2989, 9, 45, 2, 2, 2989, 2990, 7, 28, 2, 2, 2990, 2995, 5, 200, 101, 2, 2991, 2992, 7, 290, 2, 2, 2992, 2994, 5, 200, 101, 2, 2993, 2991, 3, 2, 2, 2, 2994, 2997, 3, 2, 2, 2, 2995, 2993, 3, 2, 2, 2, 2995, 2996, 3, 2, 2, 2, 2996, 2999, 3, 2, 2, 2, 2997, 2995, 3, 2, 2, 2, 2998, 2988, 3, 2, 2, 2, 2998, 2999, 3, 2, 2, 2, 2999, 3010, 3, 2, 2, 2, 3000, 3001, 9, 46, 2, 2, 3001, 3002, 7, 28, 2, 2, 3002, 3007, 5, 90, 46, 2, 3003, 3004, 7, 290, 2, 2, 3004, 3006, 5, 90, 46, 2, 3005, 3003, 3, 2, 2, 2, 3006, 3009, 3, 2, 2, 2, 3007, 3005, 3, 2, 2, 2, 3007, 3008, 3, 2, 2, 2, 3008, 3011, 3, 2, 2, 2, 3009, 3007, 3, 2, 2, 2, 3010, 3000, 3, 2, 2, 2, 3010, 3011, 3, 2, 2, 2, 3011, 3013, 3, 2, 2, 2, 3012, 2978, 3, 2, 2, 2, 3012, 2998, 3, 2, 2, 2, 3013, 3015, 3, 2, 2, 2, 3014, 3016, 5, 260, 131, 2, 3015, 3014, 3, 2, 2, 2, 3015, 3016, 3, 2, 2, 2, 3016, 3017, 3, 2, 2, 2, 3017, 3019, 7, 4, 2, 2, 3018, 2972, 3, 2, 2, 2, 3018, 2973, 3, 2, 2, 2, 3018, 2977, 3, 2, 2, 2, 3019, 259, 3, 2, 2, 2, 3020, 3021, 7, 183, 2, 2, 3021, 3037, 5, 262, 132, 2, 3022, 3023, 7, 204, 2, 2, 3023, 3037, 5, 262, 132, 2, 3024, 3025, 7, 183, 2, 2, 3025, 3026, 7, 24, 2, 2, 3026, 3027, 5, 262, 132, 2, 3027, 3028, 7, 15, 2, 2, 3028, 3029, 5, 262, 132, 2, 3029, 3037, 3, 2, 2, 2, 3030, 3031, 7, 204, 2, 2, 3031, 3032, 7, 24, 2, 2, 3032, 3033, 5, 262, 132, 2, 3033, 3034, 7, 15, 2, 2, 3034, 3035, 5, 262, 132, 2, 3035, 3037, 3, 2, 2, 2, 3036, 3020, 3, 2, 2, 2, 3036, 3022, 3, 2, 2, 2, 3036, 3024, 3, 2, 2, 2, 3036, 3030, 3, 2, 2, 2, 3037, 261, 3, 2, 2, 2, 3038, 3039, 7, 249, 2, 2, 3039, 3046, 9, 47, 2, 2, 3040, 3041, 7, 54, 2, 2, 3041, 3046, 7, 203, 2, 2, 3042, 3043, 5, 200, 101, 2, 3043, 3044, 9, 47, 2, 2, 3044, 3046, 3, 2, 2, 2, 3045, 3038, 3, 2, 2, 2, 3045, 3040, 3, 2, 2, 2, 3045, 3042, 3, 2, 2, 2, 3046, 263, 3, 2, 2, 2, 3047, 3052, 5, 268, 135, 2, 3048, 3049, 7, 290, 2, 2, 3049, 3051, 5, 268, 135, 2, 3050, 3048, 3, 2, 2, 2, 3051, 3054, 3, 2, 2, 2, 3052, 3050, 3, 2, 2, 2, 3052, 3053, 3, 2, 2, 2, 3053, 265, 3, 2, 2, 2, 3054, 3052, 3, 2, 2, 2, 3055, 3060, 5, 268, 135, 2, 3056, 3060, 7, 91, 2, 2, 3057, 3060, 7, 130, 2, 2, 3058, 3060, 7, 197, 2, 2, 3059, 3055, 3, 2, 2, 2, 3059, 3056, 3, 2, 2, 2, 3059, 3057, 3, 2, 2, 2, 3059, 3058, 3, 2, 2, 2, 3060, 267, 3, 2, 2, 2, 3061, 3066, 5, 274, 138, 2, 3062, 3063, 7, 289, 2, 2, 3063, 3065, 5, 274, 138, 2, 3064, 3062, 3, 2, 2, 2, 3065, 3068, 3, 2, 2, 2, 3066, 3064, 3, 2, 2, 2, 3066, 3067, 3, 2, 2, 2, 3067, 269, 3, 2, 2, 2, 3068, 3066, 3, 2, 2, 2, 3069, 3070, 5, 274, 138, 2, 3070, 3071, 5, 272, 137, 2, 3071, 271, 3, 2, 2, 2, 3072, 3073, 7, 278, 2, 2, 3073, 3075, 5, 274, 138, 2, 3074, 3072, 3, 2, 2, 2, 3075, 3076, 3, 2, 2, 2, 3076, 3074, 3, 2, 2, 2, 3076, 3077, 3, 2, 2, 2, 3077, 3080, 3, 2, 2, 2, 3078, 3080, 3, 2, 2, 2, 3079, 3074, 3, 2, 2, 2, 3079, 3078, 3, 2, 2, 2, 3080, 273, 3, 2, 2, 2, 3081, 3085, 5, 276, 139, 2, 3082, 3083, 6, 138, 18, 2, 3083, 3085, 5, 286, 144, 2, 3084, 3081, 3, 2, 2, 2, 3084, 3082, 3, 2, 2, 2, 3085, 275, 3, 2, 2, 2, 3086, 3093, 7, 303, 2, 2, 3087, 3093, 5, 278, 140, 2, 3088, 3089, 6, 139, 19, 2, 3089, 3093, 5, 284, 143, 2, 3090, 3091, 6, 139, 20, 2, 3091, 3093, 5, 288, 145, 2, 3092, 3086, 3, 2, 2, 2, 3092, 3087, 3, 2, 2, 2, 3092, 3088, 3, 2, 2, 2, 3092, 3090, 3, 2, 2, 2, 3093, 277, 3, 2, 2, 2, 3094, 3095, 7, 304, 2, 2, 3095, 279, 3, 2, 2, 2, 3096, 3098, 6, 141, 21, 2, 3097, 3099, 7, 278, 2, 2, 3098, 3097, 3, 2, 2, 2, 3098, 3099, 3, 2, 2, 2, 3099, 3100, 3, 2, 2, 2, 3100, 3140, 7, 298, 2, 2, 3101, 3103, 6, 141, 22, 2, 3102, 3104, 7, 278, 2, 2, 3103, 3102, 3, 2, 2, 2, 3103, 3104, 3, 2, 2, 2, 3104, 3105, 3, 2, 2, 2, 3105, 3140, 7, 299, 2, 2, 3106, 3108, 6, 141, 23, 2, 3107, 3109, 7, 278, 2, 2, 3108, 3107, 3, 2, 2, 2, 3108, 3109, 3, 2, 2, 2, 3109, 3110, 3, 2, 2, 2, 3110, 3140, 9, 48, 2, 2, 3111, 3113, 7, 278, 2, 2, 3112, 3111, 3, 2, 2, 2, 3112, 3113, 3, 2, 2, 2, 3113, 3114, 3, 2, 2, 2, 3114, 3140, 7, 297, 2, 2, 3115, 3117, 7, 278, 2, 2, 3116, 3115, 3, 2, 2, 2, 3116, 3117, 3, 2, 2, 2, 3117, 3118, 3, 2, 2, 2, 3118, 3140, 7, 294, 2, 2, 3119, 3121, 7, 278, 2, 2, 3120, 3119, 3, 2, 2, 2, 3120, 3121, 3, 2, 2, 2, 3121, 3122, 3, 2, 2, 2, 3122, 3140, 7, 295, 2, 2, 3123, 3125, 7, 278, 2, 2, 3124, 3123, 3, 2, 2, 2, 3124, 3125, 3, 2, 2, 2, 3125, 3126, 3, 2, 2, 2, 3126, 3140, 7, 296, 2, 2, 3127, 3129, 7, 278, 2, 2, 3128, 3127, 3, 2, 2, 2, 3128, 3129, 3, 2, 2, 2, 3129, 3130, 3, 2, 2, 2, 3130, 3140, 7, 301, 2, 2, 3131, 3133, 7, 278, 2, 2, 3132, 3131, 3, 2, 2, 2, 3132, 3133, 3, 2, 2, 2, 3133, 3134, 3, 2, 2, 2, 3134, 3140, 7, 300, 2, 2, 3135, 3137, 7, 278, 2, 2, 3136, 3135, 3, 2, 2, 2, 3136, 3137, 3, 2, 2, 2, 3137, 3138, 3, 2, 2, 2, 3138, 3140, 7, 302, 2, 2, 3139, 3096, 3, 2, 2, 2, 3139, 3101, 3, 2, 2, 2, 3139, 3106, 3, 2, 2, 2, 3139, 3112, 3, 2, 2, 2, 3139, 3116, 3, 2, 2, 2, 3139, 3120, 3, 2, 2, 2, 3139, 3124, 3, 2, 2, 2, 3139, 3128, 3, 2, 2, 2, 3139, 3132, 3, 2, 2, 2, 3139, 3136, 3, 2, 2, 2, 3140, 281, 3, 2, 2, 2, 3141, 3142, 7, 247, 2, 2, 3142, 3149, 5, 238, 120, 2, 3143, 3149, 5, 34, 18, 2, 3144, 3149, 5, 236, 119, 2, 3145, 3146, 9, 49, 2, 2, 3146, 3147, 7, 152, 2, 2, 3147, 3149, 7, 153, 2, 2, 3148, 3141, 3, 2, 2, 2, 3148, 3143, 3, 2, 2, 2, 3148, 3144, 3, 2, 2, 2, 3148, 3145, 3, 2, 2, 2, 3149, 283, 3, 2, 2, 2, 3150, 3151, 9, 50, 2, 2, 3151, 285, 3, 2, 2, 2, 3152, 3153, 9, 51, 2, 2, 3153, 287, 3, 2, 2, 2, 3154, 3155, 9, 52, 2, 2, 3155, 289, 3, 2, 2, 2, 419, 294, 319, 324, 332, 340, 342, 362, 366, 372, 375, 378, 385, 388, 392, 395, 402, 413, 415, 423, 426, 430, 433, 439, 450, 456, 461, 525, 534, 538, 544, 548, 553, 559, 571, 579, 585, 598, 603, 619, 626, 630, 636, 651, 655, 661, 667, 670, 673, 679, 683, 691, 693, 702, 705, 714, 719, 725, 732, 735, 741, 752, 755, 759, 764, 769, 776, 779, 782, 789, 794, 803, 811, 817, 820, 823, 829, 833, 837, 841, 843, 851, 859, 865, 871, 874, 878, 881, 885, 913, 916, 920, 926, 929, 932, 938, 946, 951, 957, 963, 971, 978, 986, 1003, 1017, 1020, 1026, 1035, 1044, 1051, 1054, 1066, 1070, 1077, 1193, 1201, 1209, 1218, 1228, 1232, 1235, 1241, 1247, 1259, 1271, 1276, 1285, 1293, 1300, 1302, 1305, 1310, 1314, 1319, 1322, 1327, 1332, 1335, 1340, 1344, 1349, 1351, 1355, 1364, 1372, 1381, 1388, 1397, 1402, 1405, 1427, 1429, 1438, 1445, 1448, 1455, 1459, 1465, 1473, 1484, 1495, 1502, 1508, 1521, 1528, 1535, 1547, 1555, 1561, 1564, 1573, 1576, 1585, 1588, 1597, 1600, 1609, 1612, 1615, 1620, 1622, 1634, 1641, 1648, 1651, 1653, 1665, 1669, 1673, 1679, 1683, 1691, 1695, 1698, 1701, 1704, 1708, 1712, 1717, 1721, 1724, 1727, 1730, 1734, 1739, 1743, 1746, 1749, 1752, 1754, 1760, 1767, 1772, 1775, 1778, 1782, 1792, 1796, 1798, 1801, 1805, 1811, 1815, 1826, 1836, 1848, 1863, 1868, 1875, 1891, 1896, 1909, 1914, 1922, 1928, 1932, 1941, 1951, 1966, 1971, 1973, 1977, 1986, 1999, 2004, 2008, 2016, 2019, 2023, 2037, 2050, 2055, 2059, 2062, 2067, 2076, 2079, 2084, 2091, 2094, 2099, 2105, 2111, 2115, 2121, 2125, 2128, 2133, 2136, 2141, 2145, 2148, 2151, 2157, 2162, 2167, 2185, 2187, 2190, 2201, 2210, 2217, 2225, 2232, 2236, 2244, 2252, 2258, 2266, 2278, 2281, 2287, 2291, 2293, 2302, 2314, 2316, 2323, 2330, 2336, 2342, 2344, 2351, 2359, 2365, 2372, 2378, 2382, 2384, 2391, 2400, 2407, 2417, 2422, 2426, 2435, 2448, 2450, 2458, 2460, 2464, 2472, 2481, 2487, 2495, 2500, 2512, 2517, 2520, 2526, 2530, 2535, 2540, 2545, 2551, 2572, 2574, 2583, 2587, 2596, 2600, 2618, 2621, 2629, 2638, 2661, 2672, 2679, 2682, 2691, 2695, 2699, 2711, 2736, 2743, 2746, 2761, 2765, 2775, 2777, 2782, 2789, 2801, 2803, 2816, 2820, 2827, 2832, 2840, 2847, 2864, 2868, 2874, 2880, 2889, 2893, 2895, 2902, 2909, 2912, 2915, 2922, 2929, 2932, 2939, 2944, 2949, 2952, 2965, 2985, 2995, 2998, 3007, 3010, 3012, 3015, 3018, 3036, 3045, 3052, 3059, 3066, 3076, 3079, 3084, 3092, 3098, 3103, 3108, 3112, 3116, 3120, 3124, 3128, 3132, 3136, 3139, 3148] \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQL.tokens b/mypages/src/main/java/io/leego/mypages/sql/SQL.tokens new file mode 100644 index 0000000..9abb698 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQL.tokens @@ -0,0 +1,334 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +ADD=8 +AFTER=9 +ALL=10 +ALTER=11 +ANALYZE=12 +AND=13 +ANTI=14 +ANY=15 +ARCHIVE=16 +ARRAY=17 +AS=18 +ASC=19 +AT=20 +AUTHORIZATION=21 +BETWEEN=22 +BOTH=23 +BUCKET=24 +BUCKETS=25 +BY=26 +CACHE=27 +CASCADE=28 +CASE=29 +CAST=30 +CHANGE=31 +CHECK=32 +CLEAR=33 +CLUSTER=34 +CLUSTERED=35 +CODEGEN=36 +COLLATE=37 +COLLECTION=38 +COLUMN=39 +COLUMNS=40 +COMMENT=41 +COMMIT=42 +COMPACT=43 +COMPACTIONS=44 +COMPUTE=45 +CONCATENATE=46 +CONSTRAINT=47 +COST=48 +CREATE=49 +CROSS=50 +CUBE=51 +CURRENT=52 +CURRENT_DATE=53 +CURRENT_TIME=54 +CURRENT_TIMESTAMP=55 +CURRENT_USER=56 +DAY=57 +DATA=58 +DATABASE=59 +DATABASES=60 +DBPROPERTIES=61 +DEFINED=62 +DELETE=63 +DELIMITED=64 +DESC=65 +DESCRIBE=66 +DFS=67 +DIRECTORIES=68 +DIRECTORY=69 +DISTINCT=70 +DISTRIBUTE=71 +DIV=72 +DROP=73 +ELSE=74 +END=75 +ESCAPE=76 +ESCAPED=77 +EXCEPT=78 +EXCHANGE=79 +EXISTS=80 +EXPLAIN=81 +EXPORT=82 +EXTENDED=83 +EXTERNAL=84 +EXTRACT=85 +FALSE=86 +FETCH=87 +FIELDS=88 +FILTER=89 +FILEFORMAT=90 +FIRST=91 +FOLLOWING=92 +FOR=93 +FOREIGN=94 +FORMAT=95 +FORMATTED=96 +FROM=97 +FULL=98 +FUNCTION=99 +FUNCTIONS=100 +GLOBAL=101 +GRANT=102 +GROUP=103 +GROUPING=104 +HAVING=105 +HOUR=106 +IF=107 +IGNORE=108 +IMPORT=109 +IN=110 +INDEX=111 +INDEXES=112 +INNER=113 +INPATH=114 +INPUTFORMAT=115 +INSERT=116 +INTERSECT=117 +INTERVAL=118 +INTO=119 +IS=120 +ITEMS=121 +JOIN=122 +KEYS=123 +LAST=124 +LATERAL=125 +LAZY=126 +LEADING=127 +LEFT=128 +LIKE=129 +LIMIT=130 +LINES=131 +LIST=132 +LOAD=133 +LOCAL=134 +LOCATION=135 +LOCK=136 +LOCKS=137 +LOGICAL=138 +MACRO=139 +MAP=140 +MATCHED=141 +MERGE=142 +MINUTE=143 +MONTH=144 +MSCK=145 +NAMESPACE=146 +NAMESPACES=147 +NATURAL=148 +NO=149 +NOT=150 +NULL=151 +NULLS=152 +OF=153 +OFFSET=154 +ON=155 +ONLY=156 +OPTION=157 +OPTIONS=158 +OR=159 +ORDER=160 +OUT=161 +OUTER=162 +OUTPUTFORMAT=163 +OVER=164 +OVERLAPS=165 +OVERLAY=166 +OVERWRITE=167 +PARTITION=168 +PARTITIONED=169 +PARTITIONS=170 +PERCENTLIT=171 +PIVOT=172 +PLACING=173 +POSITION=174 +PRECEDING=175 +PRIMARY=176 +PRINCIPALS=177 +PROPERTIES=178 +PURGE=179 +QUERY=180 +RANGE=181 +RECORDREADER=182 +RECORDWRITER=183 +RECOVER=184 +REDUCE=185 +REFERENCES=186 +REFRESH=187 +RENAME=188 +REPAIR=189 +REPLACE=190 +RESET=191 +RESPECT=192 +RESTRICT=193 +REVOKE=194 +RIGHT=195 +RLIKE=196 +ROLE=197 +ROLES=198 +ROLLBACK=199 +ROLLUP=200 +ROW=201 +ROWS=202 +SECOND=203 +SCHEMA=204 +SELECT=205 +SEMI=206 +SEPARATED=207 +SERDE=208 +SERDEPROPERTIES=209 +SESSION_USER=210 +SET=211 +SETMINUS=212 +SETS=213 +SHOW=214 +SKEWED=215 +SOME=216 +SORT=217 +SORTED=218 +START=219 +STATISTICS=220 +STORED=221 +STRATIFY=222 +STRUCT=223 +SUBSTR=224 +SUBSTRING=225 +SYNC=226 +TABLE=227 +TABLES=228 +TABLESAMPLE=229 +TBLPROPERTIES=230 +TEMPORARY=231 +TERMINATED=232 +THEN=233 +TIME=234 +TO=235 +TOUCH=236 +TRAILING=237 +TRANSACTION=238 +TRANSACTIONS=239 +TRANSFORM=240 +TRIM=241 +TRUE=242 +TRUNCATE=243 +TRY_CAST=244 +TYPE=245 +UNARCHIVE=246 +UNBOUNDED=247 +UNCACHE=248 +UNION=249 +UNIQUE=250 +UNKNOWN=251 +UNLOCK=252 +UNSET=253 +UPDATE=254 +USE=255 +USER=256 +USING=257 +VALUES=258 +VIEW=259 +VIEWS=260 +WHEN=261 +WHERE=262 +WINDOW=263 +WITH=264 +YEAR=265 +ZONE=266 +EQ=267 +NSEQ=268 +NEQ=269 +NEQJ=270 +LT=271 +LTE=272 +GT=273 +GTE=274 +PLUS=275 +MINUS=276 +ASTERISK=277 +SLASH=278 +PERCENT=279 +TILDE=280 +AMPERSAND=281 +PIPE=282 +CONCAT_PIPE=283 +HAT=284 +UNDERSCORE=285 +EXCLAMATION=286 +POINT=287 +COMMA=288 +COLON=289 +SEMICOLON=290 +STRING=291 +BIGINT_LITERAL=292 +SMALLINT_LITERAL=293 +TINYINT_LITERAL=294 +INTEGER_VALUE=295 +EXPONENT_VALUE=296 +DECIMAL_VALUE=297 +FLOAT_LITERAL=298 +DOUBLE_LITERAL=299 +BIGDECIMAL_LITERAL=300 +IDENTIFIER=301 +BACKQUOTED_IDENTIFIER=302 +SIMPLE_COMMENT=303 +BRACKETED_COMMENT=304 +WS=305 +UNRECOGNIZED=306 +'('=1 +')'=2 +'/*+'=3 +'*/'=4 +'->'=5 +'['=6 +']'=7 +'<=>'=268 +'<>'=269 +'!='=270 +'<'=271 +'>'=273 +'+'=275 +'-'=276 +'*'=277 +'/'=278 +'%'=279 +'~'=280 +'&'=281 +'|'=282 +'||'=283 +'^'=284 +'_'=285 +'!'=286 +'.'=287 +','=288 +':'=289 +';'=290 diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQLBaseListener.java b/mypages/src/main/java/io/leego/mypages/sql/SQLBaseListener.java new file mode 100644 index 0000000..4491658 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQLBaseListener.java @@ -0,0 +1,3410 @@ +package io.leego.mypages.sql; + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link SQLListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +public class SQLBaseListener implements SQLListener { + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleStatement(SQLParser.SingleStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleStatement(SQLParser.SingleStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleExpression(SQLParser.SingleExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleExpression(SQLParser.SingleExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleTableIdentifier(SQLParser.SingleTableIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleTableIdentifier(SQLParser.SingleTableIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleMultipartIdentifier(SQLParser.SingleMultipartIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleMultipartIdentifier(SQLParser.SingleMultipartIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleFunctionIdentifier(SQLParser.SingleFunctionIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleFunctionIdentifier(SQLParser.SingleFunctionIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleDataType(SQLParser.SingleDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleDataType(SQLParser.SingleDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleTableSchema(SQLParser.SingleTableSchemaContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleTableSchema(SQLParser.SingleTableSchemaContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStatementDefault(SQLParser.StatementDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStatementDefault(SQLParser.StatementDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDmlStatement(SQLParser.DmlStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDmlStatement(SQLParser.DmlStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUse(SQLParser.UseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUse(SQLParser.UseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateNamespace(SQLParser.CreateNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateNamespace(SQLParser.CreateNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetNamespaceProperties(SQLParser.SetNamespacePropertiesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetNamespaceProperties(SQLParser.SetNamespacePropertiesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetNamespaceLocation(SQLParser.SetNamespaceLocationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetNamespaceLocation(SQLParser.SetNamespaceLocationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDropNamespace(SQLParser.DropNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDropNamespace(SQLParser.DropNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowNamespaces(SQLParser.ShowNamespacesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowNamespaces(SQLParser.ShowNamespacesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateTable(SQLParser.CreateTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateTable(SQLParser.CreateTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateTableLike(SQLParser.CreateTableLikeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateTableLike(SQLParser.CreateTableLikeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterReplaceTable(SQLParser.ReplaceTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitReplaceTable(SQLParser.ReplaceTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnalyze(SQLParser.AnalyzeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnalyze(SQLParser.AnalyzeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnalyzeTables(SQLParser.AnalyzeTablesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnalyzeTables(SQLParser.AnalyzeTablesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAddTableColumns(SQLParser.AddTableColumnsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAddTableColumns(SQLParser.AddTableColumnsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRenameTableColumn(SQLParser.RenameTableColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRenameTableColumn(SQLParser.RenameTableColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDropTableColumns(SQLParser.DropTableColumnsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDropTableColumns(SQLParser.DropTableColumnsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRenameTable(SQLParser.RenameTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRenameTable(SQLParser.RenameTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetTableProperties(SQLParser.SetTablePropertiesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetTableProperties(SQLParser.SetTablePropertiesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUnsetTableProperties(SQLParser.UnsetTablePropertiesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUnsetTableProperties(SQLParser.UnsetTablePropertiesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAlterTableAlterColumn(SQLParser.AlterTableAlterColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAlterTableAlterColumn(SQLParser.AlterTableAlterColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHiveChangeColumn(SQLParser.HiveChangeColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHiveChangeColumn(SQLParser.HiveChangeColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHiveReplaceColumns(SQLParser.HiveReplaceColumnsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHiveReplaceColumns(SQLParser.HiveReplaceColumnsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetTableSerDe(SQLParser.SetTableSerDeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetTableSerDe(SQLParser.SetTableSerDeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAddTablePartition(SQLParser.AddTablePartitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAddTablePartition(SQLParser.AddTablePartitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRenameTablePartition(SQLParser.RenameTablePartitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRenameTablePartition(SQLParser.RenameTablePartitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDropTablePartitions(SQLParser.DropTablePartitionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDropTablePartitions(SQLParser.DropTablePartitionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetTableLocation(SQLParser.SetTableLocationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetTableLocation(SQLParser.SetTableLocationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRecoverPartitions(SQLParser.RecoverPartitionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRecoverPartitions(SQLParser.RecoverPartitionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDropTable(SQLParser.DropTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDropTable(SQLParser.DropTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDropView(SQLParser.DropViewContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDropView(SQLParser.DropViewContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateView(SQLParser.CreateViewContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateView(SQLParser.CreateViewContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateTempViewUsing(SQLParser.CreateTempViewUsingContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateTempViewUsing(SQLParser.CreateTempViewUsingContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAlterViewQuery(SQLParser.AlterViewQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAlterViewQuery(SQLParser.AlterViewQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateFunction(SQLParser.CreateFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateFunction(SQLParser.CreateFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDropFunction(SQLParser.DropFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDropFunction(SQLParser.DropFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExplain(SQLParser.ExplainContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExplain(SQLParser.ExplainContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowTables(SQLParser.ShowTablesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowTables(SQLParser.ShowTablesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowTableExtended(SQLParser.ShowTableExtendedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowTableExtended(SQLParser.ShowTableExtendedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowTblProperties(SQLParser.ShowTblPropertiesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowTblProperties(SQLParser.ShowTblPropertiesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowColumns(SQLParser.ShowColumnsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowColumns(SQLParser.ShowColumnsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowViews(SQLParser.ShowViewsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowViews(SQLParser.ShowViewsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowPartitions(SQLParser.ShowPartitionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowPartitions(SQLParser.ShowPartitionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowFunctions(SQLParser.ShowFunctionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowFunctions(SQLParser.ShowFunctionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowCreateTable(SQLParser.ShowCreateTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowCreateTable(SQLParser.ShowCreateTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowCurrentNamespace(SQLParser.ShowCurrentNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowCurrentNamespace(SQLParser.ShowCurrentNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDescribeFunction(SQLParser.DescribeFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDescribeFunction(SQLParser.DescribeFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDescribeNamespace(SQLParser.DescribeNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDescribeNamespace(SQLParser.DescribeNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDescribeRelation(SQLParser.DescribeRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDescribeRelation(SQLParser.DescribeRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDescribeQuery(SQLParser.DescribeQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDescribeQuery(SQLParser.DescribeQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCommentNamespace(SQLParser.CommentNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCommentNamespace(SQLParser.CommentNamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCommentTable(SQLParser.CommentTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCommentTable(SQLParser.CommentTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRefreshTable(SQLParser.RefreshTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRefreshTable(SQLParser.RefreshTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRefreshFunction(SQLParser.RefreshFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRefreshFunction(SQLParser.RefreshFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRefreshResource(SQLParser.RefreshResourceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRefreshResource(SQLParser.RefreshResourceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCacheTable(SQLParser.CacheTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCacheTable(SQLParser.CacheTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUncacheTable(SQLParser.UncacheTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUncacheTable(SQLParser.UncacheTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterClearCache(SQLParser.ClearCacheContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitClearCache(SQLParser.ClearCacheContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLoadData(SQLParser.LoadDataContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLoadData(SQLParser.LoadDataContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTruncateTable(SQLParser.TruncateTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTruncateTable(SQLParser.TruncateTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRepairTable(SQLParser.RepairTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRepairTable(SQLParser.RepairTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterManageResource(SQLParser.ManageResourceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitManageResource(SQLParser.ManageResourceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFailNativeCommand(SQLParser.FailNativeCommandContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFailNativeCommand(SQLParser.FailNativeCommandContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetTimeZone(SQLParser.SetTimeZoneContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetTimeZone(SQLParser.SetTimeZoneContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetQuotedConfiguration(SQLParser.SetQuotedConfigurationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetQuotedConfiguration(SQLParser.SetQuotedConfigurationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetConfiguration(SQLParser.SetConfigurationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetConfiguration(SQLParser.SetConfigurationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterResetQuotedConfiguration(SQLParser.ResetQuotedConfigurationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitResetQuotedConfiguration(SQLParser.ResetQuotedConfigurationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterResetConfiguration(SQLParser.ResetConfigurationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitResetConfiguration(SQLParser.ResetConfigurationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConfigKey(SQLParser.ConfigKeyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConfigKey(SQLParser.ConfigKeyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConfigValue(SQLParser.ConfigValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConfigValue(SQLParser.ConfigValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUnsupportedHiveNativeCommands(SQLParser.UnsupportedHiveNativeCommandsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUnsupportedHiveNativeCommands(SQLParser.UnsupportedHiveNativeCommandsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateTableHeader(SQLParser.CreateTableHeaderContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateTableHeader(SQLParser.CreateTableHeaderContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterReplaceTableHeader(SQLParser.ReplaceTableHeaderContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitReplaceTableHeader(SQLParser.ReplaceTableHeaderContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBucketSpec(SQLParser.BucketSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBucketSpec(SQLParser.BucketSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSkewSpec(SQLParser.SkewSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSkewSpec(SQLParser.SkewSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocationSpec(SQLParser.LocationSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocationSpec(SQLParser.LocationSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCommentSpec(SQLParser.CommentSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCommentSpec(SQLParser.CommentSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuery(SQLParser.QueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuery(SQLParser.QueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInsertOverwriteTable(SQLParser.InsertOverwriteTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInsertOverwriteTable(SQLParser.InsertOverwriteTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInsertIntoTable(SQLParser.InsertIntoTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInsertIntoTable(SQLParser.InsertIntoTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInsertOverwriteHiveDir(SQLParser.InsertOverwriteHiveDirContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInsertOverwriteHiveDir(SQLParser.InsertOverwriteHiveDirContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInsertOverwriteDir(SQLParser.InsertOverwriteDirContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInsertOverwriteDir(SQLParser.InsertOverwriteDirContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPartitionSpecLocation(SQLParser.PartitionSpecLocationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPartitionSpecLocation(SQLParser.PartitionSpecLocationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPartitionSpec(SQLParser.PartitionSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPartitionSpec(SQLParser.PartitionSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPartitionVal(SQLParser.PartitionValContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPartitionVal(SQLParser.PartitionValContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamespace(SQLParser.NamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamespace(SQLParser.NamespaceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDescribeFuncName(SQLParser.DescribeFuncNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDescribeFuncName(SQLParser.DescribeFuncNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDescribeColName(SQLParser.DescribeColNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDescribeColName(SQLParser.DescribeColNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCtes(SQLParser.CtesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCtes(SQLParser.CtesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamedQuery(SQLParser.NamedQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamedQuery(SQLParser.NamedQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableProvider(SQLParser.TableProviderContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableProvider(SQLParser.TableProviderContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateTableClauses(SQLParser.CreateTableClausesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateTableClauses(SQLParser.CreateTableClausesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTablePropertyList(SQLParser.TablePropertyListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTablePropertyList(SQLParser.TablePropertyListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableProperty(SQLParser.TablePropertyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableProperty(SQLParser.TablePropertyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTablePropertyKey(SQLParser.TablePropertyKeyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTablePropertyKey(SQLParser.TablePropertyKeyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTablePropertyValue(SQLParser.TablePropertyValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTablePropertyValue(SQLParser.TablePropertyValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstantList(SQLParser.ConstantListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstantList(SQLParser.ConstantListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNestedConstantList(SQLParser.NestedConstantListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNestedConstantList(SQLParser.NestedConstantListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateFileFormat(SQLParser.CreateFileFormatContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateFileFormat(SQLParser.CreateFileFormatContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableFileFormat(SQLParser.TableFileFormatContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableFileFormat(SQLParser.TableFileFormatContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGenericFileFormat(SQLParser.GenericFileFormatContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGenericFileFormat(SQLParser.GenericFileFormatContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStorageHandler(SQLParser.StorageHandlerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStorageHandler(SQLParser.StorageHandlerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterResource(SQLParser.ResourceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitResource(SQLParser.ResourceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleInsertQuery(SQLParser.SingleInsertQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleInsertQuery(SQLParser.SingleInsertQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultiInsertQuery(SQLParser.MultiInsertQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultiInsertQuery(SQLParser.MultiInsertQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeleteFromTable(SQLParser.DeleteFromTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeleteFromTable(SQLParser.DeleteFromTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUpdateTable(SQLParser.UpdateTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUpdateTable(SQLParser.UpdateTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMergeIntoTable(SQLParser.MergeIntoTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMergeIntoTable(SQLParser.MergeIntoTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQueryOrganization(SQLParser.QueryOrganizationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQueryOrganization(SQLParser.QueryOrganizationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultiInsertQueryBody(SQLParser.MultiInsertQueryBodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultiInsertQueryBody(SQLParser.MultiInsertQueryBodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQueryTermDefault(SQLParser.QueryTermDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQueryTermDefault(SQLParser.QueryTermDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetOperation(SQLParser.SetOperationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetOperation(SQLParser.SetOperationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQueryPrimaryDefault(SQLParser.QueryPrimaryDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQueryPrimaryDefault(SQLParser.QueryPrimaryDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFromStmt(SQLParser.FromStmtContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFromStmt(SQLParser.FromStmtContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTable(SQLParser.TableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTable(SQLParser.TableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInlineTableDefault1(SQLParser.InlineTableDefault1Context ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInlineTableDefault1(SQLParser.InlineTableDefault1Context ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSubquery(SQLParser.SubqueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSubquery(SQLParser.SubqueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSortItem(SQLParser.SortItemContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSortItem(SQLParser.SortItemContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFromStatement(SQLParser.FromStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFromStatement(SQLParser.FromStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFromStatementBody(SQLParser.FromStatementBodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFromStatementBody(SQLParser.FromStatementBodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTransformQuerySpecification(SQLParser.TransformQuerySpecificationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTransformQuerySpecification(SQLParser.TransformQuerySpecificationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRegularQuerySpecification(SQLParser.RegularQuerySpecificationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRegularQuerySpecification(SQLParser.RegularQuerySpecificationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTransformClause(SQLParser.TransformClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTransformClause(SQLParser.TransformClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSelectClause(SQLParser.SelectClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSelectClause(SQLParser.SelectClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetClause(SQLParser.SetClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetClause(SQLParser.SetClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMatchedClause(SQLParser.MatchedClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMatchedClause(SQLParser.MatchedClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNotMatchedClause(SQLParser.NotMatchedClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNotMatchedClause(SQLParser.NotMatchedClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMatchedAction(SQLParser.MatchedActionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMatchedAction(SQLParser.MatchedActionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNotMatchedAction(SQLParser.NotMatchedActionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNotMatchedAction(SQLParser.NotMatchedActionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAssignmentList(SQLParser.AssignmentListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAssignmentList(SQLParser.AssignmentListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAssignment(SQLParser.AssignmentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAssignment(SQLParser.AssignmentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWhereClause(SQLParser.WhereClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWhereClause(SQLParser.WhereClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHavingClause(SQLParser.HavingClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHavingClause(SQLParser.HavingClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHint(SQLParser.HintContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHint(SQLParser.HintContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHintStatement(SQLParser.HintStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHintStatement(SQLParser.HintStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFromClause(SQLParser.FromClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFromClause(SQLParser.FromClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAggregationClause(SQLParser.AggregationClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAggregationClause(SQLParser.AggregationClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGroupByClause(SQLParser.GroupByClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGroupByClause(SQLParser.GroupByClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGroupingAnalytics(SQLParser.GroupingAnalyticsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGroupingAnalytics(SQLParser.GroupingAnalyticsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGroupingElement(SQLParser.GroupingElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGroupingElement(SQLParser.GroupingElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGroupingSet(SQLParser.GroupingSetContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGroupingSet(SQLParser.GroupingSetContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPivotClause(SQLParser.PivotClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPivotClause(SQLParser.PivotClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPivotColumn(SQLParser.PivotColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPivotColumn(SQLParser.PivotColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPivotValue(SQLParser.PivotValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPivotValue(SQLParser.PivotValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLateralView(SQLParser.LateralViewContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLateralView(SQLParser.LateralViewContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetQuantifier(SQLParser.SetQuantifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetQuantifier(SQLParser.SetQuantifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelation(SQLParser.RelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelation(SQLParser.RelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterJoinRelation(SQLParser.JoinRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitJoinRelation(SQLParser.JoinRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterJoinType(SQLParser.JoinTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitJoinType(SQLParser.JoinTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterJoinCriteria(SQLParser.JoinCriteriaContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitJoinCriteria(SQLParser.JoinCriteriaContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSample(SQLParser.SampleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSample(SQLParser.SampleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSampleByPercentile(SQLParser.SampleByPercentileContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSampleByPercentile(SQLParser.SampleByPercentileContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSampleByRows(SQLParser.SampleByRowsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSampleByRows(SQLParser.SampleByRowsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSampleByBucket(SQLParser.SampleByBucketContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSampleByBucket(SQLParser.SampleByBucketContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSampleByBytes(SQLParser.SampleByBytesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSampleByBytes(SQLParser.SampleByBytesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdentifierList(SQLParser.IdentifierListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdentifierList(SQLParser.IdentifierListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdentifierSeq(SQLParser.IdentifierSeqContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdentifierSeq(SQLParser.IdentifierSeqContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrderedIdentifierList(SQLParser.OrderedIdentifierListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrderedIdentifierList(SQLParser.OrderedIdentifierListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrderedIdentifier(SQLParser.OrderedIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrderedIdentifier(SQLParser.OrderedIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdentifierCommentList(SQLParser.IdentifierCommentListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdentifierCommentList(SQLParser.IdentifierCommentListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdentifierComment(SQLParser.IdentifierCommentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdentifierComment(SQLParser.IdentifierCommentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableName(SQLParser.TableNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableName(SQLParser.TableNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAliasedQuery(SQLParser.AliasedQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAliasedQuery(SQLParser.AliasedQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAliasedRelation(SQLParser.AliasedRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAliasedRelation(SQLParser.AliasedRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInlineTableDefault2(SQLParser.InlineTableDefault2Context ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInlineTableDefault2(SQLParser.InlineTableDefault2Context ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableValuedFunction(SQLParser.TableValuedFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableValuedFunction(SQLParser.TableValuedFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInlineTable(SQLParser.InlineTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInlineTable(SQLParser.InlineTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionTable(SQLParser.FunctionTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionTable(SQLParser.FunctionTableContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableAlias(SQLParser.TableAliasContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableAlias(SQLParser.TableAliasContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRowFormatSerde(SQLParser.RowFormatSerdeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRowFormatSerde(SQLParser.RowFormatSerdeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRowFormatDelimited(SQLParser.RowFormatDelimitedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRowFormatDelimited(SQLParser.RowFormatDelimitedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultipartIdentifierList(SQLParser.MultipartIdentifierListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultipartIdentifierList(SQLParser.MultipartIdentifierListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultipartIdentifier(SQLParser.MultipartIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultipartIdentifier(SQLParser.MultipartIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableIdentifier(SQLParser.TableIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableIdentifier(SQLParser.TableIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionIdentifier(SQLParser.FunctionIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionIdentifier(SQLParser.FunctionIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamedExpression(SQLParser.NamedExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamedExpression(SQLParser.NamedExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamedExpressionSeq(SQLParser.NamedExpressionSeqContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamedExpressionSeq(SQLParser.NamedExpressionSeqContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPartitionFieldList(SQLParser.PartitionFieldListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPartitionFieldList(SQLParser.PartitionFieldListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPartitionTransform(SQLParser.PartitionTransformContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPartitionTransform(SQLParser.PartitionTransformContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPartitionColumn(SQLParser.PartitionColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPartitionColumn(SQLParser.PartitionColumnContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdentityTransform(SQLParser.IdentityTransformContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdentityTransform(SQLParser.IdentityTransformContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterApplyTransform(SQLParser.ApplyTransformContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitApplyTransform(SQLParser.ApplyTransformContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTransformArgument(SQLParser.TransformArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTransformArgument(SQLParser.TransformArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpression(SQLParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpression(SQLParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpressionSeq(SQLParser.ExpressionSeqContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpressionSeq(SQLParser.ExpressionSeqContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLogicalNot(SQLParser.LogicalNotContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLogicalNot(SQLParser.LogicalNotContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPredicated(SQLParser.PredicatedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPredicated(SQLParser.PredicatedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExists(SQLParser.ExistsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExists(SQLParser.ExistsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLogicalBinary(SQLParser.LogicalBinaryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLogicalBinary(SQLParser.LogicalBinaryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPredicate(SQLParser.PredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPredicate(SQLParser.PredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterValueExpressionDefault(SQLParser.ValueExpressionDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitValueExpressionDefault(SQLParser.ValueExpressionDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterComparison(SQLParser.ComparisonContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitComparison(SQLParser.ComparisonContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArithmeticBinary(SQLParser.ArithmeticBinaryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArithmeticBinary(SQLParser.ArithmeticBinaryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArithmeticUnary(SQLParser.ArithmeticUnaryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArithmeticUnary(SQLParser.ArithmeticUnaryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStruct(SQLParser.StructContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStruct(SQLParser.StructContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDereference(SQLParser.DereferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDereference(SQLParser.DereferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSimpleCase(SQLParser.SimpleCaseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSimpleCase(SQLParser.SimpleCaseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCurrentLike(SQLParser.CurrentLikeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCurrentLike(SQLParser.CurrentLikeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterColumnReference(SQLParser.ColumnReferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitColumnReference(SQLParser.ColumnReferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRowConstructor(SQLParser.RowConstructorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRowConstructor(SQLParser.RowConstructorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLast(SQLParser.LastContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLast(SQLParser.LastContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStar(SQLParser.StarContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStar(SQLParser.StarContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOverlay(SQLParser.OverlayContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOverlay(SQLParser.OverlayContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSubscript(SQLParser.SubscriptContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSubscript(SQLParser.SubscriptContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSubqueryExpression(SQLParser.SubqueryExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSubqueryExpression(SQLParser.SubqueryExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSubstring(SQLParser.SubstringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSubstring(SQLParser.SubstringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCast(SQLParser.CastContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCast(SQLParser.CastContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstantDefault(SQLParser.ConstantDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstantDefault(SQLParser.ConstantDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLambda(SQLParser.LambdaContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLambda(SQLParser.LambdaContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParenthesizedExpression(SQLParser.ParenthesizedExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParenthesizedExpression(SQLParser.ParenthesizedExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExtract(SQLParser.ExtractContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExtract(SQLParser.ExtractContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTrim(SQLParser.TrimContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTrim(SQLParser.TrimContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionCall(SQLParser.FunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionCall(SQLParser.FunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSearchedCase(SQLParser.SearchedCaseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSearchedCase(SQLParser.SearchedCaseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPosition(SQLParser.PositionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPosition(SQLParser.PositionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFirst(SQLParser.FirstContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFirst(SQLParser.FirstContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLimitExpression(SQLParser.LimitExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLimitExpression(SQLParser.LimitExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNullLiteral(SQLParser.NullLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNullLiteral(SQLParser.NullLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntervalLiteral(SQLParser.IntervalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntervalLiteral(SQLParser.IntervalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTypeConstructor(SQLParser.TypeConstructorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTypeConstructor(SQLParser.TypeConstructorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNumericLiteral(SQLParser.NumericLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNumericLiteral(SQLParser.NumericLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBooleanLiteral(SQLParser.BooleanLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBooleanLiteral(SQLParser.BooleanLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStringLiteral(SQLParser.StringLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStringLiteral(SQLParser.StringLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterComparisonOperator(SQLParser.ComparisonOperatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitComparisonOperator(SQLParser.ComparisonOperatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArithmeticOperator(SQLParser.ArithmeticOperatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArithmeticOperator(SQLParser.ArithmeticOperatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPredicateOperator(SQLParser.PredicateOperatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPredicateOperator(SQLParser.PredicateOperatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBooleanValue(SQLParser.BooleanValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBooleanValue(SQLParser.BooleanValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterval(SQLParser.IntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterval(SQLParser.IntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterErrorCapturingMultiUnitsInterval(SQLParser.ErrorCapturingMultiUnitsIntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitErrorCapturingMultiUnitsInterval(SQLParser.ErrorCapturingMultiUnitsIntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultiUnitsInterval(SQLParser.MultiUnitsIntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultiUnitsInterval(SQLParser.MultiUnitsIntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterErrorCapturingUnitToUnitInterval(SQLParser.ErrorCapturingUnitToUnitIntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitErrorCapturingUnitToUnitInterval(SQLParser.ErrorCapturingUnitToUnitIntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUnitToUnitInterval(SQLParser.UnitToUnitIntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUnitToUnitInterval(SQLParser.UnitToUnitIntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntervalValue(SQLParser.IntervalValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntervalValue(SQLParser.IntervalValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterColPosition(SQLParser.ColPositionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitColPosition(SQLParser.ColPositionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterComplexDataType(SQLParser.ComplexDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitComplexDataType(SQLParser.ComplexDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterYearMonthIntervalDataType(SQLParser.YearMonthIntervalDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitYearMonthIntervalDataType(SQLParser.YearMonthIntervalDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDayTimeIntervalDataType(SQLParser.DayTimeIntervalDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDayTimeIntervalDataType(SQLParser.DayTimeIntervalDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPrimitiveDataType(SQLParser.PrimitiveDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPrimitiveDataType(SQLParser.PrimitiveDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQualifiedColTypeWithPositionList(SQLParser.QualifiedColTypeWithPositionListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQualifiedColTypeWithPositionList(SQLParser.QualifiedColTypeWithPositionListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQualifiedColTypeWithPosition(SQLParser.QualifiedColTypeWithPositionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQualifiedColTypeWithPosition(SQLParser.QualifiedColTypeWithPositionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterColTypeList(SQLParser.ColTypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitColTypeList(SQLParser.ColTypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterColType(SQLParser.ColTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitColType(SQLParser.ColTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterComplexColTypeList(SQLParser.ComplexColTypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitComplexColTypeList(SQLParser.ComplexColTypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterComplexColType(SQLParser.ComplexColTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitComplexColType(SQLParser.ComplexColTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWhenClause(SQLParser.WhenClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWhenClause(SQLParser.WhenClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWindowClause(SQLParser.WindowClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWindowClause(SQLParser.WindowClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamedWindow(SQLParser.NamedWindowContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamedWindow(SQLParser.NamedWindowContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWindowRef(SQLParser.WindowRefContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWindowRef(SQLParser.WindowRefContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWindowDef(SQLParser.WindowDefContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWindowDef(SQLParser.WindowDefContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWindowFrame(SQLParser.WindowFrameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWindowFrame(SQLParser.WindowFrameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFrameBound(SQLParser.FrameBoundContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFrameBound(SQLParser.FrameBoundContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQualifiedNameList(SQLParser.QualifiedNameListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQualifiedNameList(SQLParser.QualifiedNameListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionName(SQLParser.FunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionName(SQLParser.FunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQualifiedName(SQLParser.QualifiedNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQualifiedName(SQLParser.QualifiedNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterErrorCapturingIdentifier(SQLParser.ErrorCapturingIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitErrorCapturingIdentifier(SQLParser.ErrorCapturingIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterErrorIdent(SQLParser.ErrorIdentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitErrorIdent(SQLParser.ErrorIdentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRealIdent(SQLParser.RealIdentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRealIdent(SQLParser.RealIdentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdentifier(SQLParser.IdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdentifier(SQLParser.IdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUnquotedIdentifier(SQLParser.UnquotedIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUnquotedIdentifier(SQLParser.UnquotedIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuotedIdentifierAlternative(SQLParser.QuotedIdentifierAlternativeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuotedIdentifierAlternative(SQLParser.QuotedIdentifierAlternativeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuotedIdentifier(SQLParser.QuotedIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuotedIdentifier(SQLParser.QuotedIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExponentLiteral(SQLParser.ExponentLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExponentLiteral(SQLParser.ExponentLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDecimalLiteral(SQLParser.DecimalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDecimalLiteral(SQLParser.DecimalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLegacyDecimalLiteral(SQLParser.LegacyDecimalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLegacyDecimalLiteral(SQLParser.LegacyDecimalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntegerLiteral(SQLParser.IntegerLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntegerLiteral(SQLParser.IntegerLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBigIntLiteral(SQLParser.BigIntLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBigIntLiteral(SQLParser.BigIntLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSmallIntLiteral(SQLParser.SmallIntLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSmallIntLiteral(SQLParser.SmallIntLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTinyIntLiteral(SQLParser.TinyIntLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTinyIntLiteral(SQLParser.TinyIntLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDoubleLiteral(SQLParser.DoubleLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDoubleLiteral(SQLParser.DoubleLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFloatLiteral(SQLParser.FloatLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFloatLiteral(SQLParser.FloatLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBigDecimalLiteral(SQLParser.BigDecimalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBigDecimalLiteral(SQLParser.BigDecimalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAlterColumnAction(SQLParser.AlterColumnActionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAlterColumnAction(SQLParser.AlterColumnActionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnsiNonReserved(SQLParser.AnsiNonReservedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnsiNonReserved(SQLParser.AnsiNonReservedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStrictNonReserved(SQLParser.StrictNonReservedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStrictNonReserved(SQLParser.StrictNonReservedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNonReserved(SQLParser.NonReservedContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNonReserved(SQLParser.NonReservedContext ctx) { } + + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQLBaseVisitor.java b/mypages/src/main/java/io/leego/mypages/sql/SQLBaseVisitor.java new file mode 100644 index 0000000..129d19e --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQLBaseVisitor.java @@ -0,0 +1,1980 @@ +package io.leego.mypages.sql; +import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; + +/** + * This class provides an empty implementation of {@link SQLVisitor}, + * which can be extended to create a visitor which only needs to handle a subset + * of the available methods. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public class SQLBaseVisitor extends AbstractParseTreeVisitor implements SQLVisitor { + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleStatement(SQLParser.SingleStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleExpression(SQLParser.SingleExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleTableIdentifier(SQLParser.SingleTableIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleMultipartIdentifier(SQLParser.SingleMultipartIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleFunctionIdentifier(SQLParser.SingleFunctionIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleDataType(SQLParser.SingleDataTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleTableSchema(SQLParser.SingleTableSchemaContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStatementDefault(SQLParser.StatementDefaultContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDmlStatement(SQLParser.DmlStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUse(SQLParser.UseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateNamespace(SQLParser.CreateNamespaceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetNamespaceProperties(SQLParser.SetNamespacePropertiesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetNamespaceLocation(SQLParser.SetNamespaceLocationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDropNamespace(SQLParser.DropNamespaceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowNamespaces(SQLParser.ShowNamespacesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateTable(SQLParser.CreateTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateTableLike(SQLParser.CreateTableLikeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitReplaceTable(SQLParser.ReplaceTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnalyze(SQLParser.AnalyzeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnalyzeTables(SQLParser.AnalyzeTablesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAddTableColumns(SQLParser.AddTableColumnsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRenameTableColumn(SQLParser.RenameTableColumnContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDropTableColumns(SQLParser.DropTableColumnsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRenameTable(SQLParser.RenameTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetTableProperties(SQLParser.SetTablePropertiesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUnsetTableProperties(SQLParser.UnsetTablePropertiesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAlterTableAlterColumn(SQLParser.AlterTableAlterColumnContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitHiveChangeColumn(SQLParser.HiveChangeColumnContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitHiveReplaceColumns(SQLParser.HiveReplaceColumnsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetTableSerDe(SQLParser.SetTableSerDeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAddTablePartition(SQLParser.AddTablePartitionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRenameTablePartition(SQLParser.RenameTablePartitionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDropTablePartitions(SQLParser.DropTablePartitionsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetTableLocation(SQLParser.SetTableLocationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRecoverPartitions(SQLParser.RecoverPartitionsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDropTable(SQLParser.DropTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDropView(SQLParser.DropViewContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateView(SQLParser.CreateViewContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateTempViewUsing(SQLParser.CreateTempViewUsingContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAlterViewQuery(SQLParser.AlterViewQueryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateFunction(SQLParser.CreateFunctionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDropFunction(SQLParser.DropFunctionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExplain(SQLParser.ExplainContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowTables(SQLParser.ShowTablesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowTableExtended(SQLParser.ShowTableExtendedContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowTblProperties(SQLParser.ShowTblPropertiesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowColumns(SQLParser.ShowColumnsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowViews(SQLParser.ShowViewsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowPartitions(SQLParser.ShowPartitionsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowFunctions(SQLParser.ShowFunctionsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowCreateTable(SQLParser.ShowCreateTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShowCurrentNamespace(SQLParser.ShowCurrentNamespaceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDescribeFunction(SQLParser.DescribeFunctionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDescribeNamespace(SQLParser.DescribeNamespaceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDescribeRelation(SQLParser.DescribeRelationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDescribeQuery(SQLParser.DescribeQueryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCommentNamespace(SQLParser.CommentNamespaceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCommentTable(SQLParser.CommentTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRefreshTable(SQLParser.RefreshTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRefreshFunction(SQLParser.RefreshFunctionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRefreshResource(SQLParser.RefreshResourceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCacheTable(SQLParser.CacheTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUncacheTable(SQLParser.UncacheTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitClearCache(SQLParser.ClearCacheContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLoadData(SQLParser.LoadDataContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTruncateTable(SQLParser.TruncateTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRepairTable(SQLParser.RepairTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitManageResource(SQLParser.ManageResourceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFailNativeCommand(SQLParser.FailNativeCommandContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetTimeZone(SQLParser.SetTimeZoneContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetQuotedConfiguration(SQLParser.SetQuotedConfigurationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetConfiguration(SQLParser.SetConfigurationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitResetQuotedConfiguration(SQLParser.ResetQuotedConfigurationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitResetConfiguration(SQLParser.ResetConfigurationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConfigKey(SQLParser.ConfigKeyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConfigValue(SQLParser.ConfigValueContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUnsupportedHiveNativeCommands(SQLParser.UnsupportedHiveNativeCommandsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateTableHeader(SQLParser.CreateTableHeaderContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitReplaceTableHeader(SQLParser.ReplaceTableHeaderContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBucketSpec(SQLParser.BucketSpecContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSkewSpec(SQLParser.SkewSpecContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLocationSpec(SQLParser.LocationSpecContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCommentSpec(SQLParser.CommentSpecContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQuery(SQLParser.QueryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInsertOverwriteTable(SQLParser.InsertOverwriteTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInsertIntoTable(SQLParser.InsertIntoTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInsertOverwriteHiveDir(SQLParser.InsertOverwriteHiveDirContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInsertOverwriteDir(SQLParser.InsertOverwriteDirContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPartitionSpecLocation(SQLParser.PartitionSpecLocationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPartitionSpec(SQLParser.PartitionSpecContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPartitionVal(SQLParser.PartitionValContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNamespace(SQLParser.NamespaceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDescribeFuncName(SQLParser.DescribeFuncNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDescribeColName(SQLParser.DescribeColNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCtes(SQLParser.CtesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNamedQuery(SQLParser.NamedQueryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTableProvider(SQLParser.TableProviderContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateTableClauses(SQLParser.CreateTableClausesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTablePropertyList(SQLParser.TablePropertyListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTableProperty(SQLParser.TablePropertyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTablePropertyKey(SQLParser.TablePropertyKeyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTablePropertyValue(SQLParser.TablePropertyValueContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConstantList(SQLParser.ConstantListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNestedConstantList(SQLParser.NestedConstantListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateFileFormat(SQLParser.CreateFileFormatContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTableFileFormat(SQLParser.TableFileFormatContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitGenericFileFormat(SQLParser.GenericFileFormatContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStorageHandler(SQLParser.StorageHandlerContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitResource(SQLParser.ResourceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleInsertQuery(SQLParser.SingleInsertQueryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMultiInsertQuery(SQLParser.MultiInsertQueryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeleteFromTable(SQLParser.DeleteFromTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUpdateTable(SQLParser.UpdateTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMergeIntoTable(SQLParser.MergeIntoTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQueryOrganization(SQLParser.QueryOrganizationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMultiInsertQueryBody(SQLParser.MultiInsertQueryBodyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQueryTermDefault(SQLParser.QueryTermDefaultContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetOperation(SQLParser.SetOperationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQueryPrimaryDefault(SQLParser.QueryPrimaryDefaultContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFromStmt(SQLParser.FromStmtContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTable(SQLParser.TableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInlineTableDefault1(SQLParser.InlineTableDefault1Context ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSubquery(SQLParser.SubqueryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSortItem(SQLParser.SortItemContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFromStatement(SQLParser.FromStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFromStatementBody(SQLParser.FromStatementBodyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTransformQuerySpecification(SQLParser.TransformQuerySpecificationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRegularQuerySpecification(SQLParser.RegularQuerySpecificationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTransformClause(SQLParser.TransformClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSelectClause(SQLParser.SelectClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetClause(SQLParser.SetClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchedClause(SQLParser.MatchedClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNotMatchedClause(SQLParser.NotMatchedClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchedAction(SQLParser.MatchedActionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNotMatchedAction(SQLParser.NotMatchedActionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAssignmentList(SQLParser.AssignmentListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAssignment(SQLParser.AssignmentContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitWhereClause(SQLParser.WhereClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitHavingClause(SQLParser.HavingClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitHint(SQLParser.HintContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitHintStatement(SQLParser.HintStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFromClause(SQLParser.FromClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAggregationClause(SQLParser.AggregationClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitGroupByClause(SQLParser.GroupByClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitGroupingAnalytics(SQLParser.GroupingAnalyticsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitGroupingElement(SQLParser.GroupingElementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitGroupingSet(SQLParser.GroupingSetContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPivotClause(SQLParser.PivotClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPivotColumn(SQLParser.PivotColumnContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPivotValue(SQLParser.PivotValueContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLateralView(SQLParser.LateralViewContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetQuantifier(SQLParser.SetQuantifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRelation(SQLParser.RelationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitJoinRelation(SQLParser.JoinRelationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitJoinType(SQLParser.JoinTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitJoinCriteria(SQLParser.JoinCriteriaContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSample(SQLParser.SampleContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSampleByPercentile(SQLParser.SampleByPercentileContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSampleByRows(SQLParser.SampleByRowsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSampleByBucket(SQLParser.SampleByBucketContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSampleByBytes(SQLParser.SampleByBytesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdentifierList(SQLParser.IdentifierListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdentifierSeq(SQLParser.IdentifierSeqContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOrderedIdentifierList(SQLParser.OrderedIdentifierListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOrderedIdentifier(SQLParser.OrderedIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdentifierCommentList(SQLParser.IdentifierCommentListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdentifierComment(SQLParser.IdentifierCommentContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTableName(SQLParser.TableNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAliasedQuery(SQLParser.AliasedQueryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAliasedRelation(SQLParser.AliasedRelationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInlineTableDefault2(SQLParser.InlineTableDefault2Context ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTableValuedFunction(SQLParser.TableValuedFunctionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInlineTable(SQLParser.InlineTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionTable(SQLParser.FunctionTableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTableAlias(SQLParser.TableAliasContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRowFormatSerde(SQLParser.RowFormatSerdeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRowFormatDelimited(SQLParser.RowFormatDelimitedContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMultipartIdentifierList(SQLParser.MultipartIdentifierListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMultipartIdentifier(SQLParser.MultipartIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTableIdentifier(SQLParser.TableIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionIdentifier(SQLParser.FunctionIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNamedExpression(SQLParser.NamedExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNamedExpressionSeq(SQLParser.NamedExpressionSeqContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPartitionFieldList(SQLParser.PartitionFieldListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPartitionTransform(SQLParser.PartitionTransformContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPartitionColumn(SQLParser.PartitionColumnContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdentityTransform(SQLParser.IdentityTransformContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitApplyTransform(SQLParser.ApplyTransformContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTransformArgument(SQLParser.TransformArgumentContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpression(SQLParser.ExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpressionSeq(SQLParser.ExpressionSeqContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLogicalNot(SQLParser.LogicalNotContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPredicated(SQLParser.PredicatedContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExists(SQLParser.ExistsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLogicalBinary(SQLParser.LogicalBinaryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPredicate(SQLParser.PredicateContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitValueExpressionDefault(SQLParser.ValueExpressionDefaultContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitComparison(SQLParser.ComparisonContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArithmeticBinary(SQLParser.ArithmeticBinaryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArithmeticUnary(SQLParser.ArithmeticUnaryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStruct(SQLParser.StructContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDereference(SQLParser.DereferenceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSimpleCase(SQLParser.SimpleCaseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCurrentLike(SQLParser.CurrentLikeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitColumnReference(SQLParser.ColumnReferenceContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRowConstructor(SQLParser.RowConstructorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLast(SQLParser.LastContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStar(SQLParser.StarContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOverlay(SQLParser.OverlayContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSubscript(SQLParser.SubscriptContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSubqueryExpression(SQLParser.SubqueryExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSubstring(SQLParser.SubstringContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCast(SQLParser.CastContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConstantDefault(SQLParser.ConstantDefaultContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLambda(SQLParser.LambdaContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitParenthesizedExpression(SQLParser.ParenthesizedExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExtract(SQLParser.ExtractContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTrim(SQLParser.TrimContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionCall(SQLParser.FunctionCallContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSearchedCase(SQLParser.SearchedCaseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPosition(SQLParser.PositionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFirst(SQLParser.FirstContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLimitExpression(SQLParser.LimitExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNullLiteral(SQLParser.NullLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIntervalLiteral(SQLParser.IntervalLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeConstructor(SQLParser.TypeConstructorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNumericLiteral(SQLParser.NumericLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBooleanLiteral(SQLParser.BooleanLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStringLiteral(SQLParser.StringLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitComparisonOperator(SQLParser.ComparisonOperatorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArithmeticOperator(SQLParser.ArithmeticOperatorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPredicateOperator(SQLParser.PredicateOperatorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBooleanValue(SQLParser.BooleanValueContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInterval(SQLParser.IntervalContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitErrorCapturingMultiUnitsInterval(SQLParser.ErrorCapturingMultiUnitsIntervalContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMultiUnitsInterval(SQLParser.MultiUnitsIntervalContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitErrorCapturingUnitToUnitInterval(SQLParser.ErrorCapturingUnitToUnitIntervalContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUnitToUnitInterval(SQLParser.UnitToUnitIntervalContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIntervalValue(SQLParser.IntervalValueContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitColPosition(SQLParser.ColPositionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitComplexDataType(SQLParser.ComplexDataTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitYearMonthIntervalDataType(SQLParser.YearMonthIntervalDataTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDayTimeIntervalDataType(SQLParser.DayTimeIntervalDataTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPrimitiveDataType(SQLParser.PrimitiveDataTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQualifiedColTypeWithPositionList(SQLParser.QualifiedColTypeWithPositionListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQualifiedColTypeWithPosition(SQLParser.QualifiedColTypeWithPositionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitColTypeList(SQLParser.ColTypeListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitColType(SQLParser.ColTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitComplexColTypeList(SQLParser.ComplexColTypeListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitComplexColType(SQLParser.ComplexColTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitWhenClause(SQLParser.WhenClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitWindowClause(SQLParser.WindowClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNamedWindow(SQLParser.NamedWindowContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitWindowRef(SQLParser.WindowRefContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitWindowDef(SQLParser.WindowDefContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitWindowFrame(SQLParser.WindowFrameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFrameBound(SQLParser.FrameBoundContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQualifiedNameList(SQLParser.QualifiedNameListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionName(SQLParser.FunctionNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQualifiedName(SQLParser.QualifiedNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitErrorCapturingIdentifier(SQLParser.ErrorCapturingIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitErrorIdent(SQLParser.ErrorIdentContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRealIdent(SQLParser.RealIdentContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdentifier(SQLParser.IdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUnquotedIdentifier(SQLParser.UnquotedIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQuotedIdentifierAlternative(SQLParser.QuotedIdentifierAlternativeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQuotedIdentifier(SQLParser.QuotedIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExponentLiteral(SQLParser.ExponentLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDecimalLiteral(SQLParser.DecimalLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLegacyDecimalLiteral(SQLParser.LegacyDecimalLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIntegerLiteral(SQLParser.IntegerLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBigIntLiteral(SQLParser.BigIntLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSmallIntLiteral(SQLParser.SmallIntLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTinyIntLiteral(SQLParser.TinyIntLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDoubleLiteral(SQLParser.DoubleLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFloatLiteral(SQLParser.FloatLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBigDecimalLiteral(SQLParser.BigDecimalLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAlterColumnAction(SQLParser.AlterColumnActionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnsiNonReserved(SQLParser.AnsiNonReservedContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStrictNonReserved(SQLParser.StrictNonReservedContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNonReserved(SQLParser.NonReservedContext ctx) { return visitChildren(ctx); } +} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.interp b/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.interp new file mode 100644 index 0000000..8c1e387 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.interp @@ -0,0 +1,965 @@ +token literal names: +null +'(' +')' +'/*+' +'*/' +'->' +'[' +']' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +'<=>' +'<>' +'!=' +'<' +null +'>' +null +'+' +'-' +'*' +'/' +'%' +'~' +'&' +'|' +'||' +'^' +'_' +'!' +'.' +',' +':' +';' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +ADD +AFTER +ALL +ALTER +ANALYZE +AND +ANTI +ANY +ARCHIVE +ARRAY +AS +ASC +AT +AUTHORIZATION +BETWEEN +BOTH +BUCKET +BUCKETS +BY +CACHE +CASCADE +CASE +CAST +CHANGE +CHECK +CLEAR +CLUSTER +CLUSTERED +CODEGEN +COLLATE +COLLECTION +COLUMN +COLUMNS +COMMENT +COMMIT +COMPACT +COMPACTIONS +COMPUTE +CONCATENATE +CONSTRAINT +COST +CREATE +CROSS +CUBE +CURRENT +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +CURRENT_USER +DAY +DATA +DATABASE +DATABASES +DBPROPERTIES +DEFINED +DELETE +DELIMITED +DESC +DESCRIBE +DFS +DIRECTORIES +DIRECTORY +DISTINCT +DISTRIBUTE +DIV +DROP +ELSE +END +ESCAPE +ESCAPED +EXCEPT +EXCHANGE +EXISTS +EXPLAIN +EXPORT +EXTENDED +EXTERNAL +EXTRACT +FALSE +FETCH +FIELDS +FILTER +FILEFORMAT +FIRST +FOLLOWING +FOR +FOREIGN +FORMAT +FORMATTED +FROM +FULL +FUNCTION +FUNCTIONS +GLOBAL +GRANT +GROUP +GROUPING +HAVING +HOUR +IF +IGNORE +IMPORT +IN +INDEX +INDEXES +INNER +INPATH +INPUTFORMAT +INSERT +INTERSECT +INTERVAL +INTO +IS +ITEMS +JOIN +KEYS +LAST +LATERAL +LAZY +LEADING +LEFT +LIKE +LIMIT +LINES +LIST +LOAD +LOCAL +LOCATION +LOCK +LOCKS +LOGICAL +MACRO +MAP +MATCHED +MERGE +MINUTE +MONTH +MSCK +NAMESPACE +NAMESPACES +NATURAL +NO +NOT +NULL +NULLS +OF +OFFSET +ON +ONLY +OPTION +OPTIONS +OR +ORDER +OUT +OUTER +OUTPUTFORMAT +OVER +OVERLAPS +OVERLAY +OVERWRITE +PARTITION +PARTITIONED +PARTITIONS +PERCENTLIT +PIVOT +PLACING +POSITION +PRECEDING +PRIMARY +PRINCIPALS +PROPERTIES +PURGE +QUERY +RANGE +RECORDREADER +RECORDWRITER +RECOVER +REDUCE +REFERENCES +REFRESH +RENAME +REPAIR +REPLACE +RESET +RESPECT +RESTRICT +REVOKE +RIGHT +RLIKE +ROLE +ROLES +ROLLBACK +ROLLUP +ROW +ROWS +SECOND +SCHEMA +SELECT +SEMI +SEPARATED +SERDE +SERDEPROPERTIES +SESSION_USER +SET +SETMINUS +SETS +SHOW +SKEWED +SOME +SORT +SORTED +START +STATISTICS +STORED +STRATIFY +STRUCT +SUBSTR +SUBSTRING +SYNC +TABLE +TABLES +TABLESAMPLE +TBLPROPERTIES +TEMPORARY +TERMINATED +THEN +TIME +TO +TOUCH +TRAILING +TRANSACTION +TRANSACTIONS +TRANSFORM +TRIM +TRUE +TRUNCATE +TRY_CAST +TYPE +UNARCHIVE +UNBOUNDED +UNCACHE +UNION +UNIQUE +UNKNOWN +UNLOCK +UNSET +UPDATE +USE +USER +USING +VALUES +VIEW +VIEWS +WHEN +WHERE +WINDOW +WITH +YEAR +ZONE +EQ +NSEQ +NEQ +NEQJ +LT +LTE +GT +GTE +PLUS +MINUS +ASTERISK +SLASH +PERCENT +TILDE +AMPERSAND +PIPE +CONCAT_PIPE +HAT +UNDERSCORE +EXCLAMATION +POINT +COMMA +COLON +SEMICOLON +STRING +BIGINT_LITERAL +SMALLINT_LITERAL +TINYINT_LITERAL +INTEGER_VALUE +EXPONENT_VALUE +DECIMAL_VALUE +FLOAT_LITERAL +DOUBLE_LITERAL +BIGDECIMAL_LITERAL +IDENTIFIER +BACKQUOTED_IDENTIFIER +SIMPLE_COMMENT +BRACKETED_COMMENT +WS +UNRECOGNIZED + +rule names: +T__0 +T__1 +T__2 +T__3 +T__4 +T__5 +T__6 +ADD +AFTER +ALL +ALTER +ANALYZE +AND +ANTI +ANY +ARCHIVE +ARRAY +AS +ASC +AT +AUTHORIZATION +BETWEEN +BOTH +BUCKET +BUCKETS +BY +CACHE +CASCADE +CASE +CAST +CHANGE +CHECK +CLEAR +CLUSTER +CLUSTERED +CODEGEN +COLLATE +COLLECTION +COLUMN +COLUMNS +COMMENT +COMMIT +COMPACT +COMPACTIONS +COMPUTE +CONCATENATE +CONSTRAINT +COST +CREATE +CROSS +CUBE +CURRENT +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +CURRENT_USER +DAY +DATA +DATABASE +DATABASES +DBPROPERTIES +DEFINED +DELETE +DELIMITED +DESC +DESCRIBE +DFS +DIRECTORIES +DIRECTORY +DISTINCT +DISTRIBUTE +DIV +DROP +ELSE +END +ESCAPE +ESCAPED +EXCEPT +EXCHANGE +EXISTS +EXPLAIN +EXPORT +EXTENDED +EXTERNAL +EXTRACT +FALSE +FETCH +FIELDS +FILTER +FILEFORMAT +FIRST +FOLLOWING +FOR +FOREIGN +FORMAT +FORMATTED +FROM +FULL +FUNCTION +FUNCTIONS +GLOBAL +GRANT +GROUP +GROUPING +HAVING +HOUR +IF +IGNORE +IMPORT +IN +INDEX +INDEXES +INNER +INPATH +INPUTFORMAT +INSERT +INTERSECT +INTERVAL +INTO +IS +ITEMS +JOIN +KEYS +LAST +LATERAL +LAZY +LEADING +LEFT +LIKE +LIMIT +LINES +LIST +LOAD +LOCAL +LOCATION +LOCK +LOCKS +LOGICAL +MACRO +MAP +MATCHED +MERGE +MINUTE +MONTH +MSCK +NAMESPACE +NAMESPACES +NATURAL +NO +NOT +NULL +NULLS +OF +OFFSET +ON +ONLY +OPTION +OPTIONS +OR +ORDER +OUT +OUTER +OUTPUTFORMAT +OVER +OVERLAPS +OVERLAY +OVERWRITE +PARTITION +PARTITIONED +PARTITIONS +PERCENTLIT +PIVOT +PLACING +POSITION +PRECEDING +PRIMARY +PRINCIPALS +PROPERTIES +PURGE +QUERY +RANGE +RECORDREADER +RECORDWRITER +RECOVER +REDUCE +REFERENCES +REFRESH +RENAME +REPAIR +REPLACE +RESET +RESPECT +RESTRICT +REVOKE +RIGHT +RLIKE +ROLE +ROLES +ROLLBACK +ROLLUP +ROW +ROWS +SECOND +SCHEMA +SELECT +SEMI +SEPARATED +SERDE +SERDEPROPERTIES +SESSION_USER +SET +SETMINUS +SETS +SHOW +SKEWED +SOME +SORT +SORTED +START +STATISTICS +STORED +STRATIFY +STRUCT +SUBSTR +SUBSTRING +SYNC +TABLE +TABLES +TABLESAMPLE +TBLPROPERTIES +TEMPORARY +TERMINATED +THEN +TIME +TO +TOUCH +TRAILING +TRANSACTION +TRANSACTIONS +TRANSFORM +TRIM +TRUE +TRUNCATE +TRY_CAST +TYPE +UNARCHIVE +UNBOUNDED +UNCACHE +UNION +UNIQUE +UNKNOWN +UNLOCK +UNSET +UPDATE +USE +USER +USING +VALUES +VIEW +VIEWS +WHEN +WHERE +WINDOW +WITH +YEAR +ZONE +EQ +NSEQ +NEQ +NEQJ +LT +LTE +GT +GTE +PLUS +MINUS +ASTERISK +SLASH +PERCENT +TILDE +AMPERSAND +PIPE +CONCAT_PIPE +HAT +UNDERSCORE +EXCLAMATION +POINT +COMMA +COLON +SEMICOLON +STRING +BIGINT_LITERAL +SMALLINT_LITERAL +TINYINT_LITERAL +INTEGER_VALUE +EXPONENT_VALUE +DECIMAL_VALUE +FLOAT_LITERAL +DOUBLE_LITERAL +BIGDECIMAL_LITERAL +IDENTIFIER +BACKQUOTED_IDENTIFIER +DECIMAL_DIGITS +EXPONENT +DIGIT +LETTER +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +SIMPLE_COMMENT +BRACKETED_COMMENT +WS +UNRECOGNIZED + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 308, 2935, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 4, 184, 9, 184, 4, 185, 9, 185, 4, 186, 9, 186, 4, 187, 9, 187, 4, 188, 9, 188, 4, 189, 9, 189, 4, 190, 9, 190, 4, 191, 9, 191, 4, 192, 9, 192, 4, 193, 9, 193, 4, 194, 9, 194, 4, 195, 9, 195, 4, 196, 9, 196, 4, 197, 9, 197, 4, 198, 9, 198, 4, 199, 9, 199, 4, 200, 9, 200, 4, 201, 9, 201, 4, 202, 9, 202, 4, 203, 9, 203, 4, 204, 9, 204, 4, 205, 9, 205, 4, 206, 9, 206, 4, 207, 9, 207, 4, 208, 9, 208, 4, 209, 9, 209, 4, 210, 9, 210, 4, 211, 9, 211, 4, 212, 9, 212, 4, 213, 9, 213, 4, 214, 9, 214, 4, 215, 9, 215, 4, 216, 9, 216, 4, 217, 9, 217, 4, 218, 9, 218, 4, 219, 9, 219, 4, 220, 9, 220, 4, 221, 9, 221, 4, 222, 9, 222, 4, 223, 9, 223, 4, 224, 9, 224, 4, 225, 9, 225, 4, 226, 9, 226, 4, 227, 9, 227, 4, 228, 9, 228, 4, 229, 9, 229, 4, 230, 9, 230, 4, 231, 9, 231, 4, 232, 9, 232, 4, 233, 9, 233, 4, 234, 9, 234, 4, 235, 9, 235, 4, 236, 9, 236, 4, 237, 9, 237, 4, 238, 9, 238, 4, 239, 9, 239, 4, 240, 9, 240, 4, 241, 9, 241, 4, 242, 9, 242, 4, 243, 9, 243, 4, 244, 9, 244, 4, 245, 9, 245, 4, 246, 9, 246, 4, 247, 9, 247, 4, 248, 9, 248, 4, 249, 9, 249, 4, 250, 9, 250, 4, 251, 9, 251, 4, 252, 9, 252, 4, 253, 9, 253, 4, 254, 9, 254, 4, 255, 9, 255, 4, 256, 9, 256, 4, 257, 9, 257, 4, 258, 9, 258, 4, 259, 9, 259, 4, 260, 9, 260, 4, 261, 9, 261, 4, 262, 9, 262, 4, 263, 9, 263, 4, 264, 9, 264, 4, 265, 9, 265, 4, 266, 9, 266, 4, 267, 9, 267, 4, 268, 9, 268, 4, 269, 9, 269, 4, 270, 9, 270, 4, 271, 9, 271, 4, 272, 9, 272, 4, 273, 9, 273, 4, 274, 9, 274, 4, 275, 9, 275, 4, 276, 9, 276, 4, 277, 9, 277, 4, 278, 9, 278, 4, 279, 9, 279, 4, 280, 9, 280, 4, 281, 9, 281, 4, 282, 9, 282, 4, 283, 9, 283, 4, 284, 9, 284, 4, 285, 9, 285, 4, 286, 9, 286, 4, 287, 9, 287, 4, 288, 9, 288, 4, 289, 9, 289, 4, 290, 9, 290, 4, 291, 9, 291, 4, 292, 9, 292, 4, 293, 9, 293, 4, 294, 9, 294, 4, 295, 9, 295, 4, 296, 9, 296, 4, 297, 9, 297, 4, 298, 9, 298, 4, 299, 9, 299, 4, 300, 9, 300, 4, 301, 9, 301, 4, 302, 9, 302, 4, 303, 9, 303, 4, 304, 9, 304, 4, 305, 9, 305, 4, 306, 9, 306, 4, 307, 9, 307, 4, 308, 9, 308, 4, 309, 9, 309, 4, 310, 9, 310, 4, 311, 9, 311, 4, 312, 9, 312, 4, 313, 9, 313, 4, 314, 9, 314, 4, 315, 9, 315, 4, 316, 9, 316, 4, 317, 9, 317, 4, 318, 9, 318, 4, 319, 9, 319, 4, 320, 9, 320, 4, 321, 9, 321, 4, 322, 9, 322, 4, 323, 9, 323, 4, 324, 9, 324, 4, 325, 9, 325, 4, 326, 9, 326, 4, 327, 9, 327, 4, 328, 9, 328, 4, 329, 9, 329, 4, 330, 9, 330, 4, 331, 9, 331, 4, 332, 9, 332, 4, 333, 9, 333, 4, 334, 9, 334, 4, 335, 9, 335, 4, 336, 9, 336, 4, 337, 9, 337, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 5, 61, 1097, 10, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 5, 151, 1725, 10, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 5, 197, 2088, 10, 197, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 202, 3, 202, 3, 202, 3, 202, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 204, 3, 204, 3, 204, 3, 204, 3, 204, 3, 204, 3, 204, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 208, 3, 208, 3, 208, 3, 208, 3, 208, 3, 208, 3, 208, 3, 208, 3, 208, 3, 208, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 212, 3, 212, 3, 212, 3, 212, 3, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 219, 3, 219, 3, 219, 3, 219, 3, 219, 3, 219, 3, 219, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 5, 232, 2357, 10, 232, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 234, 3, 234, 3, 234, 3, 234, 3, 234, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 3, 236, 3, 236, 3, 236, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 242, 3, 242, 3, 242, 3, 242, 3, 242, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 254, 3, 254, 3, 254, 3, 254, 3, 254, 3, 254, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 256, 3, 256, 3, 256, 3, 256, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 258, 3, 258, 3, 258, 3, 258, 3, 258, 3, 258, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 260, 3, 260, 3, 260, 3, 260, 3, 260, 3, 261, 3, 261, 3, 261, 3, 261, 3, 261, 3, 261, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 264, 3, 264, 3, 264, 3, 264, 3, 264, 3, 264, 3, 264, 3, 265, 3, 265, 3, 265, 3, 265, 3, 265, 3, 266, 3, 266, 3, 266, 3, 266, 3, 266, 3, 267, 3, 267, 3, 267, 3, 267, 3, 267, 3, 268, 3, 268, 3, 268, 5, 268, 2604, 10, 268, 3, 269, 3, 269, 3, 269, 3, 269, 3, 270, 3, 270, 3, 270, 3, 271, 3, 271, 3, 271, 3, 272, 3, 272, 3, 273, 3, 273, 3, 273, 3, 273, 5, 273, 2622, 10, 273, 3, 274, 3, 274, 3, 275, 3, 275, 3, 275, 3, 275, 5, 275, 2630, 10, 275, 3, 276, 3, 276, 3, 277, 3, 277, 3, 278, 3, 278, 3, 279, 3, 279, 3, 280, 3, 280, 3, 281, 3, 281, 3, 282, 3, 282, 3, 283, 3, 283, 3, 284, 3, 284, 3, 284, 3, 285, 3, 285, 3, 286, 3, 286, 3, 287, 3, 287, 3, 288, 3, 288, 3, 289, 3, 289, 3, 290, 3, 290, 3, 291, 3, 291, 3, 292, 3, 292, 3, 292, 3, 292, 7, 292, 2669, 10, 292, 12, 292, 14, 292, 2672, 11, 292, 3, 292, 3, 292, 3, 292, 3, 292, 3, 292, 7, 292, 2679, 10, 292, 12, 292, 14, 292, 2682, 11, 292, 3, 292, 5, 292, 2685, 10, 292, 3, 293, 6, 293, 2688, 10, 293, 13, 293, 14, 293, 2689, 3, 293, 3, 293, 3, 294, 6, 294, 2695, 10, 294, 13, 294, 14, 294, 2696, 3, 294, 3, 294, 3, 295, 6, 295, 2702, 10, 295, 13, 295, 14, 295, 2703, 3, 295, 3, 295, 3, 296, 6, 296, 2709, 10, 296, 13, 296, 14, 296, 2710, 3, 297, 6, 297, 2714, 10, 297, 13, 297, 14, 297, 2715, 3, 297, 3, 297, 3, 297, 3, 297, 3, 297, 3, 297, 5, 297, 2724, 10, 297, 3, 298, 3, 298, 3, 298, 3, 299, 6, 299, 2730, 10, 299, 13, 299, 14, 299, 2731, 3, 299, 5, 299, 2735, 10, 299, 3, 299, 3, 299, 3, 299, 3, 299, 5, 299, 2741, 10, 299, 3, 299, 3, 299, 3, 299, 5, 299, 2746, 10, 299, 3, 300, 6, 300, 2749, 10, 300, 13, 300, 14, 300, 2750, 3, 300, 5, 300, 2754, 10, 300, 3, 300, 3, 300, 3, 300, 3, 300, 5, 300, 2760, 10, 300, 3, 300, 3, 300, 3, 300, 5, 300, 2765, 10, 300, 3, 301, 6, 301, 2768, 10, 301, 13, 301, 14, 301, 2769, 3, 301, 5, 301, 2773, 10, 301, 3, 301, 3, 301, 3, 301, 3, 301, 3, 301, 5, 301, 2780, 10, 301, 3, 301, 3, 301, 3, 301, 3, 301, 3, 301, 5, 301, 2787, 10, 301, 3, 302, 3, 302, 3, 302, 6, 302, 2792, 10, 302, 13, 302, 14, 302, 2793, 3, 303, 3, 303, 3, 303, 3, 303, 7, 303, 2800, 10, 303, 12, 303, 14, 303, 2803, 11, 303, 3, 303, 3, 303, 3, 304, 6, 304, 2808, 10, 304, 13, 304, 14, 304, 2809, 3, 304, 3, 304, 7, 304, 2814, 10, 304, 12, 304, 14, 304, 2817, 11, 304, 3, 304, 3, 304, 6, 304, 2821, 10, 304, 13, 304, 14, 304, 2822, 5, 304, 2825, 10, 304, 3, 305, 3, 305, 5, 305, 2829, 10, 305, 3, 305, 6, 305, 2832, 10, 305, 13, 305, 14, 305, 2833, 3, 306, 3, 306, 3, 307, 3, 307, 3, 308, 3, 308, 3, 309, 3, 309, 3, 310, 3, 310, 3, 311, 3, 311, 3, 312, 3, 312, 3, 313, 3, 313, 3, 314, 3, 314, 3, 315, 3, 315, 3, 316, 3, 316, 3, 317, 3, 317, 3, 318, 3, 318, 3, 319, 3, 319, 3, 320, 3, 320, 3, 321, 3, 321, 3, 322, 3, 322, 3, 323, 3, 323, 3, 324, 3, 324, 3, 325, 3, 325, 3, 326, 3, 326, 3, 327, 3, 327, 3, 328, 3, 328, 3, 329, 3, 329, 3, 330, 3, 330, 3, 331, 3, 331, 3, 332, 3, 332, 3, 333, 3, 333, 3, 334, 3, 334, 3, 334, 3, 334, 3, 334, 3, 334, 7, 334, 2898, 10, 334, 12, 334, 14, 334, 2901, 11, 334, 3, 334, 5, 334, 2904, 10, 334, 3, 334, 5, 334, 2907, 10, 334, 3, 334, 3, 334, 3, 335, 3, 335, 3, 335, 3, 335, 3, 335, 3, 335, 7, 335, 2917, 10, 335, 12, 335, 14, 335, 2920, 11, 335, 3, 335, 3, 335, 3, 335, 3, 335, 3, 335, 3, 336, 6, 336, 2928, 10, 336, 13, 336, 14, 336, 2929, 3, 336, 3, 336, 3, 337, 3, 337, 3, 2918, 2, 338, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 168, 335, 169, 337, 170, 339, 171, 341, 172, 343, 173, 345, 174, 347, 175, 349, 176, 351, 177, 353, 178, 355, 179, 357, 180, 359, 181, 361, 182, 363, 183, 365, 184, 367, 185, 369, 186, 371, 187, 373, 188, 375, 189, 377, 190, 379, 191, 381, 192, 383, 193, 385, 194, 387, 195, 389, 196, 391, 197, 393, 198, 395, 199, 397, 200, 399, 201, 401, 202, 403, 203, 405, 204, 407, 205, 409, 206, 411, 207, 413, 208, 415, 209, 417, 210, 419, 211, 421, 212, 423, 213, 425, 214, 427, 215, 429, 216, 431, 217, 433, 218, 435, 219, 437, 220, 439, 221, 441, 222, 443, 223, 445, 224, 447, 225, 449, 226, 451, 227, 453, 228, 455, 229, 457, 230, 459, 231, 461, 232, 463, 233, 465, 234, 467, 235, 469, 236, 471, 237, 473, 238, 475, 239, 477, 240, 479, 241, 481, 242, 483, 243, 485, 244, 487, 245, 489, 246, 491, 247, 493, 248, 495, 249, 497, 250, 499, 251, 501, 252, 503, 253, 505, 254, 507, 255, 509, 256, 511, 257, 513, 258, 515, 259, 517, 260, 519, 261, 521, 262, 523, 263, 525, 264, 527, 265, 529, 266, 531, 267, 533, 268, 535, 269, 537, 270, 539, 271, 541, 272, 543, 273, 545, 274, 547, 275, 549, 276, 551, 277, 553, 278, 555, 279, 557, 280, 559, 281, 561, 282, 563, 283, 565, 284, 567, 285, 569, 286, 571, 287, 573, 288, 575, 289, 577, 290, 579, 291, 581, 292, 583, 293, 585, 294, 587, 295, 589, 296, 591, 297, 593, 298, 595, 299, 597, 300, 599, 301, 601, 302, 603, 303, 605, 304, 607, 2, 609, 2, 611, 2, 613, 2, 615, 2, 617, 2, 619, 2, 621, 2, 623, 2, 625, 2, 627, 2, 629, 2, 631, 2, 633, 2, 635, 2, 637, 2, 639, 2, 641, 2, 643, 2, 645, 2, 647, 2, 649, 2, 651, 2, 653, 2, 655, 2, 657, 2, 659, 2, 661, 2, 663, 2, 665, 2, 667, 305, 669, 306, 671, 307, 673, 308, 3, 2, 36, 4, 2, 41, 41, 94, 94, 4, 2, 36, 36, 94, 94, 3, 2, 98, 98, 4, 2, 45, 45, 47, 47, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 71, 71, 103, 103, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 2, 2952, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 333, 3, 2, 2, 2, 2, 335, 3, 2, 2, 2, 2, 337, 3, 2, 2, 2, 2, 339, 3, 2, 2, 2, 2, 341, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 353, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 357, 3, 2, 2, 2, 2, 359, 3, 2, 2, 2, 2, 361, 3, 2, 2, 2, 2, 363, 3, 2, 2, 2, 2, 365, 3, 2, 2, 2, 2, 367, 3, 2, 2, 2, 2, 369, 3, 2, 2, 2, 2, 371, 3, 2, 2, 2, 2, 373, 3, 2, 2, 2, 2, 375, 3, 2, 2, 2, 2, 377, 3, 2, 2, 2, 2, 379, 3, 2, 2, 2, 2, 381, 3, 2, 2, 2, 2, 383, 3, 2, 2, 2, 2, 385, 3, 2, 2, 2, 2, 387, 3, 2, 2, 2, 2, 389, 3, 2, 2, 2, 2, 391, 3, 2, 2, 2, 2, 393, 3, 2, 2, 2, 2, 395, 3, 2, 2, 2, 2, 397, 3, 2, 2, 2, 2, 399, 3, 2, 2, 2, 2, 401, 3, 2, 2, 2, 2, 403, 3, 2, 2, 2, 2, 405, 3, 2, 2, 2, 2, 407, 3, 2, 2, 2, 2, 409, 3, 2, 2, 2, 2, 411, 3, 2, 2, 2, 2, 413, 3, 2, 2, 2, 2, 415, 3, 2, 2, 2, 2, 417, 3, 2, 2, 2, 2, 419, 3, 2, 2, 2, 2, 421, 3, 2, 2, 2, 2, 423, 3, 2, 2, 2, 2, 425, 3, 2, 2, 2, 2, 427, 3, 2, 2, 2, 2, 429, 3, 2, 2, 2, 2, 431, 3, 2, 2, 2, 2, 433, 3, 2, 2, 2, 2, 435, 3, 2, 2, 2, 2, 437, 3, 2, 2, 2, 2, 439, 3, 2, 2, 2, 2, 441, 3, 2, 2, 2, 2, 443, 3, 2, 2, 2, 2, 445, 3, 2, 2, 2, 2, 447, 3, 2, 2, 2, 2, 449, 3, 2, 2, 2, 2, 451, 3, 2, 2, 2, 2, 453, 3, 2, 2, 2, 2, 455, 3, 2, 2, 2, 2, 457, 3, 2, 2, 2, 2, 459, 3, 2, 2, 2, 2, 461, 3, 2, 2, 2, 2, 463, 3, 2, 2, 2, 2, 465, 3, 2, 2, 2, 2, 467, 3, 2, 2, 2, 2, 469, 3, 2, 2, 2, 2, 471, 3, 2, 2, 2, 2, 473, 3, 2, 2, 2, 2, 475, 3, 2, 2, 2, 2, 477, 3, 2, 2, 2, 2, 479, 3, 2, 2, 2, 2, 481, 3, 2, 2, 2, 2, 483, 3, 2, 2, 2, 2, 485, 3, 2, 2, 2, 2, 487, 3, 2, 2, 2, 2, 489, 3, 2, 2, 2, 2, 491, 3, 2, 2, 2, 2, 493, 3, 2, 2, 2, 2, 495, 3, 2, 2, 2, 2, 497, 3, 2, 2, 2, 2, 499, 3, 2, 2, 2, 2, 501, 3, 2, 2, 2, 2, 503, 3, 2, 2, 2, 2, 505, 3, 2, 2, 2, 2, 507, 3, 2, 2, 2, 2, 509, 3, 2, 2, 2, 2, 511, 3, 2, 2, 2, 2, 513, 3, 2, 2, 2, 2, 515, 3, 2, 2, 2, 2, 517, 3, 2, 2, 2, 2, 519, 3, 2, 2, 2, 2, 521, 3, 2, 2, 2, 2, 523, 3, 2, 2, 2, 2, 525, 3, 2, 2, 2, 2, 527, 3, 2, 2, 2, 2, 529, 3, 2, 2, 2, 2, 531, 3, 2, 2, 2, 2, 533, 3, 2, 2, 2, 2, 535, 3, 2, 2, 2, 2, 537, 3, 2, 2, 2, 2, 539, 3, 2, 2, 2, 2, 541, 3, 2, 2, 2, 2, 543, 3, 2, 2, 2, 2, 545, 3, 2, 2, 2, 2, 547, 3, 2, 2, 2, 2, 549, 3, 2, 2, 2, 2, 551, 3, 2, 2, 2, 2, 553, 3, 2, 2, 2, 2, 555, 3, 2, 2, 2, 2, 557, 3, 2, 2, 2, 2, 559, 3, 2, 2, 2, 2, 561, 3, 2, 2, 2, 2, 563, 3, 2, 2, 2, 2, 565, 3, 2, 2, 2, 2, 567, 3, 2, 2, 2, 2, 569, 3, 2, 2, 2, 2, 571, 3, 2, 2, 2, 2, 573, 3, 2, 2, 2, 2, 575, 3, 2, 2, 2, 2, 577, 3, 2, 2, 2, 2, 579, 3, 2, 2, 2, 2, 581, 3, 2, 2, 2, 2, 583, 3, 2, 2, 2, 2, 585, 3, 2, 2, 2, 2, 587, 3, 2, 2, 2, 2, 589, 3, 2, 2, 2, 2, 591, 3, 2, 2, 2, 2, 593, 3, 2, 2, 2, 2, 595, 3, 2, 2, 2, 2, 597, 3, 2, 2, 2, 2, 599, 3, 2, 2, 2, 2, 601, 3, 2, 2, 2, 2, 603, 3, 2, 2, 2, 2, 605, 3, 2, 2, 2, 2, 667, 3, 2, 2, 2, 2, 669, 3, 2, 2, 2, 2, 671, 3, 2, 2, 2, 2, 673, 3, 2, 2, 2, 3, 675, 3, 2, 2, 2, 5, 677, 3, 2, 2, 2, 7, 679, 3, 2, 2, 2, 9, 683, 3, 2, 2, 2, 11, 686, 3, 2, 2, 2, 13, 689, 3, 2, 2, 2, 15, 691, 3, 2, 2, 2, 17, 693, 3, 2, 2, 2, 19, 697, 3, 2, 2, 2, 21, 703, 3, 2, 2, 2, 23, 707, 3, 2, 2, 2, 25, 713, 3, 2, 2, 2, 27, 721, 3, 2, 2, 2, 29, 725, 3, 2, 2, 2, 31, 730, 3, 2, 2, 2, 33, 734, 3, 2, 2, 2, 35, 742, 3, 2, 2, 2, 37, 748, 3, 2, 2, 2, 39, 751, 3, 2, 2, 2, 41, 755, 3, 2, 2, 2, 43, 758, 3, 2, 2, 2, 45, 772, 3, 2, 2, 2, 47, 780, 3, 2, 2, 2, 49, 785, 3, 2, 2, 2, 51, 792, 3, 2, 2, 2, 53, 800, 3, 2, 2, 2, 55, 803, 3, 2, 2, 2, 57, 809, 3, 2, 2, 2, 59, 817, 3, 2, 2, 2, 61, 822, 3, 2, 2, 2, 63, 827, 3, 2, 2, 2, 65, 834, 3, 2, 2, 2, 67, 840, 3, 2, 2, 2, 69, 846, 3, 2, 2, 2, 71, 854, 3, 2, 2, 2, 73, 864, 3, 2, 2, 2, 75, 872, 3, 2, 2, 2, 77, 880, 3, 2, 2, 2, 79, 891, 3, 2, 2, 2, 81, 898, 3, 2, 2, 2, 83, 906, 3, 2, 2, 2, 85, 914, 3, 2, 2, 2, 87, 921, 3, 2, 2, 2, 89, 929, 3, 2, 2, 2, 91, 941, 3, 2, 2, 2, 93, 949, 3, 2, 2, 2, 95, 961, 3, 2, 2, 2, 97, 972, 3, 2, 2, 2, 99, 977, 3, 2, 2, 2, 101, 984, 3, 2, 2, 2, 103, 990, 3, 2, 2, 2, 105, 995, 3, 2, 2, 2, 107, 1003, 3, 2, 2, 2, 109, 1016, 3, 2, 2, 2, 111, 1029, 3, 2, 2, 2, 113, 1047, 3, 2, 2, 2, 115, 1060, 3, 2, 2, 2, 117, 1064, 3, 2, 2, 2, 119, 1069, 3, 2, 2, 2, 121, 1096, 3, 2, 2, 2, 123, 1098, 3, 2, 2, 2, 125, 1111, 3, 2, 2, 2, 127, 1119, 3, 2, 2, 2, 129, 1126, 3, 2, 2, 2, 131, 1136, 3, 2, 2, 2, 133, 1141, 3, 2, 2, 2, 135, 1150, 3, 2, 2, 2, 137, 1154, 3, 2, 2, 2, 139, 1166, 3, 2, 2, 2, 141, 1176, 3, 2, 2, 2, 143, 1185, 3, 2, 2, 2, 145, 1196, 3, 2, 2, 2, 147, 1200, 3, 2, 2, 2, 149, 1205, 3, 2, 2, 2, 151, 1210, 3, 2, 2, 2, 153, 1214, 3, 2, 2, 2, 155, 1221, 3, 2, 2, 2, 157, 1229, 3, 2, 2, 2, 159, 1236, 3, 2, 2, 2, 161, 1245, 3, 2, 2, 2, 163, 1252, 3, 2, 2, 2, 165, 1260, 3, 2, 2, 2, 167, 1267, 3, 2, 2, 2, 169, 1276, 3, 2, 2, 2, 171, 1285, 3, 2, 2, 2, 173, 1293, 3, 2, 2, 2, 175, 1299, 3, 2, 2, 2, 177, 1305, 3, 2, 2, 2, 179, 1312, 3, 2, 2, 2, 181, 1319, 3, 2, 2, 2, 183, 1330, 3, 2, 2, 2, 185, 1336, 3, 2, 2, 2, 187, 1346, 3, 2, 2, 2, 189, 1350, 3, 2, 2, 2, 191, 1358, 3, 2, 2, 2, 193, 1365, 3, 2, 2, 2, 195, 1375, 3, 2, 2, 2, 197, 1380, 3, 2, 2, 2, 199, 1385, 3, 2, 2, 2, 201, 1394, 3, 2, 2, 2, 203, 1404, 3, 2, 2, 2, 205, 1411, 3, 2, 2, 2, 207, 1417, 3, 2, 2, 2, 209, 1423, 3, 2, 2, 2, 211, 1432, 3, 2, 2, 2, 213, 1439, 3, 2, 2, 2, 215, 1444, 3, 2, 2, 2, 217, 1447, 3, 2, 2, 2, 219, 1454, 3, 2, 2, 2, 221, 1461, 3, 2, 2, 2, 223, 1464, 3, 2, 2, 2, 225, 1470, 3, 2, 2, 2, 227, 1478, 3, 2, 2, 2, 229, 1484, 3, 2, 2, 2, 231, 1491, 3, 2, 2, 2, 233, 1503, 3, 2, 2, 2, 235, 1510, 3, 2, 2, 2, 237, 1520, 3, 2, 2, 2, 239, 1529, 3, 2, 2, 2, 241, 1534, 3, 2, 2, 2, 243, 1537, 3, 2, 2, 2, 245, 1543, 3, 2, 2, 2, 247, 1548, 3, 2, 2, 2, 249, 1553, 3, 2, 2, 2, 251, 1558, 3, 2, 2, 2, 253, 1566, 3, 2, 2, 2, 255, 1571, 3, 2, 2, 2, 257, 1579, 3, 2, 2, 2, 259, 1584, 3, 2, 2, 2, 261, 1589, 3, 2, 2, 2, 263, 1595, 3, 2, 2, 2, 265, 1601, 3, 2, 2, 2, 267, 1606, 3, 2, 2, 2, 269, 1611, 3, 2, 2, 2, 271, 1617, 3, 2, 2, 2, 273, 1626, 3, 2, 2, 2, 275, 1631, 3, 2, 2, 2, 277, 1637, 3, 2, 2, 2, 279, 1645, 3, 2, 2, 2, 281, 1651, 3, 2, 2, 2, 283, 1655, 3, 2, 2, 2, 285, 1663, 3, 2, 2, 2, 287, 1669, 3, 2, 2, 2, 289, 1676, 3, 2, 2, 2, 291, 1682, 3, 2, 2, 2, 293, 1687, 3, 2, 2, 2, 295, 1697, 3, 2, 2, 2, 297, 1708, 3, 2, 2, 2, 299, 1716, 3, 2, 2, 2, 301, 1724, 3, 2, 2, 2, 303, 1726, 3, 2, 2, 2, 305, 1731, 3, 2, 2, 2, 307, 1737, 3, 2, 2, 2, 309, 1740, 3, 2, 2, 2, 311, 1747, 3, 2, 2, 2, 313, 1750, 3, 2, 2, 2, 315, 1755, 3, 2, 2, 2, 317, 1762, 3, 2, 2, 2, 319, 1770, 3, 2, 2, 2, 321, 1773, 3, 2, 2, 2, 323, 1779, 3, 2, 2, 2, 325, 1783, 3, 2, 2, 2, 327, 1789, 3, 2, 2, 2, 329, 1802, 3, 2, 2, 2, 331, 1807, 3, 2, 2, 2, 333, 1816, 3, 2, 2, 2, 335, 1824, 3, 2, 2, 2, 337, 1834, 3, 2, 2, 2, 339, 1844, 3, 2, 2, 2, 341, 1856, 3, 2, 2, 2, 343, 1867, 3, 2, 2, 2, 345, 1875, 3, 2, 2, 2, 347, 1881, 3, 2, 2, 2, 349, 1889, 3, 2, 2, 2, 351, 1898, 3, 2, 2, 2, 353, 1908, 3, 2, 2, 2, 355, 1916, 3, 2, 2, 2, 357, 1927, 3, 2, 2, 2, 359, 1938, 3, 2, 2, 2, 361, 1944, 3, 2, 2, 2, 363, 1950, 3, 2, 2, 2, 365, 1956, 3, 2, 2, 2, 367, 1969, 3, 2, 2, 2, 369, 1982, 3, 2, 2, 2, 371, 1990, 3, 2, 2, 2, 373, 1997, 3, 2, 2, 2, 375, 2008, 3, 2, 2, 2, 377, 2016, 3, 2, 2, 2, 379, 2023, 3, 2, 2, 2, 381, 2030, 3, 2, 2, 2, 383, 2038, 3, 2, 2, 2, 385, 2044, 3, 2, 2, 2, 387, 2052, 3, 2, 2, 2, 389, 2061, 3, 2, 2, 2, 391, 2068, 3, 2, 2, 2, 393, 2087, 3, 2, 2, 2, 395, 2089, 3, 2, 2, 2, 397, 2094, 3, 2, 2, 2, 399, 2100, 3, 2, 2, 2, 401, 2109, 3, 2, 2, 2, 403, 2116, 3, 2, 2, 2, 405, 2120, 3, 2, 2, 2, 407, 2125, 3, 2, 2, 2, 409, 2132, 3, 2, 2, 2, 411, 2139, 3, 2, 2, 2, 413, 2146, 3, 2, 2, 2, 415, 2151, 3, 2, 2, 2, 417, 2161, 3, 2, 2, 2, 419, 2167, 3, 2, 2, 2, 421, 2183, 3, 2, 2, 2, 423, 2196, 3, 2, 2, 2, 425, 2200, 3, 2, 2, 2, 427, 2206, 3, 2, 2, 2, 429, 2211, 3, 2, 2, 2, 431, 2216, 3, 2, 2, 2, 433, 2223, 3, 2, 2, 2, 435, 2228, 3, 2, 2, 2, 437, 2233, 3, 2, 2, 2, 439, 2240, 3, 2, 2, 2, 441, 2246, 3, 2, 2, 2, 443, 2257, 3, 2, 2, 2, 445, 2264, 3, 2, 2, 2, 447, 2273, 3, 2, 2, 2, 449, 2280, 3, 2, 2, 2, 451, 2287, 3, 2, 2, 2, 453, 2297, 3, 2, 2, 2, 455, 2302, 3, 2, 2, 2, 457, 2308, 3, 2, 2, 2, 459, 2315, 3, 2, 2, 2, 461, 2327, 3, 2, 2, 2, 463, 2356, 3, 2, 2, 2, 465, 2358, 3, 2, 2, 2, 467, 2369, 3, 2, 2, 2, 469, 2374, 3, 2, 2, 2, 471, 2379, 3, 2, 2, 2, 473, 2382, 3, 2, 2, 2, 475, 2388, 3, 2, 2, 2, 477, 2397, 3, 2, 2, 2, 479, 2409, 3, 2, 2, 2, 481, 2422, 3, 2, 2, 2, 483, 2432, 3, 2, 2, 2, 485, 2437, 3, 2, 2, 2, 487, 2442, 3, 2, 2, 2, 489, 2451, 3, 2, 2, 2, 491, 2460, 3, 2, 2, 2, 493, 2465, 3, 2, 2, 2, 495, 2475, 3, 2, 2, 2, 497, 2485, 3, 2, 2, 2, 499, 2493, 3, 2, 2, 2, 501, 2499, 3, 2, 2, 2, 503, 2506, 3, 2, 2, 2, 505, 2514, 3, 2, 2, 2, 507, 2521, 3, 2, 2, 2, 509, 2527, 3, 2, 2, 2, 511, 2534, 3, 2, 2, 2, 513, 2538, 3, 2, 2, 2, 515, 2543, 3, 2, 2, 2, 517, 2549, 3, 2, 2, 2, 519, 2556, 3, 2, 2, 2, 521, 2561, 3, 2, 2, 2, 523, 2567, 3, 2, 2, 2, 525, 2572, 3, 2, 2, 2, 527, 2578, 3, 2, 2, 2, 529, 2585, 3, 2, 2, 2, 531, 2590, 3, 2, 2, 2, 533, 2595, 3, 2, 2, 2, 535, 2603, 3, 2, 2, 2, 537, 2605, 3, 2, 2, 2, 539, 2609, 3, 2, 2, 2, 541, 2612, 3, 2, 2, 2, 543, 2615, 3, 2, 2, 2, 545, 2621, 3, 2, 2, 2, 547, 2623, 3, 2, 2, 2, 549, 2629, 3, 2, 2, 2, 551, 2631, 3, 2, 2, 2, 553, 2633, 3, 2, 2, 2, 555, 2635, 3, 2, 2, 2, 557, 2637, 3, 2, 2, 2, 559, 2639, 3, 2, 2, 2, 561, 2641, 3, 2, 2, 2, 563, 2643, 3, 2, 2, 2, 565, 2645, 3, 2, 2, 2, 567, 2647, 3, 2, 2, 2, 569, 2650, 3, 2, 2, 2, 571, 2652, 3, 2, 2, 2, 573, 2654, 3, 2, 2, 2, 575, 2656, 3, 2, 2, 2, 577, 2658, 3, 2, 2, 2, 579, 2660, 3, 2, 2, 2, 581, 2662, 3, 2, 2, 2, 583, 2684, 3, 2, 2, 2, 585, 2687, 3, 2, 2, 2, 587, 2694, 3, 2, 2, 2, 589, 2701, 3, 2, 2, 2, 591, 2708, 3, 2, 2, 2, 593, 2723, 3, 2, 2, 2, 595, 2725, 3, 2, 2, 2, 597, 2745, 3, 2, 2, 2, 599, 2764, 3, 2, 2, 2, 601, 2786, 3, 2, 2, 2, 603, 2791, 3, 2, 2, 2, 605, 2795, 3, 2, 2, 2, 607, 2824, 3, 2, 2, 2, 609, 2826, 3, 2, 2, 2, 611, 2835, 3, 2, 2, 2, 613, 2837, 3, 2, 2, 2, 615, 2839, 3, 2, 2, 2, 617, 2841, 3, 2, 2, 2, 619, 2843, 3, 2, 2, 2, 621, 2845, 3, 2, 2, 2, 623, 2847, 3, 2, 2, 2, 625, 2849, 3, 2, 2, 2, 627, 2851, 3, 2, 2, 2, 629, 2853, 3, 2, 2, 2, 631, 2855, 3, 2, 2, 2, 633, 2857, 3, 2, 2, 2, 635, 2859, 3, 2, 2, 2, 637, 2861, 3, 2, 2, 2, 639, 2863, 3, 2, 2, 2, 641, 2865, 3, 2, 2, 2, 643, 2867, 3, 2, 2, 2, 645, 2869, 3, 2, 2, 2, 647, 2871, 3, 2, 2, 2, 649, 2873, 3, 2, 2, 2, 651, 2875, 3, 2, 2, 2, 653, 2877, 3, 2, 2, 2, 655, 2879, 3, 2, 2, 2, 657, 2881, 3, 2, 2, 2, 659, 2883, 3, 2, 2, 2, 661, 2885, 3, 2, 2, 2, 663, 2887, 3, 2, 2, 2, 665, 2889, 3, 2, 2, 2, 667, 2891, 3, 2, 2, 2, 669, 2910, 3, 2, 2, 2, 671, 2927, 3, 2, 2, 2, 673, 2933, 3, 2, 2, 2, 675, 676, 7, 42, 2, 2, 676, 4, 3, 2, 2, 2, 677, 678, 7, 43, 2, 2, 678, 6, 3, 2, 2, 2, 679, 680, 7, 49, 2, 2, 680, 681, 7, 44, 2, 2, 681, 682, 7, 45, 2, 2, 682, 8, 3, 2, 2, 2, 683, 684, 7, 44, 2, 2, 684, 685, 7, 49, 2, 2, 685, 10, 3, 2, 2, 2, 686, 687, 7, 47, 2, 2, 687, 688, 7, 64, 2, 2, 688, 12, 3, 2, 2, 2, 689, 690, 7, 93, 2, 2, 690, 14, 3, 2, 2, 2, 691, 692, 7, 95, 2, 2, 692, 16, 3, 2, 2, 2, 693, 694, 5, 615, 308, 2, 694, 695, 5, 621, 311, 2, 695, 696, 5, 621, 311, 2, 696, 18, 3, 2, 2, 2, 697, 698, 5, 615, 308, 2, 698, 699, 5, 625, 313, 2, 699, 700, 5, 653, 327, 2, 700, 701, 5, 623, 312, 2, 701, 702, 5, 649, 325, 2, 702, 20, 3, 2, 2, 2, 703, 704, 5, 615, 308, 2, 704, 705, 5, 637, 319, 2, 705, 706, 5, 637, 319, 2, 706, 22, 3, 2, 2, 2, 707, 708, 5, 615, 308, 2, 708, 709, 5, 637, 319, 2, 709, 710, 5, 653, 327, 2, 710, 711, 5, 623, 312, 2, 711, 712, 5, 649, 325, 2, 712, 24, 3, 2, 2, 2, 713, 714, 5, 615, 308, 2, 714, 715, 5, 641, 321, 2, 715, 716, 5, 615, 308, 2, 716, 717, 5, 637, 319, 2, 717, 718, 5, 663, 332, 2, 718, 719, 5, 665, 333, 2, 719, 720, 5, 623, 312, 2, 720, 26, 3, 2, 2, 2, 721, 722, 5, 615, 308, 2, 722, 723, 5, 641, 321, 2, 723, 724, 5, 621, 311, 2, 724, 28, 3, 2, 2, 2, 725, 726, 5, 615, 308, 2, 726, 727, 5, 641, 321, 2, 727, 728, 5, 653, 327, 2, 728, 729, 5, 631, 316, 2, 729, 30, 3, 2, 2, 2, 730, 731, 5, 615, 308, 2, 731, 732, 5, 641, 321, 2, 732, 733, 5, 663, 332, 2, 733, 32, 3, 2, 2, 2, 734, 735, 5, 615, 308, 2, 735, 736, 5, 649, 325, 2, 736, 737, 5, 619, 310, 2, 737, 738, 5, 629, 315, 2, 738, 739, 5, 631, 316, 2, 739, 740, 5, 657, 329, 2, 740, 741, 5, 623, 312, 2, 741, 34, 3, 2, 2, 2, 742, 743, 5, 615, 308, 2, 743, 744, 5, 649, 325, 2, 744, 745, 5, 649, 325, 2, 745, 746, 5, 615, 308, 2, 746, 747, 5, 663, 332, 2, 747, 36, 3, 2, 2, 2, 748, 749, 5, 615, 308, 2, 749, 750, 5, 651, 326, 2, 750, 38, 3, 2, 2, 2, 751, 752, 5, 615, 308, 2, 752, 753, 5, 651, 326, 2, 753, 754, 5, 619, 310, 2, 754, 40, 3, 2, 2, 2, 755, 756, 5, 615, 308, 2, 756, 757, 5, 653, 327, 2, 757, 42, 3, 2, 2, 2, 758, 759, 5, 615, 308, 2, 759, 760, 5, 655, 328, 2, 760, 761, 5, 653, 327, 2, 761, 762, 5, 629, 315, 2, 762, 763, 5, 643, 322, 2, 763, 764, 5, 649, 325, 2, 764, 765, 5, 631, 316, 2, 765, 766, 5, 665, 333, 2, 766, 767, 5, 615, 308, 2, 767, 768, 5, 653, 327, 2, 768, 769, 5, 631, 316, 2, 769, 770, 5, 643, 322, 2, 770, 771, 5, 641, 321, 2, 771, 44, 3, 2, 2, 2, 772, 773, 5, 617, 309, 2, 773, 774, 5, 623, 312, 2, 774, 775, 5, 653, 327, 2, 775, 776, 5, 659, 330, 2, 776, 777, 5, 623, 312, 2, 777, 778, 5, 623, 312, 2, 778, 779, 5, 641, 321, 2, 779, 46, 3, 2, 2, 2, 780, 781, 5, 617, 309, 2, 781, 782, 5, 643, 322, 2, 782, 783, 5, 653, 327, 2, 783, 784, 5, 629, 315, 2, 784, 48, 3, 2, 2, 2, 785, 786, 5, 617, 309, 2, 786, 787, 5, 655, 328, 2, 787, 788, 5, 619, 310, 2, 788, 789, 5, 635, 318, 2, 789, 790, 5, 623, 312, 2, 790, 791, 5, 653, 327, 2, 791, 50, 3, 2, 2, 2, 792, 793, 5, 617, 309, 2, 793, 794, 5, 655, 328, 2, 794, 795, 5, 619, 310, 2, 795, 796, 5, 635, 318, 2, 796, 797, 5, 623, 312, 2, 797, 798, 5, 653, 327, 2, 798, 799, 5, 651, 326, 2, 799, 52, 3, 2, 2, 2, 800, 801, 5, 617, 309, 2, 801, 802, 5, 663, 332, 2, 802, 54, 3, 2, 2, 2, 803, 804, 5, 619, 310, 2, 804, 805, 5, 615, 308, 2, 805, 806, 5, 619, 310, 2, 806, 807, 5, 629, 315, 2, 807, 808, 5, 623, 312, 2, 808, 56, 3, 2, 2, 2, 809, 810, 5, 619, 310, 2, 810, 811, 5, 615, 308, 2, 811, 812, 5, 651, 326, 2, 812, 813, 5, 619, 310, 2, 813, 814, 5, 615, 308, 2, 814, 815, 5, 621, 311, 2, 815, 816, 5, 623, 312, 2, 816, 58, 3, 2, 2, 2, 817, 818, 5, 619, 310, 2, 818, 819, 5, 615, 308, 2, 819, 820, 5, 651, 326, 2, 820, 821, 5, 623, 312, 2, 821, 60, 3, 2, 2, 2, 822, 823, 5, 619, 310, 2, 823, 824, 5, 615, 308, 2, 824, 825, 5, 651, 326, 2, 825, 826, 5, 653, 327, 2, 826, 62, 3, 2, 2, 2, 827, 828, 5, 619, 310, 2, 828, 829, 5, 629, 315, 2, 829, 830, 5, 615, 308, 2, 830, 831, 5, 641, 321, 2, 831, 832, 5, 627, 314, 2, 832, 833, 5, 623, 312, 2, 833, 64, 3, 2, 2, 2, 834, 835, 5, 619, 310, 2, 835, 836, 5, 629, 315, 2, 836, 837, 5, 623, 312, 2, 837, 838, 5, 619, 310, 2, 838, 839, 5, 635, 318, 2, 839, 66, 3, 2, 2, 2, 840, 841, 5, 619, 310, 2, 841, 842, 5, 637, 319, 2, 842, 843, 5, 623, 312, 2, 843, 844, 5, 615, 308, 2, 844, 845, 5, 649, 325, 2, 845, 68, 3, 2, 2, 2, 846, 847, 5, 619, 310, 2, 847, 848, 5, 637, 319, 2, 848, 849, 5, 655, 328, 2, 849, 850, 5, 651, 326, 2, 850, 851, 5, 653, 327, 2, 851, 852, 5, 623, 312, 2, 852, 853, 5, 649, 325, 2, 853, 70, 3, 2, 2, 2, 854, 855, 5, 619, 310, 2, 855, 856, 5, 637, 319, 2, 856, 857, 5, 655, 328, 2, 857, 858, 5, 651, 326, 2, 858, 859, 5, 653, 327, 2, 859, 860, 5, 623, 312, 2, 860, 861, 5, 649, 325, 2, 861, 862, 5, 623, 312, 2, 862, 863, 5, 621, 311, 2, 863, 72, 3, 2, 2, 2, 864, 865, 5, 619, 310, 2, 865, 866, 5, 643, 322, 2, 866, 867, 5, 621, 311, 2, 867, 868, 5, 623, 312, 2, 868, 869, 5, 627, 314, 2, 869, 870, 5, 623, 312, 2, 870, 871, 5, 641, 321, 2, 871, 74, 3, 2, 2, 2, 872, 873, 5, 619, 310, 2, 873, 874, 5, 643, 322, 2, 874, 875, 5, 637, 319, 2, 875, 876, 5, 637, 319, 2, 876, 877, 5, 615, 308, 2, 877, 878, 5, 653, 327, 2, 878, 879, 5, 623, 312, 2, 879, 76, 3, 2, 2, 2, 880, 881, 5, 619, 310, 2, 881, 882, 5, 643, 322, 2, 882, 883, 5, 637, 319, 2, 883, 884, 5, 637, 319, 2, 884, 885, 5, 623, 312, 2, 885, 886, 5, 619, 310, 2, 886, 887, 5, 653, 327, 2, 887, 888, 5, 631, 316, 2, 888, 889, 5, 643, 322, 2, 889, 890, 5, 641, 321, 2, 890, 78, 3, 2, 2, 2, 891, 892, 5, 619, 310, 2, 892, 893, 5, 643, 322, 2, 893, 894, 5, 637, 319, 2, 894, 895, 5, 655, 328, 2, 895, 896, 5, 639, 320, 2, 896, 897, 5, 641, 321, 2, 897, 80, 3, 2, 2, 2, 898, 899, 5, 619, 310, 2, 899, 900, 5, 643, 322, 2, 900, 901, 5, 637, 319, 2, 901, 902, 5, 655, 328, 2, 902, 903, 5, 639, 320, 2, 903, 904, 5, 641, 321, 2, 904, 905, 5, 651, 326, 2, 905, 82, 3, 2, 2, 2, 906, 907, 5, 619, 310, 2, 907, 908, 5, 643, 322, 2, 908, 909, 5, 639, 320, 2, 909, 910, 5, 639, 320, 2, 910, 911, 5, 623, 312, 2, 911, 912, 5, 641, 321, 2, 912, 913, 5, 653, 327, 2, 913, 84, 3, 2, 2, 2, 914, 915, 5, 619, 310, 2, 915, 916, 5, 643, 322, 2, 916, 917, 5, 639, 320, 2, 917, 918, 5, 639, 320, 2, 918, 919, 5, 631, 316, 2, 919, 920, 5, 653, 327, 2, 920, 86, 3, 2, 2, 2, 921, 922, 5, 619, 310, 2, 922, 923, 5, 643, 322, 2, 923, 924, 5, 639, 320, 2, 924, 925, 5, 645, 323, 2, 925, 926, 5, 615, 308, 2, 926, 927, 5, 619, 310, 2, 927, 928, 5, 653, 327, 2, 928, 88, 3, 2, 2, 2, 929, 930, 5, 619, 310, 2, 930, 931, 5, 643, 322, 2, 931, 932, 5, 639, 320, 2, 932, 933, 5, 645, 323, 2, 933, 934, 5, 615, 308, 2, 934, 935, 5, 619, 310, 2, 935, 936, 5, 653, 327, 2, 936, 937, 5, 631, 316, 2, 937, 938, 5, 643, 322, 2, 938, 939, 5, 641, 321, 2, 939, 940, 5, 651, 326, 2, 940, 90, 3, 2, 2, 2, 941, 942, 5, 619, 310, 2, 942, 943, 5, 643, 322, 2, 943, 944, 5, 639, 320, 2, 944, 945, 5, 645, 323, 2, 945, 946, 5, 655, 328, 2, 946, 947, 5, 653, 327, 2, 947, 948, 5, 623, 312, 2, 948, 92, 3, 2, 2, 2, 949, 950, 5, 619, 310, 2, 950, 951, 5, 643, 322, 2, 951, 952, 5, 641, 321, 2, 952, 953, 5, 619, 310, 2, 953, 954, 5, 615, 308, 2, 954, 955, 5, 653, 327, 2, 955, 956, 5, 623, 312, 2, 956, 957, 5, 641, 321, 2, 957, 958, 5, 615, 308, 2, 958, 959, 5, 653, 327, 2, 959, 960, 5, 623, 312, 2, 960, 94, 3, 2, 2, 2, 961, 962, 5, 619, 310, 2, 962, 963, 5, 643, 322, 2, 963, 964, 5, 641, 321, 2, 964, 965, 5, 651, 326, 2, 965, 966, 5, 653, 327, 2, 966, 967, 5, 649, 325, 2, 967, 968, 5, 615, 308, 2, 968, 969, 5, 631, 316, 2, 969, 970, 5, 641, 321, 2, 970, 971, 5, 653, 327, 2, 971, 96, 3, 2, 2, 2, 972, 973, 5, 619, 310, 2, 973, 974, 5, 643, 322, 2, 974, 975, 5, 651, 326, 2, 975, 976, 5, 653, 327, 2, 976, 98, 3, 2, 2, 2, 977, 978, 5, 619, 310, 2, 978, 979, 5, 649, 325, 2, 979, 980, 5, 623, 312, 2, 980, 981, 5, 615, 308, 2, 981, 982, 5, 653, 327, 2, 982, 983, 5, 623, 312, 2, 983, 100, 3, 2, 2, 2, 984, 985, 5, 619, 310, 2, 985, 986, 5, 649, 325, 2, 986, 987, 5, 643, 322, 2, 987, 988, 5, 651, 326, 2, 988, 989, 5, 651, 326, 2, 989, 102, 3, 2, 2, 2, 990, 991, 5, 619, 310, 2, 991, 992, 5, 655, 328, 2, 992, 993, 5, 617, 309, 2, 993, 994, 5, 623, 312, 2, 994, 104, 3, 2, 2, 2, 995, 996, 5, 619, 310, 2, 996, 997, 5, 655, 328, 2, 997, 998, 5, 649, 325, 2, 998, 999, 5, 649, 325, 2, 999, 1000, 5, 623, 312, 2, 1000, 1001, 5, 641, 321, 2, 1001, 1002, 5, 653, 327, 2, 1002, 106, 3, 2, 2, 2, 1003, 1004, 5, 619, 310, 2, 1004, 1005, 5, 655, 328, 2, 1005, 1006, 5, 649, 325, 2, 1006, 1007, 5, 649, 325, 2, 1007, 1008, 5, 623, 312, 2, 1008, 1009, 5, 641, 321, 2, 1009, 1010, 5, 653, 327, 2, 1010, 1011, 5, 571, 286, 2, 1011, 1012, 5, 621, 311, 2, 1012, 1013, 5, 615, 308, 2, 1013, 1014, 5, 653, 327, 2, 1014, 1015, 5, 623, 312, 2, 1015, 108, 3, 2, 2, 2, 1016, 1017, 5, 619, 310, 2, 1017, 1018, 5, 655, 328, 2, 1018, 1019, 5, 649, 325, 2, 1019, 1020, 5, 649, 325, 2, 1020, 1021, 5, 623, 312, 2, 1021, 1022, 5, 641, 321, 2, 1022, 1023, 5, 653, 327, 2, 1023, 1024, 5, 571, 286, 2, 1024, 1025, 5, 653, 327, 2, 1025, 1026, 5, 631, 316, 2, 1026, 1027, 5, 639, 320, 2, 1027, 1028, 5, 623, 312, 2, 1028, 110, 3, 2, 2, 2, 1029, 1030, 5, 619, 310, 2, 1030, 1031, 5, 655, 328, 2, 1031, 1032, 5, 649, 325, 2, 1032, 1033, 5, 649, 325, 2, 1033, 1034, 5, 623, 312, 2, 1034, 1035, 5, 641, 321, 2, 1035, 1036, 5, 653, 327, 2, 1036, 1037, 5, 571, 286, 2, 1037, 1038, 5, 653, 327, 2, 1038, 1039, 5, 631, 316, 2, 1039, 1040, 5, 639, 320, 2, 1040, 1041, 5, 623, 312, 2, 1041, 1042, 5, 651, 326, 2, 1042, 1043, 5, 653, 327, 2, 1043, 1044, 5, 615, 308, 2, 1044, 1045, 5, 639, 320, 2, 1045, 1046, 5, 645, 323, 2, 1046, 112, 3, 2, 2, 2, 1047, 1048, 5, 619, 310, 2, 1048, 1049, 5, 655, 328, 2, 1049, 1050, 5, 649, 325, 2, 1050, 1051, 5, 649, 325, 2, 1051, 1052, 5, 623, 312, 2, 1052, 1053, 5, 641, 321, 2, 1053, 1054, 5, 653, 327, 2, 1054, 1055, 5, 571, 286, 2, 1055, 1056, 5, 655, 328, 2, 1056, 1057, 5, 651, 326, 2, 1057, 1058, 5, 623, 312, 2, 1058, 1059, 5, 649, 325, 2, 1059, 114, 3, 2, 2, 2, 1060, 1061, 5, 621, 311, 2, 1061, 1062, 5, 615, 308, 2, 1062, 1063, 5, 663, 332, 2, 1063, 116, 3, 2, 2, 2, 1064, 1065, 5, 621, 311, 2, 1065, 1066, 5, 615, 308, 2, 1066, 1067, 5, 653, 327, 2, 1067, 1068, 5, 615, 308, 2, 1068, 118, 3, 2, 2, 2, 1069, 1070, 5, 621, 311, 2, 1070, 1071, 5, 615, 308, 2, 1071, 1072, 5, 653, 327, 2, 1072, 1073, 5, 615, 308, 2, 1073, 1074, 5, 617, 309, 2, 1074, 1075, 5, 615, 308, 2, 1075, 1076, 5, 651, 326, 2, 1076, 1077, 5, 623, 312, 2, 1077, 120, 3, 2, 2, 2, 1078, 1079, 5, 621, 311, 2, 1079, 1080, 5, 615, 308, 2, 1080, 1081, 5, 653, 327, 2, 1081, 1082, 5, 615, 308, 2, 1082, 1083, 5, 617, 309, 2, 1083, 1084, 5, 615, 308, 2, 1084, 1085, 5, 651, 326, 2, 1085, 1086, 5, 623, 312, 2, 1086, 1087, 5, 651, 326, 2, 1087, 1097, 3, 2, 2, 2, 1088, 1089, 5, 651, 326, 2, 1089, 1090, 5, 619, 310, 2, 1090, 1091, 5, 629, 315, 2, 1091, 1092, 5, 623, 312, 2, 1092, 1093, 5, 639, 320, 2, 1093, 1094, 5, 615, 308, 2, 1094, 1095, 5, 651, 326, 2, 1095, 1097, 3, 2, 2, 2, 1096, 1078, 3, 2, 2, 2, 1096, 1088, 3, 2, 2, 2, 1097, 122, 3, 2, 2, 2, 1098, 1099, 5, 621, 311, 2, 1099, 1100, 5, 617, 309, 2, 1100, 1101, 5, 645, 323, 2, 1101, 1102, 5, 649, 325, 2, 1102, 1103, 5, 643, 322, 2, 1103, 1104, 5, 645, 323, 2, 1104, 1105, 5, 623, 312, 2, 1105, 1106, 5, 649, 325, 2, 1106, 1107, 5, 653, 327, 2, 1107, 1108, 5, 631, 316, 2, 1108, 1109, 5, 623, 312, 2, 1109, 1110, 5, 651, 326, 2, 1110, 124, 3, 2, 2, 2, 1111, 1112, 5, 621, 311, 2, 1112, 1113, 5, 623, 312, 2, 1113, 1114, 5, 625, 313, 2, 1114, 1115, 5, 631, 316, 2, 1115, 1116, 5, 641, 321, 2, 1116, 1117, 5, 623, 312, 2, 1117, 1118, 5, 621, 311, 2, 1118, 126, 3, 2, 2, 2, 1119, 1120, 5, 621, 311, 2, 1120, 1121, 5, 623, 312, 2, 1121, 1122, 5, 637, 319, 2, 1122, 1123, 5, 623, 312, 2, 1123, 1124, 5, 653, 327, 2, 1124, 1125, 5, 623, 312, 2, 1125, 128, 3, 2, 2, 2, 1126, 1127, 5, 621, 311, 2, 1127, 1128, 5, 623, 312, 2, 1128, 1129, 5, 637, 319, 2, 1129, 1130, 5, 631, 316, 2, 1130, 1131, 5, 639, 320, 2, 1131, 1132, 5, 631, 316, 2, 1132, 1133, 5, 653, 327, 2, 1133, 1134, 5, 623, 312, 2, 1134, 1135, 5, 621, 311, 2, 1135, 130, 3, 2, 2, 2, 1136, 1137, 5, 621, 311, 2, 1137, 1138, 5, 623, 312, 2, 1138, 1139, 5, 651, 326, 2, 1139, 1140, 5, 619, 310, 2, 1140, 132, 3, 2, 2, 2, 1141, 1142, 5, 621, 311, 2, 1142, 1143, 5, 623, 312, 2, 1143, 1144, 5, 651, 326, 2, 1144, 1145, 5, 619, 310, 2, 1145, 1146, 5, 649, 325, 2, 1146, 1147, 5, 631, 316, 2, 1147, 1148, 5, 617, 309, 2, 1148, 1149, 5, 623, 312, 2, 1149, 134, 3, 2, 2, 2, 1150, 1151, 5, 621, 311, 2, 1151, 1152, 5, 625, 313, 2, 1152, 1153, 5, 651, 326, 2, 1153, 136, 3, 2, 2, 2, 1154, 1155, 5, 621, 311, 2, 1155, 1156, 5, 631, 316, 2, 1156, 1157, 5, 649, 325, 2, 1157, 1158, 5, 623, 312, 2, 1158, 1159, 5, 619, 310, 2, 1159, 1160, 5, 653, 327, 2, 1160, 1161, 5, 643, 322, 2, 1161, 1162, 5, 649, 325, 2, 1162, 1163, 5, 631, 316, 2, 1163, 1164, 5, 623, 312, 2, 1164, 1165, 5, 651, 326, 2, 1165, 138, 3, 2, 2, 2, 1166, 1167, 5, 621, 311, 2, 1167, 1168, 5, 631, 316, 2, 1168, 1169, 5, 649, 325, 2, 1169, 1170, 5, 623, 312, 2, 1170, 1171, 5, 619, 310, 2, 1171, 1172, 5, 653, 327, 2, 1172, 1173, 5, 643, 322, 2, 1173, 1174, 5, 649, 325, 2, 1174, 1175, 5, 663, 332, 2, 1175, 140, 3, 2, 2, 2, 1176, 1177, 5, 621, 311, 2, 1177, 1178, 5, 631, 316, 2, 1178, 1179, 5, 651, 326, 2, 1179, 1180, 5, 653, 327, 2, 1180, 1181, 5, 631, 316, 2, 1181, 1182, 5, 641, 321, 2, 1182, 1183, 5, 619, 310, 2, 1183, 1184, 5, 653, 327, 2, 1184, 142, 3, 2, 2, 2, 1185, 1186, 5, 621, 311, 2, 1186, 1187, 5, 631, 316, 2, 1187, 1188, 5, 651, 326, 2, 1188, 1189, 5, 653, 327, 2, 1189, 1190, 5, 649, 325, 2, 1190, 1191, 5, 631, 316, 2, 1191, 1192, 5, 617, 309, 2, 1192, 1193, 5, 655, 328, 2, 1193, 1194, 5, 653, 327, 2, 1194, 1195, 5, 623, 312, 2, 1195, 144, 3, 2, 2, 2, 1196, 1197, 5, 621, 311, 2, 1197, 1198, 5, 631, 316, 2, 1198, 1199, 5, 657, 329, 2, 1199, 146, 3, 2, 2, 2, 1200, 1201, 5, 621, 311, 2, 1201, 1202, 5, 649, 325, 2, 1202, 1203, 5, 643, 322, 2, 1203, 1204, 5, 645, 323, 2, 1204, 148, 3, 2, 2, 2, 1205, 1206, 5, 623, 312, 2, 1206, 1207, 5, 637, 319, 2, 1207, 1208, 5, 651, 326, 2, 1208, 1209, 5, 623, 312, 2, 1209, 150, 3, 2, 2, 2, 1210, 1211, 5, 623, 312, 2, 1211, 1212, 5, 641, 321, 2, 1212, 1213, 5, 621, 311, 2, 1213, 152, 3, 2, 2, 2, 1214, 1215, 5, 623, 312, 2, 1215, 1216, 5, 651, 326, 2, 1216, 1217, 5, 619, 310, 2, 1217, 1218, 5, 615, 308, 2, 1218, 1219, 5, 645, 323, 2, 1219, 1220, 5, 623, 312, 2, 1220, 154, 3, 2, 2, 2, 1221, 1222, 5, 623, 312, 2, 1222, 1223, 5, 651, 326, 2, 1223, 1224, 5, 619, 310, 2, 1224, 1225, 5, 615, 308, 2, 1225, 1226, 5, 645, 323, 2, 1226, 1227, 5, 623, 312, 2, 1227, 1228, 5, 621, 311, 2, 1228, 156, 3, 2, 2, 2, 1229, 1230, 5, 623, 312, 2, 1230, 1231, 5, 661, 331, 2, 1231, 1232, 5, 619, 310, 2, 1232, 1233, 5, 623, 312, 2, 1233, 1234, 5, 645, 323, 2, 1234, 1235, 5, 653, 327, 2, 1235, 158, 3, 2, 2, 2, 1236, 1237, 5, 623, 312, 2, 1237, 1238, 5, 661, 331, 2, 1238, 1239, 5, 619, 310, 2, 1239, 1240, 5, 629, 315, 2, 1240, 1241, 5, 615, 308, 2, 1241, 1242, 5, 641, 321, 2, 1242, 1243, 5, 627, 314, 2, 1243, 1244, 5, 623, 312, 2, 1244, 160, 3, 2, 2, 2, 1245, 1246, 5, 623, 312, 2, 1246, 1247, 5, 661, 331, 2, 1247, 1248, 5, 631, 316, 2, 1248, 1249, 5, 651, 326, 2, 1249, 1250, 5, 653, 327, 2, 1250, 1251, 5, 651, 326, 2, 1251, 162, 3, 2, 2, 2, 1252, 1253, 5, 623, 312, 2, 1253, 1254, 5, 661, 331, 2, 1254, 1255, 5, 645, 323, 2, 1255, 1256, 5, 637, 319, 2, 1256, 1257, 5, 615, 308, 2, 1257, 1258, 5, 631, 316, 2, 1258, 1259, 5, 641, 321, 2, 1259, 164, 3, 2, 2, 2, 1260, 1261, 5, 623, 312, 2, 1261, 1262, 5, 661, 331, 2, 1262, 1263, 5, 645, 323, 2, 1263, 1264, 5, 643, 322, 2, 1264, 1265, 5, 649, 325, 2, 1265, 1266, 5, 653, 327, 2, 1266, 166, 3, 2, 2, 2, 1267, 1268, 5, 623, 312, 2, 1268, 1269, 5, 661, 331, 2, 1269, 1270, 5, 653, 327, 2, 1270, 1271, 5, 623, 312, 2, 1271, 1272, 5, 641, 321, 2, 1272, 1273, 5, 621, 311, 2, 1273, 1274, 5, 623, 312, 2, 1274, 1275, 5, 621, 311, 2, 1275, 168, 3, 2, 2, 2, 1276, 1277, 5, 623, 312, 2, 1277, 1278, 5, 661, 331, 2, 1278, 1279, 5, 653, 327, 2, 1279, 1280, 5, 623, 312, 2, 1280, 1281, 5, 649, 325, 2, 1281, 1282, 5, 641, 321, 2, 1282, 1283, 5, 615, 308, 2, 1283, 1284, 5, 637, 319, 2, 1284, 170, 3, 2, 2, 2, 1285, 1286, 5, 623, 312, 2, 1286, 1287, 5, 661, 331, 2, 1287, 1288, 5, 653, 327, 2, 1288, 1289, 5, 649, 325, 2, 1289, 1290, 5, 615, 308, 2, 1290, 1291, 5, 619, 310, 2, 1291, 1292, 5, 653, 327, 2, 1292, 172, 3, 2, 2, 2, 1293, 1294, 5, 625, 313, 2, 1294, 1295, 5, 615, 308, 2, 1295, 1296, 5, 637, 319, 2, 1296, 1297, 5, 651, 326, 2, 1297, 1298, 5, 623, 312, 2, 1298, 174, 3, 2, 2, 2, 1299, 1300, 5, 625, 313, 2, 1300, 1301, 5, 623, 312, 2, 1301, 1302, 5, 653, 327, 2, 1302, 1303, 5, 619, 310, 2, 1303, 1304, 5, 629, 315, 2, 1304, 176, 3, 2, 2, 2, 1305, 1306, 5, 625, 313, 2, 1306, 1307, 5, 631, 316, 2, 1307, 1308, 5, 623, 312, 2, 1308, 1309, 5, 637, 319, 2, 1309, 1310, 5, 621, 311, 2, 1310, 1311, 5, 651, 326, 2, 1311, 178, 3, 2, 2, 2, 1312, 1313, 5, 625, 313, 2, 1313, 1314, 5, 631, 316, 2, 1314, 1315, 5, 637, 319, 2, 1315, 1316, 5, 653, 327, 2, 1316, 1317, 5, 623, 312, 2, 1317, 1318, 5, 649, 325, 2, 1318, 180, 3, 2, 2, 2, 1319, 1320, 5, 625, 313, 2, 1320, 1321, 5, 631, 316, 2, 1321, 1322, 5, 637, 319, 2, 1322, 1323, 5, 623, 312, 2, 1323, 1324, 5, 625, 313, 2, 1324, 1325, 5, 643, 322, 2, 1325, 1326, 5, 649, 325, 2, 1326, 1327, 5, 639, 320, 2, 1327, 1328, 5, 615, 308, 2, 1328, 1329, 5, 653, 327, 2, 1329, 182, 3, 2, 2, 2, 1330, 1331, 5, 625, 313, 2, 1331, 1332, 5, 631, 316, 2, 1332, 1333, 5, 649, 325, 2, 1333, 1334, 5, 651, 326, 2, 1334, 1335, 5, 653, 327, 2, 1335, 184, 3, 2, 2, 2, 1336, 1337, 5, 625, 313, 2, 1337, 1338, 5, 643, 322, 2, 1338, 1339, 5, 637, 319, 2, 1339, 1340, 5, 637, 319, 2, 1340, 1341, 5, 643, 322, 2, 1341, 1342, 5, 659, 330, 2, 1342, 1343, 5, 631, 316, 2, 1343, 1344, 5, 641, 321, 2, 1344, 1345, 5, 627, 314, 2, 1345, 186, 3, 2, 2, 2, 1346, 1347, 5, 625, 313, 2, 1347, 1348, 5, 643, 322, 2, 1348, 1349, 5, 649, 325, 2, 1349, 188, 3, 2, 2, 2, 1350, 1351, 5, 625, 313, 2, 1351, 1352, 5, 643, 322, 2, 1352, 1353, 5, 649, 325, 2, 1353, 1354, 5, 623, 312, 2, 1354, 1355, 5, 631, 316, 2, 1355, 1356, 5, 627, 314, 2, 1356, 1357, 5, 641, 321, 2, 1357, 190, 3, 2, 2, 2, 1358, 1359, 5, 625, 313, 2, 1359, 1360, 5, 643, 322, 2, 1360, 1361, 5, 649, 325, 2, 1361, 1362, 5, 639, 320, 2, 1362, 1363, 5, 615, 308, 2, 1363, 1364, 5, 653, 327, 2, 1364, 192, 3, 2, 2, 2, 1365, 1366, 5, 625, 313, 2, 1366, 1367, 5, 643, 322, 2, 1367, 1368, 5, 649, 325, 2, 1368, 1369, 5, 639, 320, 2, 1369, 1370, 5, 615, 308, 2, 1370, 1371, 5, 653, 327, 2, 1371, 1372, 5, 653, 327, 2, 1372, 1373, 5, 623, 312, 2, 1373, 1374, 5, 621, 311, 2, 1374, 194, 3, 2, 2, 2, 1375, 1376, 5, 625, 313, 2, 1376, 1377, 5, 649, 325, 2, 1377, 1378, 5, 643, 322, 2, 1378, 1379, 5, 639, 320, 2, 1379, 196, 3, 2, 2, 2, 1380, 1381, 5, 625, 313, 2, 1381, 1382, 5, 655, 328, 2, 1382, 1383, 5, 637, 319, 2, 1383, 1384, 5, 637, 319, 2, 1384, 198, 3, 2, 2, 2, 1385, 1386, 5, 625, 313, 2, 1386, 1387, 5, 655, 328, 2, 1387, 1388, 5, 641, 321, 2, 1388, 1389, 5, 619, 310, 2, 1389, 1390, 5, 653, 327, 2, 1390, 1391, 5, 631, 316, 2, 1391, 1392, 5, 643, 322, 2, 1392, 1393, 5, 641, 321, 2, 1393, 200, 3, 2, 2, 2, 1394, 1395, 5, 625, 313, 2, 1395, 1396, 5, 655, 328, 2, 1396, 1397, 5, 641, 321, 2, 1397, 1398, 5, 619, 310, 2, 1398, 1399, 5, 653, 327, 2, 1399, 1400, 5, 631, 316, 2, 1400, 1401, 5, 643, 322, 2, 1401, 1402, 5, 641, 321, 2, 1402, 1403, 5, 651, 326, 2, 1403, 202, 3, 2, 2, 2, 1404, 1405, 5, 627, 314, 2, 1405, 1406, 5, 637, 319, 2, 1406, 1407, 5, 643, 322, 2, 1407, 1408, 5, 617, 309, 2, 1408, 1409, 5, 615, 308, 2, 1409, 1410, 5, 637, 319, 2, 1410, 204, 3, 2, 2, 2, 1411, 1412, 5, 627, 314, 2, 1412, 1413, 5, 649, 325, 2, 1413, 1414, 5, 615, 308, 2, 1414, 1415, 5, 641, 321, 2, 1415, 1416, 5, 653, 327, 2, 1416, 206, 3, 2, 2, 2, 1417, 1418, 5, 627, 314, 2, 1418, 1419, 5, 649, 325, 2, 1419, 1420, 5, 643, 322, 2, 1420, 1421, 5, 655, 328, 2, 1421, 1422, 5, 645, 323, 2, 1422, 208, 3, 2, 2, 2, 1423, 1424, 5, 627, 314, 2, 1424, 1425, 5, 649, 325, 2, 1425, 1426, 5, 643, 322, 2, 1426, 1427, 5, 655, 328, 2, 1427, 1428, 5, 645, 323, 2, 1428, 1429, 5, 631, 316, 2, 1429, 1430, 5, 641, 321, 2, 1430, 1431, 5, 627, 314, 2, 1431, 210, 3, 2, 2, 2, 1432, 1433, 5, 629, 315, 2, 1433, 1434, 5, 615, 308, 2, 1434, 1435, 5, 657, 329, 2, 1435, 1436, 5, 631, 316, 2, 1436, 1437, 5, 641, 321, 2, 1437, 1438, 5, 627, 314, 2, 1438, 212, 3, 2, 2, 2, 1439, 1440, 5, 629, 315, 2, 1440, 1441, 5, 643, 322, 2, 1441, 1442, 5, 655, 328, 2, 1442, 1443, 5, 649, 325, 2, 1443, 214, 3, 2, 2, 2, 1444, 1445, 5, 631, 316, 2, 1445, 1446, 5, 625, 313, 2, 1446, 216, 3, 2, 2, 2, 1447, 1448, 5, 631, 316, 2, 1448, 1449, 5, 627, 314, 2, 1449, 1450, 5, 641, 321, 2, 1450, 1451, 5, 643, 322, 2, 1451, 1452, 5, 649, 325, 2, 1452, 1453, 5, 623, 312, 2, 1453, 218, 3, 2, 2, 2, 1454, 1455, 5, 631, 316, 2, 1455, 1456, 5, 639, 320, 2, 1456, 1457, 5, 645, 323, 2, 1457, 1458, 5, 643, 322, 2, 1458, 1459, 5, 649, 325, 2, 1459, 1460, 5, 653, 327, 2, 1460, 220, 3, 2, 2, 2, 1461, 1462, 5, 631, 316, 2, 1462, 1463, 5, 641, 321, 2, 1463, 222, 3, 2, 2, 2, 1464, 1465, 5, 631, 316, 2, 1465, 1466, 5, 641, 321, 2, 1466, 1467, 5, 621, 311, 2, 1467, 1468, 5, 623, 312, 2, 1468, 1469, 5, 661, 331, 2, 1469, 224, 3, 2, 2, 2, 1470, 1471, 5, 631, 316, 2, 1471, 1472, 5, 641, 321, 2, 1472, 1473, 5, 621, 311, 2, 1473, 1474, 5, 623, 312, 2, 1474, 1475, 5, 661, 331, 2, 1475, 1476, 5, 623, 312, 2, 1476, 1477, 5, 651, 326, 2, 1477, 226, 3, 2, 2, 2, 1478, 1479, 5, 631, 316, 2, 1479, 1480, 5, 641, 321, 2, 1480, 1481, 5, 641, 321, 2, 1481, 1482, 5, 623, 312, 2, 1482, 1483, 5, 649, 325, 2, 1483, 228, 3, 2, 2, 2, 1484, 1485, 5, 631, 316, 2, 1485, 1486, 5, 641, 321, 2, 1486, 1487, 5, 645, 323, 2, 1487, 1488, 5, 615, 308, 2, 1488, 1489, 5, 653, 327, 2, 1489, 1490, 5, 629, 315, 2, 1490, 230, 3, 2, 2, 2, 1491, 1492, 5, 631, 316, 2, 1492, 1493, 5, 641, 321, 2, 1493, 1494, 5, 645, 323, 2, 1494, 1495, 5, 655, 328, 2, 1495, 1496, 5, 653, 327, 2, 1496, 1497, 5, 625, 313, 2, 1497, 1498, 5, 643, 322, 2, 1498, 1499, 5, 649, 325, 2, 1499, 1500, 5, 639, 320, 2, 1500, 1501, 5, 615, 308, 2, 1501, 1502, 5, 653, 327, 2, 1502, 232, 3, 2, 2, 2, 1503, 1504, 5, 631, 316, 2, 1504, 1505, 5, 641, 321, 2, 1505, 1506, 5, 651, 326, 2, 1506, 1507, 5, 623, 312, 2, 1507, 1508, 5, 649, 325, 2, 1508, 1509, 5, 653, 327, 2, 1509, 234, 3, 2, 2, 2, 1510, 1511, 5, 631, 316, 2, 1511, 1512, 5, 641, 321, 2, 1512, 1513, 5, 653, 327, 2, 1513, 1514, 5, 623, 312, 2, 1514, 1515, 5, 649, 325, 2, 1515, 1516, 5, 651, 326, 2, 1516, 1517, 5, 623, 312, 2, 1517, 1518, 5, 619, 310, 2, 1518, 1519, 5, 653, 327, 2, 1519, 236, 3, 2, 2, 2, 1520, 1521, 5, 631, 316, 2, 1521, 1522, 5, 641, 321, 2, 1522, 1523, 5, 653, 327, 2, 1523, 1524, 5, 623, 312, 2, 1524, 1525, 5, 649, 325, 2, 1525, 1526, 5, 657, 329, 2, 1526, 1527, 5, 615, 308, 2, 1527, 1528, 5, 637, 319, 2, 1528, 238, 3, 2, 2, 2, 1529, 1530, 5, 631, 316, 2, 1530, 1531, 5, 641, 321, 2, 1531, 1532, 5, 653, 327, 2, 1532, 1533, 5, 643, 322, 2, 1533, 240, 3, 2, 2, 2, 1534, 1535, 5, 631, 316, 2, 1535, 1536, 5, 651, 326, 2, 1536, 242, 3, 2, 2, 2, 1537, 1538, 5, 631, 316, 2, 1538, 1539, 5, 653, 327, 2, 1539, 1540, 5, 623, 312, 2, 1540, 1541, 5, 639, 320, 2, 1541, 1542, 5, 651, 326, 2, 1542, 244, 3, 2, 2, 2, 1543, 1544, 5, 633, 317, 2, 1544, 1545, 5, 643, 322, 2, 1545, 1546, 5, 631, 316, 2, 1546, 1547, 5, 641, 321, 2, 1547, 246, 3, 2, 2, 2, 1548, 1549, 5, 635, 318, 2, 1549, 1550, 5, 623, 312, 2, 1550, 1551, 5, 663, 332, 2, 1551, 1552, 5, 651, 326, 2, 1552, 248, 3, 2, 2, 2, 1553, 1554, 5, 637, 319, 2, 1554, 1555, 5, 615, 308, 2, 1555, 1556, 5, 651, 326, 2, 1556, 1557, 5, 653, 327, 2, 1557, 250, 3, 2, 2, 2, 1558, 1559, 5, 637, 319, 2, 1559, 1560, 5, 615, 308, 2, 1560, 1561, 5, 653, 327, 2, 1561, 1562, 5, 623, 312, 2, 1562, 1563, 5, 649, 325, 2, 1563, 1564, 5, 615, 308, 2, 1564, 1565, 5, 637, 319, 2, 1565, 252, 3, 2, 2, 2, 1566, 1567, 5, 637, 319, 2, 1567, 1568, 5, 615, 308, 2, 1568, 1569, 5, 665, 333, 2, 1569, 1570, 5, 663, 332, 2, 1570, 254, 3, 2, 2, 2, 1571, 1572, 5, 637, 319, 2, 1572, 1573, 5, 623, 312, 2, 1573, 1574, 5, 615, 308, 2, 1574, 1575, 5, 621, 311, 2, 1575, 1576, 5, 631, 316, 2, 1576, 1577, 5, 641, 321, 2, 1577, 1578, 5, 627, 314, 2, 1578, 256, 3, 2, 2, 2, 1579, 1580, 5, 637, 319, 2, 1580, 1581, 5, 623, 312, 2, 1581, 1582, 5, 625, 313, 2, 1582, 1583, 5, 653, 327, 2, 1583, 258, 3, 2, 2, 2, 1584, 1585, 5, 637, 319, 2, 1585, 1586, 5, 631, 316, 2, 1586, 1587, 5, 635, 318, 2, 1587, 1588, 5, 623, 312, 2, 1588, 260, 3, 2, 2, 2, 1589, 1590, 5, 637, 319, 2, 1590, 1591, 5, 631, 316, 2, 1591, 1592, 5, 639, 320, 2, 1592, 1593, 5, 631, 316, 2, 1593, 1594, 5, 653, 327, 2, 1594, 262, 3, 2, 2, 2, 1595, 1596, 5, 637, 319, 2, 1596, 1597, 5, 631, 316, 2, 1597, 1598, 5, 641, 321, 2, 1598, 1599, 5, 623, 312, 2, 1599, 1600, 5, 651, 326, 2, 1600, 264, 3, 2, 2, 2, 1601, 1602, 5, 637, 319, 2, 1602, 1603, 5, 631, 316, 2, 1603, 1604, 5, 651, 326, 2, 1604, 1605, 5, 653, 327, 2, 1605, 266, 3, 2, 2, 2, 1606, 1607, 5, 637, 319, 2, 1607, 1608, 5, 643, 322, 2, 1608, 1609, 5, 615, 308, 2, 1609, 1610, 5, 621, 311, 2, 1610, 268, 3, 2, 2, 2, 1611, 1612, 5, 637, 319, 2, 1612, 1613, 5, 643, 322, 2, 1613, 1614, 5, 619, 310, 2, 1614, 1615, 5, 615, 308, 2, 1615, 1616, 5, 637, 319, 2, 1616, 270, 3, 2, 2, 2, 1617, 1618, 5, 637, 319, 2, 1618, 1619, 5, 643, 322, 2, 1619, 1620, 5, 619, 310, 2, 1620, 1621, 5, 615, 308, 2, 1621, 1622, 5, 653, 327, 2, 1622, 1623, 5, 631, 316, 2, 1623, 1624, 5, 643, 322, 2, 1624, 1625, 5, 641, 321, 2, 1625, 272, 3, 2, 2, 2, 1626, 1627, 5, 637, 319, 2, 1627, 1628, 5, 643, 322, 2, 1628, 1629, 5, 619, 310, 2, 1629, 1630, 5, 635, 318, 2, 1630, 274, 3, 2, 2, 2, 1631, 1632, 5, 637, 319, 2, 1632, 1633, 5, 643, 322, 2, 1633, 1634, 5, 619, 310, 2, 1634, 1635, 5, 635, 318, 2, 1635, 1636, 5, 651, 326, 2, 1636, 276, 3, 2, 2, 2, 1637, 1638, 5, 637, 319, 2, 1638, 1639, 5, 643, 322, 2, 1639, 1640, 5, 627, 314, 2, 1640, 1641, 5, 631, 316, 2, 1641, 1642, 5, 619, 310, 2, 1642, 1643, 5, 615, 308, 2, 1643, 1644, 5, 637, 319, 2, 1644, 278, 3, 2, 2, 2, 1645, 1646, 5, 639, 320, 2, 1646, 1647, 5, 615, 308, 2, 1647, 1648, 5, 619, 310, 2, 1648, 1649, 5, 649, 325, 2, 1649, 1650, 5, 643, 322, 2, 1650, 280, 3, 2, 2, 2, 1651, 1652, 5, 639, 320, 2, 1652, 1653, 5, 615, 308, 2, 1653, 1654, 5, 645, 323, 2, 1654, 282, 3, 2, 2, 2, 1655, 1656, 5, 639, 320, 2, 1656, 1657, 5, 615, 308, 2, 1657, 1658, 5, 653, 327, 2, 1658, 1659, 5, 619, 310, 2, 1659, 1660, 5, 629, 315, 2, 1660, 1661, 5, 623, 312, 2, 1661, 1662, 5, 621, 311, 2, 1662, 284, 3, 2, 2, 2, 1663, 1664, 5, 639, 320, 2, 1664, 1665, 5, 623, 312, 2, 1665, 1666, 5, 649, 325, 2, 1666, 1667, 5, 627, 314, 2, 1667, 1668, 5, 623, 312, 2, 1668, 286, 3, 2, 2, 2, 1669, 1670, 5, 639, 320, 2, 1670, 1671, 5, 631, 316, 2, 1671, 1672, 5, 641, 321, 2, 1672, 1673, 5, 655, 328, 2, 1673, 1674, 5, 653, 327, 2, 1674, 1675, 5, 623, 312, 2, 1675, 288, 3, 2, 2, 2, 1676, 1677, 5, 639, 320, 2, 1677, 1678, 5, 643, 322, 2, 1678, 1679, 5, 641, 321, 2, 1679, 1680, 5, 653, 327, 2, 1680, 1681, 5, 629, 315, 2, 1681, 290, 3, 2, 2, 2, 1682, 1683, 5, 639, 320, 2, 1683, 1684, 5, 651, 326, 2, 1684, 1685, 5, 619, 310, 2, 1685, 1686, 5, 635, 318, 2, 1686, 292, 3, 2, 2, 2, 1687, 1688, 5, 641, 321, 2, 1688, 1689, 5, 615, 308, 2, 1689, 1690, 5, 639, 320, 2, 1690, 1691, 5, 623, 312, 2, 1691, 1692, 5, 651, 326, 2, 1692, 1693, 5, 645, 323, 2, 1693, 1694, 5, 615, 308, 2, 1694, 1695, 5, 619, 310, 2, 1695, 1696, 5, 623, 312, 2, 1696, 294, 3, 2, 2, 2, 1697, 1698, 5, 641, 321, 2, 1698, 1699, 5, 615, 308, 2, 1699, 1700, 5, 639, 320, 2, 1700, 1701, 5, 623, 312, 2, 1701, 1702, 5, 651, 326, 2, 1702, 1703, 5, 645, 323, 2, 1703, 1704, 5, 615, 308, 2, 1704, 1705, 5, 619, 310, 2, 1705, 1706, 5, 623, 312, 2, 1706, 1707, 5, 651, 326, 2, 1707, 296, 3, 2, 2, 2, 1708, 1709, 5, 641, 321, 2, 1709, 1710, 5, 615, 308, 2, 1710, 1711, 5, 653, 327, 2, 1711, 1712, 5, 655, 328, 2, 1712, 1713, 5, 649, 325, 2, 1713, 1714, 5, 615, 308, 2, 1714, 1715, 5, 637, 319, 2, 1715, 298, 3, 2, 2, 2, 1716, 1717, 5, 641, 321, 2, 1717, 1718, 5, 643, 322, 2, 1718, 300, 3, 2, 2, 2, 1719, 1720, 5, 641, 321, 2, 1720, 1721, 5, 643, 322, 2, 1721, 1722, 5, 653, 327, 2, 1722, 1725, 3, 2, 2, 2, 1723, 1725, 5, 573, 287, 2, 1724, 1719, 3, 2, 2, 2, 1724, 1723, 3, 2, 2, 2, 1725, 302, 3, 2, 2, 2, 1726, 1727, 5, 641, 321, 2, 1727, 1728, 5, 655, 328, 2, 1728, 1729, 5, 637, 319, 2, 1729, 1730, 5, 637, 319, 2, 1730, 304, 3, 2, 2, 2, 1731, 1732, 5, 641, 321, 2, 1732, 1733, 5, 655, 328, 2, 1733, 1734, 5, 637, 319, 2, 1734, 1735, 5, 637, 319, 2, 1735, 1736, 5, 651, 326, 2, 1736, 306, 3, 2, 2, 2, 1737, 1738, 5, 643, 322, 2, 1738, 1739, 5, 625, 313, 2, 1739, 308, 3, 2, 2, 2, 1740, 1741, 5, 643, 322, 2, 1741, 1742, 5, 625, 313, 2, 1742, 1743, 5, 625, 313, 2, 1743, 1744, 5, 651, 326, 2, 1744, 1745, 5, 623, 312, 2, 1745, 1746, 5, 653, 327, 2, 1746, 310, 3, 2, 2, 2, 1747, 1748, 5, 643, 322, 2, 1748, 1749, 5, 641, 321, 2, 1749, 312, 3, 2, 2, 2, 1750, 1751, 5, 643, 322, 2, 1751, 1752, 5, 641, 321, 2, 1752, 1753, 5, 637, 319, 2, 1753, 1754, 5, 663, 332, 2, 1754, 314, 3, 2, 2, 2, 1755, 1756, 5, 643, 322, 2, 1756, 1757, 5, 645, 323, 2, 1757, 1758, 5, 653, 327, 2, 1758, 1759, 5, 631, 316, 2, 1759, 1760, 5, 643, 322, 2, 1760, 1761, 5, 641, 321, 2, 1761, 316, 3, 2, 2, 2, 1762, 1763, 5, 643, 322, 2, 1763, 1764, 5, 645, 323, 2, 1764, 1765, 5, 653, 327, 2, 1765, 1766, 5, 631, 316, 2, 1766, 1767, 5, 643, 322, 2, 1767, 1768, 5, 641, 321, 2, 1768, 1769, 5, 651, 326, 2, 1769, 318, 3, 2, 2, 2, 1770, 1771, 5, 643, 322, 2, 1771, 1772, 5, 649, 325, 2, 1772, 320, 3, 2, 2, 2, 1773, 1774, 5, 643, 322, 2, 1774, 1775, 5, 649, 325, 2, 1775, 1776, 5, 621, 311, 2, 1776, 1777, 5, 623, 312, 2, 1777, 1778, 5, 649, 325, 2, 1778, 322, 3, 2, 2, 2, 1779, 1780, 5, 643, 322, 2, 1780, 1781, 5, 655, 328, 2, 1781, 1782, 5, 653, 327, 2, 1782, 324, 3, 2, 2, 2, 1783, 1784, 5, 643, 322, 2, 1784, 1785, 5, 655, 328, 2, 1785, 1786, 5, 653, 327, 2, 1786, 1787, 5, 623, 312, 2, 1787, 1788, 5, 649, 325, 2, 1788, 326, 3, 2, 2, 2, 1789, 1790, 5, 643, 322, 2, 1790, 1791, 5, 655, 328, 2, 1791, 1792, 5, 653, 327, 2, 1792, 1793, 5, 645, 323, 2, 1793, 1794, 5, 655, 328, 2, 1794, 1795, 5, 653, 327, 2, 1795, 1796, 5, 625, 313, 2, 1796, 1797, 5, 643, 322, 2, 1797, 1798, 5, 649, 325, 2, 1798, 1799, 5, 639, 320, 2, 1799, 1800, 5, 615, 308, 2, 1800, 1801, 5, 653, 327, 2, 1801, 328, 3, 2, 2, 2, 1802, 1803, 5, 643, 322, 2, 1803, 1804, 5, 657, 329, 2, 1804, 1805, 5, 623, 312, 2, 1805, 1806, 5, 649, 325, 2, 1806, 330, 3, 2, 2, 2, 1807, 1808, 5, 643, 322, 2, 1808, 1809, 5, 657, 329, 2, 1809, 1810, 5, 623, 312, 2, 1810, 1811, 5, 649, 325, 2, 1811, 1812, 5, 637, 319, 2, 1812, 1813, 5, 615, 308, 2, 1813, 1814, 5, 645, 323, 2, 1814, 1815, 5, 651, 326, 2, 1815, 332, 3, 2, 2, 2, 1816, 1817, 5, 643, 322, 2, 1817, 1818, 5, 657, 329, 2, 1818, 1819, 5, 623, 312, 2, 1819, 1820, 5, 649, 325, 2, 1820, 1821, 5, 637, 319, 2, 1821, 1822, 5, 615, 308, 2, 1822, 1823, 5, 663, 332, 2, 1823, 334, 3, 2, 2, 2, 1824, 1825, 5, 643, 322, 2, 1825, 1826, 5, 657, 329, 2, 1826, 1827, 5, 623, 312, 2, 1827, 1828, 5, 649, 325, 2, 1828, 1829, 5, 659, 330, 2, 1829, 1830, 5, 649, 325, 2, 1830, 1831, 5, 631, 316, 2, 1831, 1832, 5, 653, 327, 2, 1832, 1833, 5, 623, 312, 2, 1833, 336, 3, 2, 2, 2, 1834, 1835, 5, 645, 323, 2, 1835, 1836, 5, 615, 308, 2, 1836, 1837, 5, 649, 325, 2, 1837, 1838, 5, 653, 327, 2, 1838, 1839, 5, 631, 316, 2, 1839, 1840, 5, 653, 327, 2, 1840, 1841, 5, 631, 316, 2, 1841, 1842, 5, 643, 322, 2, 1842, 1843, 5, 641, 321, 2, 1843, 338, 3, 2, 2, 2, 1844, 1845, 5, 645, 323, 2, 1845, 1846, 5, 615, 308, 2, 1846, 1847, 5, 649, 325, 2, 1847, 1848, 5, 653, 327, 2, 1848, 1849, 5, 631, 316, 2, 1849, 1850, 5, 653, 327, 2, 1850, 1851, 5, 631, 316, 2, 1851, 1852, 5, 643, 322, 2, 1852, 1853, 5, 641, 321, 2, 1853, 1854, 5, 623, 312, 2, 1854, 1855, 5, 621, 311, 2, 1855, 340, 3, 2, 2, 2, 1856, 1857, 5, 645, 323, 2, 1857, 1858, 5, 615, 308, 2, 1858, 1859, 5, 649, 325, 2, 1859, 1860, 5, 653, 327, 2, 1860, 1861, 5, 631, 316, 2, 1861, 1862, 5, 653, 327, 2, 1862, 1863, 5, 631, 316, 2, 1863, 1864, 5, 643, 322, 2, 1864, 1865, 5, 641, 321, 2, 1865, 1866, 5, 651, 326, 2, 1866, 342, 3, 2, 2, 2, 1867, 1868, 5, 645, 323, 2, 1868, 1869, 5, 623, 312, 2, 1869, 1870, 5, 649, 325, 2, 1870, 1871, 5, 619, 310, 2, 1871, 1872, 5, 623, 312, 2, 1872, 1873, 5, 641, 321, 2, 1873, 1874, 5, 653, 327, 2, 1874, 344, 3, 2, 2, 2, 1875, 1876, 5, 645, 323, 2, 1876, 1877, 5, 631, 316, 2, 1877, 1878, 5, 657, 329, 2, 1878, 1879, 5, 643, 322, 2, 1879, 1880, 5, 653, 327, 2, 1880, 346, 3, 2, 2, 2, 1881, 1882, 5, 645, 323, 2, 1882, 1883, 5, 637, 319, 2, 1883, 1884, 5, 615, 308, 2, 1884, 1885, 5, 619, 310, 2, 1885, 1886, 5, 631, 316, 2, 1886, 1887, 5, 641, 321, 2, 1887, 1888, 5, 627, 314, 2, 1888, 348, 3, 2, 2, 2, 1889, 1890, 5, 645, 323, 2, 1890, 1891, 5, 643, 322, 2, 1891, 1892, 5, 651, 326, 2, 1892, 1893, 5, 631, 316, 2, 1893, 1894, 5, 653, 327, 2, 1894, 1895, 5, 631, 316, 2, 1895, 1896, 5, 643, 322, 2, 1896, 1897, 5, 641, 321, 2, 1897, 350, 3, 2, 2, 2, 1898, 1899, 5, 645, 323, 2, 1899, 1900, 5, 649, 325, 2, 1900, 1901, 5, 623, 312, 2, 1901, 1902, 5, 619, 310, 2, 1902, 1903, 5, 623, 312, 2, 1903, 1904, 5, 621, 311, 2, 1904, 1905, 5, 631, 316, 2, 1905, 1906, 5, 641, 321, 2, 1906, 1907, 5, 627, 314, 2, 1907, 352, 3, 2, 2, 2, 1908, 1909, 5, 645, 323, 2, 1909, 1910, 5, 649, 325, 2, 1910, 1911, 5, 631, 316, 2, 1911, 1912, 5, 639, 320, 2, 1912, 1913, 5, 615, 308, 2, 1913, 1914, 5, 649, 325, 2, 1914, 1915, 5, 663, 332, 2, 1915, 354, 3, 2, 2, 2, 1916, 1917, 5, 645, 323, 2, 1917, 1918, 5, 649, 325, 2, 1918, 1919, 5, 631, 316, 2, 1919, 1920, 5, 641, 321, 2, 1920, 1921, 5, 619, 310, 2, 1921, 1922, 5, 631, 316, 2, 1922, 1923, 5, 645, 323, 2, 1923, 1924, 5, 615, 308, 2, 1924, 1925, 5, 637, 319, 2, 1925, 1926, 5, 651, 326, 2, 1926, 356, 3, 2, 2, 2, 1927, 1928, 5, 645, 323, 2, 1928, 1929, 5, 649, 325, 2, 1929, 1930, 5, 643, 322, 2, 1930, 1931, 5, 645, 323, 2, 1931, 1932, 5, 623, 312, 2, 1932, 1933, 5, 649, 325, 2, 1933, 1934, 5, 653, 327, 2, 1934, 1935, 5, 631, 316, 2, 1935, 1936, 5, 623, 312, 2, 1936, 1937, 5, 651, 326, 2, 1937, 358, 3, 2, 2, 2, 1938, 1939, 5, 645, 323, 2, 1939, 1940, 5, 655, 328, 2, 1940, 1941, 5, 649, 325, 2, 1941, 1942, 5, 627, 314, 2, 1942, 1943, 5, 623, 312, 2, 1943, 360, 3, 2, 2, 2, 1944, 1945, 5, 647, 324, 2, 1945, 1946, 5, 655, 328, 2, 1946, 1947, 5, 623, 312, 2, 1947, 1948, 5, 649, 325, 2, 1948, 1949, 5, 663, 332, 2, 1949, 362, 3, 2, 2, 2, 1950, 1951, 5, 649, 325, 2, 1951, 1952, 5, 615, 308, 2, 1952, 1953, 5, 641, 321, 2, 1953, 1954, 5, 627, 314, 2, 1954, 1955, 5, 623, 312, 2, 1955, 364, 3, 2, 2, 2, 1956, 1957, 5, 649, 325, 2, 1957, 1958, 5, 623, 312, 2, 1958, 1959, 5, 619, 310, 2, 1959, 1960, 5, 643, 322, 2, 1960, 1961, 5, 649, 325, 2, 1961, 1962, 5, 621, 311, 2, 1962, 1963, 5, 649, 325, 2, 1963, 1964, 5, 623, 312, 2, 1964, 1965, 5, 615, 308, 2, 1965, 1966, 5, 621, 311, 2, 1966, 1967, 5, 623, 312, 2, 1967, 1968, 5, 649, 325, 2, 1968, 366, 3, 2, 2, 2, 1969, 1970, 5, 649, 325, 2, 1970, 1971, 5, 623, 312, 2, 1971, 1972, 5, 619, 310, 2, 1972, 1973, 5, 643, 322, 2, 1973, 1974, 5, 649, 325, 2, 1974, 1975, 5, 621, 311, 2, 1975, 1976, 5, 659, 330, 2, 1976, 1977, 5, 649, 325, 2, 1977, 1978, 5, 631, 316, 2, 1978, 1979, 5, 653, 327, 2, 1979, 1980, 5, 623, 312, 2, 1980, 1981, 5, 649, 325, 2, 1981, 368, 3, 2, 2, 2, 1982, 1983, 5, 649, 325, 2, 1983, 1984, 5, 623, 312, 2, 1984, 1985, 5, 619, 310, 2, 1985, 1986, 5, 643, 322, 2, 1986, 1987, 5, 657, 329, 2, 1987, 1988, 5, 623, 312, 2, 1988, 1989, 5, 649, 325, 2, 1989, 370, 3, 2, 2, 2, 1990, 1991, 5, 649, 325, 2, 1991, 1992, 5, 623, 312, 2, 1992, 1993, 5, 621, 311, 2, 1993, 1994, 5, 655, 328, 2, 1994, 1995, 5, 619, 310, 2, 1995, 1996, 5, 623, 312, 2, 1996, 372, 3, 2, 2, 2, 1997, 1998, 5, 649, 325, 2, 1998, 1999, 5, 623, 312, 2, 1999, 2000, 5, 625, 313, 2, 2000, 2001, 5, 623, 312, 2, 2001, 2002, 5, 649, 325, 2, 2002, 2003, 5, 623, 312, 2, 2003, 2004, 5, 641, 321, 2, 2004, 2005, 5, 619, 310, 2, 2005, 2006, 5, 623, 312, 2, 2006, 2007, 5, 651, 326, 2, 2007, 374, 3, 2, 2, 2, 2008, 2009, 5, 649, 325, 2, 2009, 2010, 5, 623, 312, 2, 2010, 2011, 5, 625, 313, 2, 2011, 2012, 5, 649, 325, 2, 2012, 2013, 5, 623, 312, 2, 2013, 2014, 5, 651, 326, 2, 2014, 2015, 5, 629, 315, 2, 2015, 376, 3, 2, 2, 2, 2016, 2017, 5, 649, 325, 2, 2017, 2018, 5, 623, 312, 2, 2018, 2019, 5, 641, 321, 2, 2019, 2020, 5, 615, 308, 2, 2020, 2021, 5, 639, 320, 2, 2021, 2022, 5, 623, 312, 2, 2022, 378, 3, 2, 2, 2, 2023, 2024, 5, 649, 325, 2, 2024, 2025, 5, 623, 312, 2, 2025, 2026, 5, 645, 323, 2, 2026, 2027, 5, 615, 308, 2, 2027, 2028, 5, 631, 316, 2, 2028, 2029, 5, 649, 325, 2, 2029, 380, 3, 2, 2, 2, 2030, 2031, 5, 649, 325, 2, 2031, 2032, 5, 623, 312, 2, 2032, 2033, 5, 645, 323, 2, 2033, 2034, 5, 637, 319, 2, 2034, 2035, 5, 615, 308, 2, 2035, 2036, 5, 619, 310, 2, 2036, 2037, 5, 623, 312, 2, 2037, 382, 3, 2, 2, 2, 2038, 2039, 5, 649, 325, 2, 2039, 2040, 5, 623, 312, 2, 2040, 2041, 5, 651, 326, 2, 2041, 2042, 5, 623, 312, 2, 2042, 2043, 5, 653, 327, 2, 2043, 384, 3, 2, 2, 2, 2044, 2045, 5, 649, 325, 2, 2045, 2046, 5, 623, 312, 2, 2046, 2047, 5, 651, 326, 2, 2047, 2048, 5, 645, 323, 2, 2048, 2049, 5, 623, 312, 2, 2049, 2050, 5, 619, 310, 2, 2050, 2051, 5, 653, 327, 2, 2051, 386, 3, 2, 2, 2, 2052, 2053, 5, 649, 325, 2, 2053, 2054, 5, 623, 312, 2, 2054, 2055, 5, 651, 326, 2, 2055, 2056, 5, 653, 327, 2, 2056, 2057, 5, 649, 325, 2, 2057, 2058, 5, 631, 316, 2, 2058, 2059, 5, 619, 310, 2, 2059, 2060, 5, 653, 327, 2, 2060, 388, 3, 2, 2, 2, 2061, 2062, 5, 649, 325, 2, 2062, 2063, 5, 623, 312, 2, 2063, 2064, 5, 657, 329, 2, 2064, 2065, 5, 643, 322, 2, 2065, 2066, 5, 635, 318, 2, 2066, 2067, 5, 623, 312, 2, 2067, 390, 3, 2, 2, 2, 2068, 2069, 5, 649, 325, 2, 2069, 2070, 5, 631, 316, 2, 2070, 2071, 5, 627, 314, 2, 2071, 2072, 5, 629, 315, 2, 2072, 2073, 5, 653, 327, 2, 2073, 392, 3, 2, 2, 2, 2074, 2075, 5, 649, 325, 2, 2075, 2076, 5, 637, 319, 2, 2076, 2077, 5, 631, 316, 2, 2077, 2078, 5, 635, 318, 2, 2078, 2079, 5, 623, 312, 2, 2079, 2088, 3, 2, 2, 2, 2080, 2081, 5, 649, 325, 2, 2081, 2082, 5, 623, 312, 2, 2082, 2083, 5, 627, 314, 2, 2083, 2084, 5, 623, 312, 2, 2084, 2085, 5, 661, 331, 2, 2085, 2086, 5, 645, 323, 2, 2086, 2088, 3, 2, 2, 2, 2087, 2074, 3, 2, 2, 2, 2087, 2080, 3, 2, 2, 2, 2088, 394, 3, 2, 2, 2, 2089, 2090, 5, 649, 325, 2, 2090, 2091, 5, 643, 322, 2, 2091, 2092, 5, 637, 319, 2, 2092, 2093, 5, 623, 312, 2, 2093, 396, 3, 2, 2, 2, 2094, 2095, 5, 649, 325, 2, 2095, 2096, 5, 643, 322, 2, 2096, 2097, 5, 637, 319, 2, 2097, 2098, 5, 623, 312, 2, 2098, 2099, 5, 651, 326, 2, 2099, 398, 3, 2, 2, 2, 2100, 2101, 5, 649, 325, 2, 2101, 2102, 5, 643, 322, 2, 2102, 2103, 5, 637, 319, 2, 2103, 2104, 5, 637, 319, 2, 2104, 2105, 5, 617, 309, 2, 2105, 2106, 5, 615, 308, 2, 2106, 2107, 5, 619, 310, 2, 2107, 2108, 5, 635, 318, 2, 2108, 400, 3, 2, 2, 2, 2109, 2110, 5, 649, 325, 2, 2110, 2111, 5, 643, 322, 2, 2111, 2112, 5, 637, 319, 2, 2112, 2113, 5, 637, 319, 2, 2113, 2114, 5, 655, 328, 2, 2114, 2115, 5, 645, 323, 2, 2115, 402, 3, 2, 2, 2, 2116, 2117, 5, 649, 325, 2, 2117, 2118, 5, 643, 322, 2, 2118, 2119, 5, 659, 330, 2, 2119, 404, 3, 2, 2, 2, 2120, 2121, 5, 649, 325, 2, 2121, 2122, 5, 643, 322, 2, 2122, 2123, 5, 659, 330, 2, 2123, 2124, 5, 651, 326, 2, 2124, 406, 3, 2, 2, 2, 2125, 2126, 5, 651, 326, 2, 2126, 2127, 5, 623, 312, 2, 2127, 2128, 5, 619, 310, 2, 2128, 2129, 5, 643, 322, 2, 2129, 2130, 5, 641, 321, 2, 2130, 2131, 5, 621, 311, 2, 2131, 408, 3, 2, 2, 2, 2132, 2133, 5, 651, 326, 2, 2133, 2134, 5, 619, 310, 2, 2134, 2135, 5, 629, 315, 2, 2135, 2136, 5, 623, 312, 2, 2136, 2137, 5, 639, 320, 2, 2137, 2138, 5, 615, 308, 2, 2138, 410, 3, 2, 2, 2, 2139, 2140, 5, 651, 326, 2, 2140, 2141, 5, 623, 312, 2, 2141, 2142, 5, 637, 319, 2, 2142, 2143, 5, 623, 312, 2, 2143, 2144, 5, 619, 310, 2, 2144, 2145, 5, 653, 327, 2, 2145, 412, 3, 2, 2, 2, 2146, 2147, 5, 651, 326, 2, 2147, 2148, 5, 623, 312, 2, 2148, 2149, 5, 639, 320, 2, 2149, 2150, 5, 631, 316, 2, 2150, 414, 3, 2, 2, 2, 2151, 2152, 5, 651, 326, 2, 2152, 2153, 5, 623, 312, 2, 2153, 2154, 5, 645, 323, 2, 2154, 2155, 5, 615, 308, 2, 2155, 2156, 5, 649, 325, 2, 2156, 2157, 5, 615, 308, 2, 2157, 2158, 5, 653, 327, 2, 2158, 2159, 5, 623, 312, 2, 2159, 2160, 5, 621, 311, 2, 2160, 416, 3, 2, 2, 2, 2161, 2162, 5, 651, 326, 2, 2162, 2163, 5, 623, 312, 2, 2163, 2164, 5, 649, 325, 2, 2164, 2165, 5, 621, 311, 2, 2165, 2166, 5, 623, 312, 2, 2166, 418, 3, 2, 2, 2, 2167, 2168, 5, 651, 326, 2, 2168, 2169, 5, 623, 312, 2, 2169, 2170, 5, 649, 325, 2, 2170, 2171, 5, 621, 311, 2, 2171, 2172, 5, 623, 312, 2, 2172, 2173, 5, 645, 323, 2, 2173, 2174, 5, 649, 325, 2, 2174, 2175, 5, 643, 322, 2, 2175, 2176, 5, 645, 323, 2, 2176, 2177, 5, 623, 312, 2, 2177, 2178, 5, 649, 325, 2, 2178, 2179, 5, 653, 327, 2, 2179, 2180, 5, 631, 316, 2, 2180, 2181, 5, 623, 312, 2, 2181, 2182, 5, 651, 326, 2, 2182, 420, 3, 2, 2, 2, 2183, 2184, 5, 651, 326, 2, 2184, 2185, 5, 623, 312, 2, 2185, 2186, 5, 651, 326, 2, 2186, 2187, 5, 651, 326, 2, 2187, 2188, 5, 631, 316, 2, 2188, 2189, 5, 643, 322, 2, 2189, 2190, 5, 641, 321, 2, 2190, 2191, 5, 571, 286, 2, 2191, 2192, 5, 655, 328, 2, 2192, 2193, 5, 651, 326, 2, 2193, 2194, 5, 623, 312, 2, 2194, 2195, 5, 649, 325, 2, 2195, 422, 3, 2, 2, 2, 2196, 2197, 5, 651, 326, 2, 2197, 2198, 5, 623, 312, 2, 2198, 2199, 5, 653, 327, 2, 2199, 424, 3, 2, 2, 2, 2200, 2201, 5, 639, 320, 2, 2201, 2202, 5, 631, 316, 2, 2202, 2203, 5, 641, 321, 2, 2203, 2204, 5, 655, 328, 2, 2204, 2205, 5, 651, 326, 2, 2205, 426, 3, 2, 2, 2, 2206, 2207, 5, 651, 326, 2, 2207, 2208, 5, 623, 312, 2, 2208, 2209, 5, 653, 327, 2, 2209, 2210, 5, 651, 326, 2, 2210, 428, 3, 2, 2, 2, 2211, 2212, 5, 651, 326, 2, 2212, 2213, 5, 629, 315, 2, 2213, 2214, 5, 643, 322, 2, 2214, 2215, 5, 659, 330, 2, 2215, 430, 3, 2, 2, 2, 2216, 2217, 5, 651, 326, 2, 2217, 2218, 5, 635, 318, 2, 2218, 2219, 5, 623, 312, 2, 2219, 2220, 5, 659, 330, 2, 2220, 2221, 5, 623, 312, 2, 2221, 2222, 5, 621, 311, 2, 2222, 432, 3, 2, 2, 2, 2223, 2224, 5, 651, 326, 2, 2224, 2225, 5, 643, 322, 2, 2225, 2226, 5, 639, 320, 2, 2226, 2227, 5, 623, 312, 2, 2227, 434, 3, 2, 2, 2, 2228, 2229, 5, 651, 326, 2, 2229, 2230, 5, 643, 322, 2, 2230, 2231, 5, 649, 325, 2, 2231, 2232, 5, 653, 327, 2, 2232, 436, 3, 2, 2, 2, 2233, 2234, 5, 651, 326, 2, 2234, 2235, 5, 643, 322, 2, 2235, 2236, 5, 649, 325, 2, 2236, 2237, 5, 653, 327, 2, 2237, 2238, 5, 623, 312, 2, 2238, 2239, 5, 621, 311, 2, 2239, 438, 3, 2, 2, 2, 2240, 2241, 5, 651, 326, 2, 2241, 2242, 5, 653, 327, 2, 2242, 2243, 5, 615, 308, 2, 2243, 2244, 5, 649, 325, 2, 2244, 2245, 5, 653, 327, 2, 2245, 440, 3, 2, 2, 2, 2246, 2247, 5, 651, 326, 2, 2247, 2248, 5, 653, 327, 2, 2248, 2249, 5, 615, 308, 2, 2249, 2250, 5, 653, 327, 2, 2250, 2251, 5, 631, 316, 2, 2251, 2252, 5, 651, 326, 2, 2252, 2253, 5, 653, 327, 2, 2253, 2254, 5, 631, 316, 2, 2254, 2255, 5, 619, 310, 2, 2255, 2256, 5, 651, 326, 2, 2256, 442, 3, 2, 2, 2, 2257, 2258, 5, 651, 326, 2, 2258, 2259, 5, 653, 327, 2, 2259, 2260, 5, 643, 322, 2, 2260, 2261, 5, 649, 325, 2, 2261, 2262, 5, 623, 312, 2, 2262, 2263, 5, 621, 311, 2, 2263, 444, 3, 2, 2, 2, 2264, 2265, 5, 651, 326, 2, 2265, 2266, 5, 653, 327, 2, 2266, 2267, 5, 649, 325, 2, 2267, 2268, 5, 615, 308, 2, 2268, 2269, 5, 653, 327, 2, 2269, 2270, 5, 631, 316, 2, 2270, 2271, 5, 625, 313, 2, 2271, 2272, 5, 663, 332, 2, 2272, 446, 3, 2, 2, 2, 2273, 2274, 5, 651, 326, 2, 2274, 2275, 5, 653, 327, 2, 2275, 2276, 5, 649, 325, 2, 2276, 2277, 5, 655, 328, 2, 2277, 2278, 5, 619, 310, 2, 2278, 2279, 5, 653, 327, 2, 2279, 448, 3, 2, 2, 2, 2280, 2281, 5, 651, 326, 2, 2281, 2282, 5, 655, 328, 2, 2282, 2283, 5, 617, 309, 2, 2283, 2284, 5, 651, 326, 2, 2284, 2285, 5, 653, 327, 2, 2285, 2286, 5, 649, 325, 2, 2286, 450, 3, 2, 2, 2, 2287, 2288, 5, 651, 326, 2, 2288, 2289, 5, 655, 328, 2, 2289, 2290, 5, 617, 309, 2, 2290, 2291, 5, 651, 326, 2, 2291, 2292, 5, 653, 327, 2, 2292, 2293, 5, 649, 325, 2, 2293, 2294, 5, 631, 316, 2, 2294, 2295, 5, 641, 321, 2, 2295, 2296, 5, 627, 314, 2, 2296, 452, 3, 2, 2, 2, 2297, 2298, 5, 651, 326, 2, 2298, 2299, 5, 663, 332, 2, 2299, 2300, 5, 641, 321, 2, 2300, 2301, 5, 619, 310, 2, 2301, 454, 3, 2, 2, 2, 2302, 2303, 5, 653, 327, 2, 2303, 2304, 5, 615, 308, 2, 2304, 2305, 5, 617, 309, 2, 2305, 2306, 5, 637, 319, 2, 2306, 2307, 5, 623, 312, 2, 2307, 456, 3, 2, 2, 2, 2308, 2309, 5, 653, 327, 2, 2309, 2310, 5, 615, 308, 2, 2310, 2311, 5, 617, 309, 2, 2311, 2312, 5, 637, 319, 2, 2312, 2313, 5, 623, 312, 2, 2313, 2314, 5, 651, 326, 2, 2314, 458, 3, 2, 2, 2, 2315, 2316, 5, 653, 327, 2, 2316, 2317, 5, 615, 308, 2, 2317, 2318, 5, 617, 309, 2, 2318, 2319, 5, 637, 319, 2, 2319, 2320, 5, 623, 312, 2, 2320, 2321, 5, 651, 326, 2, 2321, 2322, 5, 615, 308, 2, 2322, 2323, 5, 639, 320, 2, 2323, 2324, 5, 645, 323, 2, 2324, 2325, 5, 637, 319, 2, 2325, 2326, 5, 623, 312, 2, 2326, 460, 3, 2, 2, 2, 2327, 2328, 5, 653, 327, 2, 2328, 2329, 5, 617, 309, 2, 2329, 2330, 5, 637, 319, 2, 2330, 2331, 5, 645, 323, 2, 2331, 2332, 5, 649, 325, 2, 2332, 2333, 5, 643, 322, 2, 2333, 2334, 5, 645, 323, 2, 2334, 2335, 5, 623, 312, 2, 2335, 2336, 5, 649, 325, 2, 2336, 2337, 5, 653, 327, 2, 2337, 2338, 5, 631, 316, 2, 2338, 2339, 5, 623, 312, 2, 2339, 2340, 5, 651, 326, 2, 2340, 462, 3, 2, 2, 2, 2341, 2342, 5, 653, 327, 2, 2342, 2343, 5, 623, 312, 2, 2343, 2344, 5, 639, 320, 2, 2344, 2345, 5, 645, 323, 2, 2345, 2346, 5, 643, 322, 2, 2346, 2347, 5, 649, 325, 2, 2347, 2348, 5, 615, 308, 2, 2348, 2349, 5, 649, 325, 2, 2349, 2350, 5, 663, 332, 2, 2350, 2357, 3, 2, 2, 2, 2351, 2352, 5, 653, 327, 2, 2352, 2353, 5, 623, 312, 2, 2353, 2354, 5, 639, 320, 2, 2354, 2355, 5, 645, 323, 2, 2355, 2357, 3, 2, 2, 2, 2356, 2341, 3, 2, 2, 2, 2356, 2351, 3, 2, 2, 2, 2357, 464, 3, 2, 2, 2, 2358, 2359, 5, 653, 327, 2, 2359, 2360, 5, 623, 312, 2, 2360, 2361, 5, 649, 325, 2, 2361, 2362, 5, 639, 320, 2, 2362, 2363, 5, 631, 316, 2, 2363, 2364, 5, 641, 321, 2, 2364, 2365, 5, 615, 308, 2, 2365, 2366, 5, 653, 327, 2, 2366, 2367, 5, 623, 312, 2, 2367, 2368, 5, 621, 311, 2, 2368, 466, 3, 2, 2, 2, 2369, 2370, 5, 653, 327, 2, 2370, 2371, 5, 629, 315, 2, 2371, 2372, 5, 623, 312, 2, 2372, 2373, 5, 641, 321, 2, 2373, 468, 3, 2, 2, 2, 2374, 2375, 5, 653, 327, 2, 2375, 2376, 5, 631, 316, 2, 2376, 2377, 5, 639, 320, 2, 2377, 2378, 5, 623, 312, 2, 2378, 470, 3, 2, 2, 2, 2379, 2380, 5, 653, 327, 2, 2380, 2381, 5, 643, 322, 2, 2381, 472, 3, 2, 2, 2, 2382, 2383, 5, 653, 327, 2, 2383, 2384, 5, 643, 322, 2, 2384, 2385, 5, 655, 328, 2, 2385, 2386, 5, 619, 310, 2, 2386, 2387, 5, 629, 315, 2, 2387, 474, 3, 2, 2, 2, 2388, 2389, 5, 653, 327, 2, 2389, 2390, 5, 649, 325, 2, 2390, 2391, 5, 615, 308, 2, 2391, 2392, 5, 631, 316, 2, 2392, 2393, 5, 637, 319, 2, 2393, 2394, 5, 631, 316, 2, 2394, 2395, 5, 641, 321, 2, 2395, 2396, 5, 627, 314, 2, 2396, 476, 3, 2, 2, 2, 2397, 2398, 5, 653, 327, 2, 2398, 2399, 5, 649, 325, 2, 2399, 2400, 5, 615, 308, 2, 2400, 2401, 5, 641, 321, 2, 2401, 2402, 5, 651, 326, 2, 2402, 2403, 5, 615, 308, 2, 2403, 2404, 5, 619, 310, 2, 2404, 2405, 5, 653, 327, 2, 2405, 2406, 5, 631, 316, 2, 2406, 2407, 5, 643, 322, 2, 2407, 2408, 5, 641, 321, 2, 2408, 478, 3, 2, 2, 2, 2409, 2410, 5, 653, 327, 2, 2410, 2411, 5, 649, 325, 2, 2411, 2412, 5, 615, 308, 2, 2412, 2413, 5, 641, 321, 2, 2413, 2414, 5, 651, 326, 2, 2414, 2415, 5, 615, 308, 2, 2415, 2416, 5, 619, 310, 2, 2416, 2417, 5, 653, 327, 2, 2417, 2418, 5, 631, 316, 2, 2418, 2419, 5, 643, 322, 2, 2419, 2420, 5, 641, 321, 2, 2420, 2421, 5, 651, 326, 2, 2421, 480, 3, 2, 2, 2, 2422, 2423, 5, 653, 327, 2, 2423, 2424, 5, 649, 325, 2, 2424, 2425, 5, 615, 308, 2, 2425, 2426, 5, 641, 321, 2, 2426, 2427, 5, 651, 326, 2, 2427, 2428, 5, 625, 313, 2, 2428, 2429, 5, 643, 322, 2, 2429, 2430, 5, 649, 325, 2, 2430, 2431, 5, 639, 320, 2, 2431, 482, 3, 2, 2, 2, 2432, 2433, 5, 653, 327, 2, 2433, 2434, 5, 649, 325, 2, 2434, 2435, 5, 631, 316, 2, 2435, 2436, 5, 639, 320, 2, 2436, 484, 3, 2, 2, 2, 2437, 2438, 5, 653, 327, 2, 2438, 2439, 5, 649, 325, 2, 2439, 2440, 5, 655, 328, 2, 2440, 2441, 5, 623, 312, 2, 2441, 486, 3, 2, 2, 2, 2442, 2443, 5, 653, 327, 2, 2443, 2444, 5, 649, 325, 2, 2444, 2445, 5, 655, 328, 2, 2445, 2446, 5, 641, 321, 2, 2446, 2447, 5, 619, 310, 2, 2447, 2448, 5, 615, 308, 2, 2448, 2449, 5, 653, 327, 2, 2449, 2450, 5, 623, 312, 2, 2450, 488, 3, 2, 2, 2, 2451, 2452, 5, 653, 327, 2, 2452, 2453, 5, 649, 325, 2, 2453, 2454, 5, 663, 332, 2, 2454, 2455, 5, 571, 286, 2, 2455, 2456, 5, 619, 310, 2, 2456, 2457, 5, 615, 308, 2, 2457, 2458, 5, 651, 326, 2, 2458, 2459, 5, 653, 327, 2, 2459, 490, 3, 2, 2, 2, 2460, 2461, 5, 653, 327, 2, 2461, 2462, 5, 663, 332, 2, 2462, 2463, 5, 645, 323, 2, 2463, 2464, 5, 623, 312, 2, 2464, 492, 3, 2, 2, 2, 2465, 2466, 5, 655, 328, 2, 2466, 2467, 5, 641, 321, 2, 2467, 2468, 5, 615, 308, 2, 2468, 2469, 5, 649, 325, 2, 2469, 2470, 5, 619, 310, 2, 2470, 2471, 5, 629, 315, 2, 2471, 2472, 5, 631, 316, 2, 2472, 2473, 5, 657, 329, 2, 2473, 2474, 5, 623, 312, 2, 2474, 494, 3, 2, 2, 2, 2475, 2476, 5, 655, 328, 2, 2476, 2477, 5, 641, 321, 2, 2477, 2478, 5, 617, 309, 2, 2478, 2479, 5, 643, 322, 2, 2479, 2480, 5, 655, 328, 2, 2480, 2481, 5, 641, 321, 2, 2481, 2482, 5, 621, 311, 2, 2482, 2483, 5, 623, 312, 2, 2483, 2484, 5, 621, 311, 2, 2484, 496, 3, 2, 2, 2, 2485, 2486, 5, 655, 328, 2, 2486, 2487, 5, 641, 321, 2, 2487, 2488, 5, 619, 310, 2, 2488, 2489, 5, 615, 308, 2, 2489, 2490, 5, 619, 310, 2, 2490, 2491, 5, 629, 315, 2, 2491, 2492, 5, 623, 312, 2, 2492, 498, 3, 2, 2, 2, 2493, 2494, 5, 655, 328, 2, 2494, 2495, 5, 641, 321, 2, 2495, 2496, 5, 631, 316, 2, 2496, 2497, 5, 643, 322, 2, 2497, 2498, 5, 641, 321, 2, 2498, 500, 3, 2, 2, 2, 2499, 2500, 5, 655, 328, 2, 2500, 2501, 5, 641, 321, 2, 2501, 2502, 5, 631, 316, 2, 2502, 2503, 5, 647, 324, 2, 2503, 2504, 5, 655, 328, 2, 2504, 2505, 5, 623, 312, 2, 2505, 502, 3, 2, 2, 2, 2506, 2507, 5, 655, 328, 2, 2507, 2508, 5, 641, 321, 2, 2508, 2509, 5, 635, 318, 2, 2509, 2510, 5, 641, 321, 2, 2510, 2511, 5, 643, 322, 2, 2511, 2512, 5, 659, 330, 2, 2512, 2513, 5, 641, 321, 2, 2513, 504, 3, 2, 2, 2, 2514, 2515, 5, 655, 328, 2, 2515, 2516, 5, 641, 321, 2, 2516, 2517, 5, 637, 319, 2, 2517, 2518, 5, 643, 322, 2, 2518, 2519, 5, 619, 310, 2, 2519, 2520, 5, 635, 318, 2, 2520, 506, 3, 2, 2, 2, 2521, 2522, 5, 655, 328, 2, 2522, 2523, 5, 641, 321, 2, 2523, 2524, 5, 651, 326, 2, 2524, 2525, 5, 623, 312, 2, 2525, 2526, 5, 653, 327, 2, 2526, 508, 3, 2, 2, 2, 2527, 2528, 5, 655, 328, 2, 2528, 2529, 5, 645, 323, 2, 2529, 2530, 5, 621, 311, 2, 2530, 2531, 5, 615, 308, 2, 2531, 2532, 5, 653, 327, 2, 2532, 2533, 5, 623, 312, 2, 2533, 510, 3, 2, 2, 2, 2534, 2535, 5, 655, 328, 2, 2535, 2536, 5, 651, 326, 2, 2536, 2537, 5, 623, 312, 2, 2537, 512, 3, 2, 2, 2, 2538, 2539, 5, 655, 328, 2, 2539, 2540, 5, 651, 326, 2, 2540, 2541, 5, 623, 312, 2, 2541, 2542, 5, 649, 325, 2, 2542, 514, 3, 2, 2, 2, 2543, 2544, 5, 655, 328, 2, 2544, 2545, 5, 651, 326, 2, 2545, 2546, 5, 631, 316, 2, 2546, 2547, 5, 641, 321, 2, 2547, 2548, 5, 627, 314, 2, 2548, 516, 3, 2, 2, 2, 2549, 2550, 5, 657, 329, 2, 2550, 2551, 5, 615, 308, 2, 2551, 2552, 5, 637, 319, 2, 2552, 2553, 5, 655, 328, 2, 2553, 2554, 5, 623, 312, 2, 2554, 2555, 5, 651, 326, 2, 2555, 518, 3, 2, 2, 2, 2556, 2557, 5, 657, 329, 2, 2557, 2558, 5, 631, 316, 2, 2558, 2559, 5, 623, 312, 2, 2559, 2560, 5, 659, 330, 2, 2560, 520, 3, 2, 2, 2, 2561, 2562, 5, 657, 329, 2, 2562, 2563, 5, 631, 316, 2, 2563, 2564, 5, 623, 312, 2, 2564, 2565, 5, 659, 330, 2, 2565, 2566, 5, 651, 326, 2, 2566, 522, 3, 2, 2, 2, 2567, 2568, 5, 659, 330, 2, 2568, 2569, 5, 629, 315, 2, 2569, 2570, 5, 623, 312, 2, 2570, 2571, 5, 641, 321, 2, 2571, 524, 3, 2, 2, 2, 2572, 2573, 5, 659, 330, 2, 2573, 2574, 5, 629, 315, 2, 2574, 2575, 5, 623, 312, 2, 2575, 2576, 5, 649, 325, 2, 2576, 2577, 5, 623, 312, 2, 2577, 526, 3, 2, 2, 2, 2578, 2579, 5, 659, 330, 2, 2579, 2580, 5, 631, 316, 2, 2580, 2581, 5, 641, 321, 2, 2581, 2582, 5, 621, 311, 2, 2582, 2583, 5, 643, 322, 2, 2583, 2584, 5, 659, 330, 2, 2584, 528, 3, 2, 2, 2, 2585, 2586, 5, 659, 330, 2, 2586, 2587, 5, 631, 316, 2, 2587, 2588, 5, 653, 327, 2, 2588, 2589, 5, 629, 315, 2, 2589, 530, 3, 2, 2, 2, 2590, 2591, 5, 663, 332, 2, 2591, 2592, 5, 623, 312, 2, 2592, 2593, 5, 615, 308, 2, 2593, 2594, 5, 649, 325, 2, 2594, 532, 3, 2, 2, 2, 2595, 2596, 5, 665, 333, 2, 2596, 2597, 5, 643, 322, 2, 2597, 2598, 5, 641, 321, 2, 2598, 2599, 5, 623, 312, 2, 2599, 534, 3, 2, 2, 2, 2600, 2604, 7, 63, 2, 2, 2601, 2602, 7, 63, 2, 2, 2602, 2604, 7, 63, 2, 2, 2603, 2600, 3, 2, 2, 2, 2603, 2601, 3, 2, 2, 2, 2604, 536, 3, 2, 2, 2, 2605, 2606, 7, 62, 2, 2, 2606, 2607, 7, 63, 2, 2, 2607, 2608, 7, 64, 2, 2, 2608, 538, 3, 2, 2, 2, 2609, 2610, 7, 62, 2, 2, 2610, 2611, 7, 64, 2, 2, 2611, 540, 3, 2, 2, 2, 2612, 2613, 7, 35, 2, 2, 2613, 2614, 7, 63, 2, 2, 2614, 542, 3, 2, 2, 2, 2615, 2616, 7, 62, 2, 2, 2616, 544, 3, 2, 2, 2, 2617, 2618, 7, 62, 2, 2, 2618, 2622, 7, 63, 2, 2, 2619, 2620, 7, 35, 2, 2, 2620, 2622, 7, 64, 2, 2, 2621, 2617, 3, 2, 2, 2, 2621, 2619, 3, 2, 2, 2, 2622, 546, 3, 2, 2, 2, 2623, 2624, 7, 64, 2, 2, 2624, 548, 3, 2, 2, 2, 2625, 2626, 7, 64, 2, 2, 2626, 2630, 7, 63, 2, 2, 2627, 2628, 7, 35, 2, 2, 2628, 2630, 7, 62, 2, 2, 2629, 2625, 3, 2, 2, 2, 2629, 2627, 3, 2, 2, 2, 2630, 550, 3, 2, 2, 2, 2631, 2632, 7, 45, 2, 2, 2632, 552, 3, 2, 2, 2, 2633, 2634, 7, 47, 2, 2, 2634, 554, 3, 2, 2, 2, 2635, 2636, 7, 44, 2, 2, 2636, 556, 3, 2, 2, 2, 2637, 2638, 7, 49, 2, 2, 2638, 558, 3, 2, 2, 2, 2639, 2640, 7, 39, 2, 2, 2640, 560, 3, 2, 2, 2, 2641, 2642, 7, 128, 2, 2, 2642, 562, 3, 2, 2, 2, 2643, 2644, 7, 40, 2, 2, 2644, 564, 3, 2, 2, 2, 2645, 2646, 7, 126, 2, 2, 2646, 566, 3, 2, 2, 2, 2647, 2648, 7, 126, 2, 2, 2648, 2649, 7, 126, 2, 2, 2649, 568, 3, 2, 2, 2, 2650, 2651, 7, 96, 2, 2, 2651, 570, 3, 2, 2, 2, 2652, 2653, 7, 97, 2, 2, 2653, 572, 3, 2, 2, 2, 2654, 2655, 7, 35, 2, 2, 2655, 574, 3, 2, 2, 2, 2656, 2657, 7, 48, 2, 2, 2657, 576, 3, 2, 2, 2, 2658, 2659, 7, 46, 2, 2, 2659, 578, 3, 2, 2, 2, 2660, 2661, 7, 60, 2, 2, 2661, 580, 3, 2, 2, 2, 2662, 2663, 7, 61, 2, 2, 2663, 582, 3, 2, 2, 2, 2664, 2670, 7, 41, 2, 2, 2665, 2669, 10, 2, 2, 2, 2666, 2667, 7, 94, 2, 2, 2667, 2669, 11, 2, 2, 2, 2668, 2665, 3, 2, 2, 2, 2668, 2666, 3, 2, 2, 2, 2669, 2672, 3, 2, 2, 2, 2670, 2668, 3, 2, 2, 2, 2670, 2671, 3, 2, 2, 2, 2671, 2673, 3, 2, 2, 2, 2672, 2670, 3, 2, 2, 2, 2673, 2685, 7, 41, 2, 2, 2674, 2680, 7, 36, 2, 2, 2675, 2679, 10, 3, 2, 2, 2676, 2677, 7, 94, 2, 2, 2677, 2679, 11, 2, 2, 2, 2678, 2675, 3, 2, 2, 2, 2678, 2676, 3, 2, 2, 2, 2679, 2682, 3, 2, 2, 2, 2680, 2678, 3, 2, 2, 2, 2680, 2681, 3, 2, 2, 2, 2681, 2683, 3, 2, 2, 2, 2682, 2680, 3, 2, 2, 2, 2683, 2685, 7, 36, 2, 2, 2684, 2664, 3, 2, 2, 2, 2684, 2674, 3, 2, 2, 2, 2685, 584, 3, 2, 2, 2, 2686, 2688, 5, 611, 306, 2, 2687, 2686, 3, 2, 2, 2, 2688, 2689, 3, 2, 2, 2, 2689, 2687, 3, 2, 2, 2, 2689, 2690, 3, 2, 2, 2, 2690, 2691, 3, 2, 2, 2, 2691, 2692, 7, 78, 2, 2, 2692, 586, 3, 2, 2, 2, 2693, 2695, 5, 611, 306, 2, 2694, 2693, 3, 2, 2, 2, 2695, 2696, 3, 2, 2, 2, 2696, 2694, 3, 2, 2, 2, 2696, 2697, 3, 2, 2, 2, 2697, 2698, 3, 2, 2, 2, 2698, 2699, 7, 85, 2, 2, 2699, 588, 3, 2, 2, 2, 2700, 2702, 5, 611, 306, 2, 2701, 2700, 3, 2, 2, 2, 2702, 2703, 3, 2, 2, 2, 2703, 2701, 3, 2, 2, 2, 2703, 2704, 3, 2, 2, 2, 2704, 2705, 3, 2, 2, 2, 2705, 2706, 7, 91, 2, 2, 2706, 590, 3, 2, 2, 2, 2707, 2709, 5, 611, 306, 2, 2708, 2707, 3, 2, 2, 2, 2709, 2710, 3, 2, 2, 2, 2710, 2708, 3, 2, 2, 2, 2710, 2711, 3, 2, 2, 2, 2711, 592, 3, 2, 2, 2, 2712, 2714, 5, 611, 306, 2, 2713, 2712, 3, 2, 2, 2, 2714, 2715, 3, 2, 2, 2, 2715, 2713, 3, 2, 2, 2, 2715, 2716, 3, 2, 2, 2, 2716, 2717, 3, 2, 2, 2, 2717, 2718, 5, 609, 305, 2, 2718, 2724, 3, 2, 2, 2, 2719, 2720, 5, 607, 304, 2, 2720, 2721, 5, 609, 305, 2, 2721, 2722, 6, 297, 2, 2, 2722, 2724, 3, 2, 2, 2, 2723, 2713, 3, 2, 2, 2, 2723, 2719, 3, 2, 2, 2, 2724, 594, 3, 2, 2, 2, 2725, 2726, 5, 607, 304, 2, 2726, 2727, 6, 298, 3, 2, 2727, 596, 3, 2, 2, 2, 2728, 2730, 5, 611, 306, 2, 2729, 2728, 3, 2, 2, 2, 2730, 2731, 3, 2, 2, 2, 2731, 2729, 3, 2, 2, 2, 2731, 2732, 3, 2, 2, 2, 2732, 2734, 3, 2, 2, 2, 2733, 2735, 5, 609, 305, 2, 2734, 2733, 3, 2, 2, 2, 2734, 2735, 3, 2, 2, 2, 2735, 2736, 3, 2, 2, 2, 2736, 2737, 7, 72, 2, 2, 2737, 2746, 3, 2, 2, 2, 2738, 2740, 5, 607, 304, 2, 2739, 2741, 5, 609, 305, 2, 2740, 2739, 3, 2, 2, 2, 2740, 2741, 3, 2, 2, 2, 2741, 2742, 3, 2, 2, 2, 2742, 2743, 7, 72, 2, 2, 2743, 2744, 6, 299, 4, 2, 2744, 2746, 3, 2, 2, 2, 2745, 2729, 3, 2, 2, 2, 2745, 2738, 3, 2, 2, 2, 2746, 598, 3, 2, 2, 2, 2747, 2749, 5, 611, 306, 2, 2748, 2747, 3, 2, 2, 2, 2749, 2750, 3, 2, 2, 2, 2750, 2748, 3, 2, 2, 2, 2750, 2751, 3, 2, 2, 2, 2751, 2753, 3, 2, 2, 2, 2752, 2754, 5, 609, 305, 2, 2753, 2752, 3, 2, 2, 2, 2753, 2754, 3, 2, 2, 2, 2754, 2755, 3, 2, 2, 2, 2755, 2756, 7, 70, 2, 2, 2756, 2765, 3, 2, 2, 2, 2757, 2759, 5, 607, 304, 2, 2758, 2760, 5, 609, 305, 2, 2759, 2758, 3, 2, 2, 2, 2759, 2760, 3, 2, 2, 2, 2760, 2761, 3, 2, 2, 2, 2761, 2762, 7, 70, 2, 2, 2762, 2763, 6, 300, 5, 2, 2763, 2765, 3, 2, 2, 2, 2764, 2748, 3, 2, 2, 2, 2764, 2757, 3, 2, 2, 2, 2765, 600, 3, 2, 2, 2, 2766, 2768, 5, 611, 306, 2, 2767, 2766, 3, 2, 2, 2, 2768, 2769, 3, 2, 2, 2, 2769, 2767, 3, 2, 2, 2, 2769, 2770, 3, 2, 2, 2, 2770, 2772, 3, 2, 2, 2, 2771, 2773, 5, 609, 305, 2, 2772, 2771, 3, 2, 2, 2, 2772, 2773, 3, 2, 2, 2, 2773, 2774, 3, 2, 2, 2, 2774, 2775, 7, 68, 2, 2, 2775, 2776, 7, 70, 2, 2, 2776, 2787, 3, 2, 2, 2, 2777, 2779, 5, 607, 304, 2, 2778, 2780, 5, 609, 305, 2, 2779, 2778, 3, 2, 2, 2, 2779, 2780, 3, 2, 2, 2, 2780, 2781, 3, 2, 2, 2, 2781, 2782, 7, 68, 2, 2, 2782, 2783, 7, 70, 2, 2, 2783, 2784, 3, 2, 2, 2, 2784, 2785, 6, 301, 6, 2, 2785, 2787, 3, 2, 2, 2, 2786, 2767, 3, 2, 2, 2, 2786, 2777, 3, 2, 2, 2, 2787, 602, 3, 2, 2, 2, 2788, 2792, 5, 613, 307, 2, 2789, 2792, 5, 611, 306, 2, 2790, 2792, 7, 97, 2, 2, 2791, 2788, 3, 2, 2, 2, 2791, 2789, 3, 2, 2, 2, 2791, 2790, 3, 2, 2, 2, 2792, 2793, 3, 2, 2, 2, 2793, 2791, 3, 2, 2, 2, 2793, 2794, 3, 2, 2, 2, 2794, 604, 3, 2, 2, 2, 2795, 2801, 7, 98, 2, 2, 2796, 2800, 10, 4, 2, 2, 2797, 2798, 7, 98, 2, 2, 2798, 2800, 7, 98, 2, 2, 2799, 2796, 3, 2, 2, 2, 2799, 2797, 3, 2, 2, 2, 2800, 2803, 3, 2, 2, 2, 2801, 2799, 3, 2, 2, 2, 2801, 2802, 3, 2, 2, 2, 2802, 2804, 3, 2, 2, 2, 2803, 2801, 3, 2, 2, 2, 2804, 2805, 7, 98, 2, 2, 2805, 606, 3, 2, 2, 2, 2806, 2808, 5, 611, 306, 2, 2807, 2806, 3, 2, 2, 2, 2808, 2809, 3, 2, 2, 2, 2809, 2807, 3, 2, 2, 2, 2809, 2810, 3, 2, 2, 2, 2810, 2811, 3, 2, 2, 2, 2811, 2815, 7, 48, 2, 2, 2812, 2814, 5, 611, 306, 2, 2813, 2812, 3, 2, 2, 2, 2814, 2817, 3, 2, 2, 2, 2815, 2813, 3, 2, 2, 2, 2815, 2816, 3, 2, 2, 2, 2816, 2825, 3, 2, 2, 2, 2817, 2815, 3, 2, 2, 2, 2818, 2820, 7, 48, 2, 2, 2819, 2821, 5, 611, 306, 2, 2820, 2819, 3, 2, 2, 2, 2821, 2822, 3, 2, 2, 2, 2822, 2820, 3, 2, 2, 2, 2822, 2823, 3, 2, 2, 2, 2823, 2825, 3, 2, 2, 2, 2824, 2807, 3, 2, 2, 2, 2824, 2818, 3, 2, 2, 2, 2825, 608, 3, 2, 2, 2, 2826, 2828, 7, 71, 2, 2, 2827, 2829, 9, 5, 2, 2, 2828, 2827, 3, 2, 2, 2, 2828, 2829, 3, 2, 2, 2, 2829, 2831, 3, 2, 2, 2, 2830, 2832, 5, 611, 306, 2, 2831, 2830, 3, 2, 2, 2, 2832, 2833, 3, 2, 2, 2, 2833, 2831, 3, 2, 2, 2, 2833, 2834, 3, 2, 2, 2, 2834, 610, 3, 2, 2, 2, 2835, 2836, 9, 6, 2, 2, 2836, 612, 3, 2, 2, 2, 2837, 2838, 9, 7, 2, 2, 2838, 614, 3, 2, 2, 2, 2839, 2840, 9, 8, 2, 2, 2840, 616, 3, 2, 2, 2, 2841, 2842, 9, 9, 2, 2, 2842, 618, 3, 2, 2, 2, 2843, 2844, 9, 10, 2, 2, 2844, 620, 3, 2, 2, 2, 2845, 2846, 9, 11, 2, 2, 2846, 622, 3, 2, 2, 2, 2847, 2848, 9, 12, 2, 2, 2848, 624, 3, 2, 2, 2, 2849, 2850, 9, 13, 2, 2, 2850, 626, 3, 2, 2, 2, 2851, 2852, 9, 14, 2, 2, 2852, 628, 3, 2, 2, 2, 2853, 2854, 9, 15, 2, 2, 2854, 630, 3, 2, 2, 2, 2855, 2856, 9, 16, 2, 2, 2856, 632, 3, 2, 2, 2, 2857, 2858, 9, 17, 2, 2, 2858, 634, 3, 2, 2, 2, 2859, 2860, 9, 18, 2, 2, 2860, 636, 3, 2, 2, 2, 2861, 2862, 9, 19, 2, 2, 2862, 638, 3, 2, 2, 2, 2863, 2864, 9, 20, 2, 2, 2864, 640, 3, 2, 2, 2, 2865, 2866, 9, 21, 2, 2, 2866, 642, 3, 2, 2, 2, 2867, 2868, 9, 22, 2, 2, 2868, 644, 3, 2, 2, 2, 2869, 2870, 9, 23, 2, 2, 2870, 646, 3, 2, 2, 2, 2871, 2872, 9, 24, 2, 2, 2872, 648, 3, 2, 2, 2, 2873, 2874, 9, 25, 2, 2, 2874, 650, 3, 2, 2, 2, 2875, 2876, 9, 26, 2, 2, 2876, 652, 3, 2, 2, 2, 2877, 2878, 9, 27, 2, 2, 2878, 654, 3, 2, 2, 2, 2879, 2880, 9, 28, 2, 2, 2880, 656, 3, 2, 2, 2, 2881, 2882, 9, 29, 2, 2, 2882, 658, 3, 2, 2, 2, 2883, 2884, 9, 30, 2, 2, 2884, 660, 3, 2, 2, 2, 2885, 2886, 9, 31, 2, 2, 2886, 662, 3, 2, 2, 2, 2887, 2888, 9, 32, 2, 2, 2888, 664, 3, 2, 2, 2, 2889, 2890, 9, 33, 2, 2, 2890, 666, 3, 2, 2, 2, 2891, 2892, 7, 47, 2, 2, 2892, 2893, 7, 47, 2, 2, 2893, 2899, 3, 2, 2, 2, 2894, 2895, 7, 94, 2, 2, 2895, 2898, 7, 12, 2, 2, 2896, 2898, 10, 34, 2, 2, 2897, 2894, 3, 2, 2, 2, 2897, 2896, 3, 2, 2, 2, 2898, 2901, 3, 2, 2, 2, 2899, 2897, 3, 2, 2, 2, 2899, 2900, 3, 2, 2, 2, 2900, 2903, 3, 2, 2, 2, 2901, 2899, 3, 2, 2, 2, 2902, 2904, 7, 15, 2, 2, 2903, 2902, 3, 2, 2, 2, 2903, 2904, 3, 2, 2, 2, 2904, 2906, 3, 2, 2, 2, 2905, 2907, 7, 12, 2, 2, 2906, 2905, 3, 2, 2, 2, 2906, 2907, 3, 2, 2, 2, 2907, 2908, 3, 2, 2, 2, 2908, 2909, 8, 334, 2, 2, 2909, 668, 3, 2, 2, 2, 2910, 2911, 7, 49, 2, 2, 2911, 2912, 7, 44, 2, 2, 2912, 2913, 3, 2, 2, 2, 2913, 2918, 6, 335, 7, 2, 2914, 2917, 5, 669, 335, 2, 2915, 2917, 11, 2, 2, 2, 2916, 2914, 3, 2, 2, 2, 2916, 2915, 3, 2, 2, 2, 2917, 2920, 3, 2, 2, 2, 2918, 2919, 3, 2, 2, 2, 2918, 2916, 3, 2, 2, 2, 2919, 2921, 3, 2, 2, 2, 2920, 2918, 3, 2, 2, 2, 2921, 2922, 7, 44, 2, 2, 2922, 2923, 7, 49, 2, 2, 2923, 2924, 3, 2, 2, 2, 2924, 2925, 8, 335, 2, 2, 2925, 670, 3, 2, 2, 2, 2926, 2928, 9, 35, 2, 2, 2927, 2926, 3, 2, 2, 2, 2928, 2929, 3, 2, 2, 2, 2929, 2927, 3, 2, 2, 2, 2929, 2930, 3, 2, 2, 2, 2930, 2931, 3, 2, 2, 2, 2931, 2932, 8, 336, 2, 2, 2932, 672, 3, 2, 2, 2, 2933, 2934, 11, 2, 2, 2, 2934, 674, 3, 2, 2, 2, 50, 2, 1096, 1724, 2087, 2356, 2603, 2621, 2629, 2668, 2670, 2678, 2680, 2684, 2689, 2696, 2703, 2710, 2715, 2723, 2731, 2734, 2740, 2745, 2750, 2753, 2759, 2764, 2769, 2772, 2779, 2786, 2791, 2793, 2799, 2801, 2809, 2815, 2822, 2824, 2828, 2833, 2897, 2899, 2903, 2906, 2916, 2918, 2929, 3, 2, 3, 2] \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.java b/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.java new file mode 100644 index 0000000..768159b --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.java @@ -0,0 +1,1694 @@ +package io.leego.mypages.sql; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class SQLLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, ADD=8, AFTER=9, + ALL=10, ALTER=11, ANALYZE=12, AND=13, ANTI=14, ANY=15, ARCHIVE=16, ARRAY=17, + AS=18, ASC=19, AT=20, AUTHORIZATION=21, BETWEEN=22, BOTH=23, BUCKET=24, + BUCKETS=25, BY=26, CACHE=27, CASCADE=28, CASE=29, CAST=30, CHANGE=31, + CHECK=32, CLEAR=33, CLUSTER=34, CLUSTERED=35, CODEGEN=36, COLLATE=37, + COLLECTION=38, COLUMN=39, COLUMNS=40, COMMENT=41, COMMIT=42, COMPACT=43, + COMPACTIONS=44, COMPUTE=45, CONCATENATE=46, CONSTRAINT=47, COST=48, CREATE=49, + CROSS=50, CUBE=51, CURRENT=52, CURRENT_DATE=53, CURRENT_TIME=54, CURRENT_TIMESTAMP=55, + CURRENT_USER=56, DAY=57, DATA=58, DATABASE=59, DATABASES=60, DBPROPERTIES=61, + DEFINED=62, DELETE=63, DELIMITED=64, DESC=65, DESCRIBE=66, DFS=67, DIRECTORIES=68, + DIRECTORY=69, DISTINCT=70, DISTRIBUTE=71, DIV=72, DROP=73, ELSE=74, END=75, + ESCAPE=76, ESCAPED=77, EXCEPT=78, EXCHANGE=79, EXISTS=80, EXPLAIN=81, + EXPORT=82, EXTENDED=83, EXTERNAL=84, EXTRACT=85, FALSE=86, FETCH=87, FIELDS=88, + FILTER=89, FILEFORMAT=90, FIRST=91, FOLLOWING=92, FOR=93, FOREIGN=94, + FORMAT=95, FORMATTED=96, FROM=97, FULL=98, FUNCTION=99, FUNCTIONS=100, + GLOBAL=101, GRANT=102, GROUP=103, GROUPING=104, HAVING=105, HOUR=106, + IF=107, IGNORE=108, IMPORT=109, IN=110, INDEX=111, INDEXES=112, INNER=113, + INPATH=114, INPUTFORMAT=115, INSERT=116, INTERSECT=117, INTERVAL=118, + INTO=119, IS=120, ITEMS=121, JOIN=122, KEYS=123, LAST=124, LATERAL=125, + LAZY=126, LEADING=127, LEFT=128, LIKE=129, LIMIT=130, LINES=131, LIST=132, + LOAD=133, LOCAL=134, LOCATION=135, LOCK=136, LOCKS=137, LOGICAL=138, MACRO=139, + MAP=140, MATCHED=141, MERGE=142, MINUTE=143, MONTH=144, MSCK=145, NAMESPACE=146, + NAMESPACES=147, NATURAL=148, NO=149, NOT=150, NULL=151, NULLS=152, OF=153, + OFFSET=154, ON=155, ONLY=156, OPTION=157, OPTIONS=158, OR=159, ORDER=160, + OUT=161, OUTER=162, OUTPUTFORMAT=163, OVER=164, OVERLAPS=165, OVERLAY=166, + OVERWRITE=167, PARTITION=168, PARTITIONED=169, PARTITIONS=170, PERCENTLIT=171, + PIVOT=172, PLACING=173, POSITION=174, PRECEDING=175, PRIMARY=176, PRINCIPALS=177, + PROPERTIES=178, PURGE=179, QUERY=180, RANGE=181, RECORDREADER=182, RECORDWRITER=183, + RECOVER=184, REDUCE=185, REFERENCES=186, REFRESH=187, RENAME=188, REPAIR=189, + REPLACE=190, RESET=191, RESPECT=192, RESTRICT=193, REVOKE=194, RIGHT=195, + RLIKE=196, ROLE=197, ROLES=198, ROLLBACK=199, ROLLUP=200, ROW=201, ROWS=202, + SECOND=203, SCHEMA=204, SELECT=205, SEMI=206, SEPARATED=207, SERDE=208, + SERDEPROPERTIES=209, SESSION_USER=210, SET=211, SETMINUS=212, SETS=213, + SHOW=214, SKEWED=215, SOME=216, SORT=217, SORTED=218, START=219, STATISTICS=220, + STORED=221, STRATIFY=222, STRUCT=223, SUBSTR=224, SUBSTRING=225, SYNC=226, + TABLE=227, TABLES=228, TABLESAMPLE=229, TBLPROPERTIES=230, TEMPORARY=231, + TERMINATED=232, THEN=233, TIME=234, TO=235, TOUCH=236, TRAILING=237, TRANSACTION=238, + TRANSACTIONS=239, TRANSFORM=240, TRIM=241, TRUE=242, TRUNCATE=243, TRY_CAST=244, + TYPE=245, UNARCHIVE=246, UNBOUNDED=247, UNCACHE=248, UNION=249, UNIQUE=250, + UNKNOWN=251, UNLOCK=252, UNSET=253, UPDATE=254, USE=255, USER=256, USING=257, + VALUES=258, VIEW=259, VIEWS=260, WHEN=261, WHERE=262, WINDOW=263, WITH=264, + YEAR=265, ZONE=266, EQ=267, NSEQ=268, NEQ=269, NEQJ=270, LT=271, LTE=272, + GT=273, GTE=274, PLUS=275, MINUS=276, ASTERISK=277, SLASH=278, PERCENT=279, + TILDE=280, AMPERSAND=281, PIPE=282, CONCAT_PIPE=283, HAT=284, UNDERSCORE=285, + EXCLAMATION=286, POINT=287, COMMA=288, COLON=289, SEMICOLON=290, STRING=291, + BIGINT_LITERAL=292, SMALLINT_LITERAL=293, TINYINT_LITERAL=294, INTEGER_VALUE=295, + EXPONENT_VALUE=296, DECIMAL_VALUE=297, FLOAT_LITERAL=298, DOUBLE_LITERAL=299, + BIGDECIMAL_LITERAL=300, IDENTIFIER=301, BACKQUOTED_IDENTIFIER=302, SIMPLE_COMMENT=303, + BRACKETED_COMMENT=304, WS=305, UNRECOGNIZED=306; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + private static String[] makeRuleNames() { + return new String[] { + "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "ADD", "AFTER", + "ALL", "ALTER", "ANALYZE", "AND", "ANTI", "ANY", "ARCHIVE", "ARRAY", + "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", "BOTH", "BUCKET", "BUCKETS", + "BY", "CACHE", "CASCADE", "CASE", "CAST", "CHANGE", "CHECK", "CLEAR", + "CLUSTER", "CLUSTERED", "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", + "COLUMNS", "COMMENT", "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", + "CONCATENATE", "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", + "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", + "DAY", "DATA", "DATABASE", "DATABASES", "DBPROPERTIES", "DEFINED", "DELETE", + "DELIMITED", "DESC", "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", "DISTINCT", + "DISTRIBUTE", "DIV", "DROP", "ELSE", "END", "ESCAPE", "ESCAPED", "EXCEPT", + "EXCHANGE", "EXISTS", "EXPLAIN", "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", + "FALSE", "FETCH", "FIELDS", "FILTER", "FILEFORMAT", "FIRST", "FOLLOWING", + "FOR", "FOREIGN", "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", + "FUNCTIONS", "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", + "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", "INNER", "INPATH", + "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", "INTO", "IS", "ITEMS", + "JOIN", "KEYS", "LAST", "LATERAL", "LAZY", "LEADING", "LEFT", "LIKE", + "LIMIT", "LINES", "LIST", "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", + "LOGICAL", "MACRO", "MAP", "MATCHED", "MERGE", "MINUTE", "MONTH", "MSCK", + "NAMESPACE", "NAMESPACES", "NATURAL", "NO", "NOT", "NULL", "NULLS", "OF", + "OFFSET", "ON", "ONLY", "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", + "OUTPUTFORMAT", "OVER", "OVERLAPS", "OVERLAY", "OVERWRITE", "PARTITION", + "PARTITIONED", "PARTITIONS", "PERCENTLIT", "PIVOT", "PLACING", "POSITION", + "PRECEDING", "PRIMARY", "PRINCIPALS", "PROPERTIES", "PURGE", "QUERY", + "RANGE", "RECORDREADER", "RECORDWRITER", "RECOVER", "REDUCE", "REFERENCES", + "REFRESH", "RENAME", "REPAIR", "REPLACE", "RESET", "RESPECT", "RESTRICT", + "REVOKE", "RIGHT", "RLIKE", "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", + "ROWS", "SECOND", "SCHEMA", "SELECT", "SEMI", "SEPARATED", "SERDE", "SERDEPROPERTIES", + "SESSION_USER", "SET", "SETMINUS", "SETS", "SHOW", "SKEWED", "SOME", + "SORT", "SORTED", "START", "STATISTICS", "STORED", "STRATIFY", "STRUCT", + "SUBSTR", "SUBSTRING", "SYNC", "TABLE", "TABLES", "TABLESAMPLE", "TBLPROPERTIES", + "TEMPORARY", "TERMINATED", "THEN", "TIME", "TO", "TOUCH", "TRAILING", + "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", "TRUE", "TRUNCATE", + "TRY_CAST", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", "UNION", "UNIQUE", + "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", "USE", "USER", "USING", "VALUES", + "VIEW", "VIEWS", "WHEN", "WHERE", "WINDOW", "WITH", "YEAR", "ZONE", "EQ", + "NSEQ", "NEQ", "NEQJ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", "HAT", + "UNDERSCORE", "EXCLAMATION", "POINT", "COMMA", "COLON", "SEMICOLON", + "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", "TINYINT_LITERAL", "INTEGER_VALUE", + "EXPONENT_VALUE", "DECIMAL_VALUE", "FLOAT_LITERAL", "DOUBLE_LITERAL", + "BIGDECIMAL_LITERAL", "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "DECIMAL_DIGITS", + "EXPONENT", "DIGIT", "LETTER", "A", "B", "C", "D", "E", "F", "G", "H", + "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", + "W", "X", "Y", "Z", "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'('", "')'", "'/*+'", "'*/'", "'->'", "'['", "']'", null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, "'<=>'", "'<>'", "'!='", "'<'", null, + "'>'", null, "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", "'&'", "'|'", + "'||'", "'^'", "'_'", "'!'", "'.'", "','", "':'", "';'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, null, null, null, null, null, null, null, "ADD", "AFTER", "ALL", + "ALTER", "ANALYZE", "AND", "ANTI", "ANY", "ARCHIVE", "ARRAY", "AS", "ASC", + "AT", "AUTHORIZATION", "BETWEEN", "BOTH", "BUCKET", "BUCKETS", "BY", + "CACHE", "CASCADE", "CASE", "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", + "CLUSTERED", "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", + "COMMENT", "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", "CONCATENATE", + "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", "CURRENT_DATE", + "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "DAY", "DATA", "DATABASE", + "DATABASES", "DBPROPERTIES", "DEFINED", "DELETE", "DELIMITED", "DESC", + "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", "DISTINCT", "DISTRIBUTE", + "DIV", "DROP", "ELSE", "END", "ESCAPE", "ESCAPED", "EXCEPT", "EXCHANGE", + "EXISTS", "EXPLAIN", "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", "FALSE", + "FETCH", "FIELDS", "FILTER", "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", + "FOREIGN", "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", "FUNCTIONS", + "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", "IF", "IGNORE", + "IMPORT", "IN", "INDEX", "INDEXES", "INNER", "INPATH", "INPUTFORMAT", + "INSERT", "INTERSECT", "INTERVAL", "INTO", "IS", "ITEMS", "JOIN", "KEYS", + "LAST", "LATERAL", "LAZY", "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", + "LIST", "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", "MACRO", + "MAP", "MATCHED", "MERGE", "MINUTE", "MONTH", "MSCK", "NAMESPACE", "NAMESPACES", + "NATURAL", "NO", "NOT", "NULL", "NULLS", "OF", "OFFSET", "ON", "ONLY", + "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", "OUTPUTFORMAT", "OVER", + "OVERLAPS", "OVERLAY", "OVERWRITE", "PARTITION", "PARTITIONED", "PARTITIONS", + "PERCENTLIT", "PIVOT", "PLACING", "POSITION", "PRECEDING", "PRIMARY", + "PRINCIPALS", "PROPERTIES", "PURGE", "QUERY", "RANGE", "RECORDREADER", + "RECORDWRITER", "RECOVER", "REDUCE", "REFERENCES", "REFRESH", "RENAME", + "REPAIR", "REPLACE", "RESET", "RESPECT", "RESTRICT", "REVOKE", "RIGHT", + "RLIKE", "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", "SECOND", + "SCHEMA", "SELECT", "SEMI", "SEPARATED", "SERDE", "SERDEPROPERTIES", + "SESSION_USER", "SET", "SETMINUS", "SETS", "SHOW", "SKEWED", "SOME", + "SORT", "SORTED", "START", "STATISTICS", "STORED", "STRATIFY", "STRUCT", + "SUBSTR", "SUBSTRING", "SYNC", "TABLE", "TABLES", "TABLESAMPLE", "TBLPROPERTIES", + "TEMPORARY", "TERMINATED", "THEN", "TIME", "TO", "TOUCH", "TRAILING", + "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", "TRUE", "TRUNCATE", + "TRY_CAST", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", "UNION", "UNIQUE", + "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", "USE", "USER", "USING", "VALUES", + "VIEW", "VIEWS", "WHEN", "WHERE", "WINDOW", "WITH", "YEAR", "ZONE", "EQ", + "NSEQ", "NEQ", "NEQJ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", "HAT", + "UNDERSCORE", "EXCLAMATION", "POINT", "COMMA", "COLON", "SEMICOLON", + "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", "TINYINT_LITERAL", "INTEGER_VALUE", + "EXPONENT_VALUE", "DECIMAL_VALUE", "FLOAT_LITERAL", "DOUBLE_LITERAL", + "BIGDECIMAL_LITERAL", "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", + "BRACKETED_COMMENT", "WS", "UNRECOGNIZED" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + /** + * Verify whether current token is a valid decimal token (which contains dot). + * Returns true if the character that follows the token is not a digit or letter or underscore. + * + * For example: + * For char stream "2.3", "2." is not a valid decimal token, because it is followed by digit '3'. + * For char stream "2.3_", "2.3" is not a valid decimal token, because it is followed by '_'. + * For char stream "2.3W", "2.3" is not a valid decimal token, because it is followed by 'W'. + * For char stream "12.0D 34.E2+0.12 " 12.0D is a valid decimal token because it is followed + * by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' + * which is not a digit or letter or underscore. + */ + public boolean isValidDecimal() { + int nextChar = _input.LA(1); + if (nextChar >= 'A' && nextChar <= 'Z' || nextChar >= '0' && nextChar <= '9' || + nextChar == '_') { + return false; + } else { + return true; + } + } + + /** + * This method will be called when we see '/*' and try to match it as a bracketed comment. + * If the next character is '+', it should be parsed as hint later, and we cannot match + * it as a bracketed comment. + * + * Returns true if the next character is '+'. + */ + public boolean isHint() { + int nextChar = _input.LA(1); + if (nextChar == '+') { + return true; + } else { + return false; + } + } + + + public SQLLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "SQL.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 295: + return EXPONENT_VALUE_sempred((RuleContext)_localctx, predIndex); + case 296: + return DECIMAL_VALUE_sempred((RuleContext)_localctx, predIndex); + case 297: + return FLOAT_LITERAL_sempred((RuleContext)_localctx, predIndex); + case 298: + return DOUBLE_LITERAL_sempred((RuleContext)_localctx, predIndex); + case 299: + return BIGDECIMAL_LITERAL_sempred((RuleContext)_localctx, predIndex); + case 333: + return BRACKETED_COMMENT_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean EXPONENT_VALUE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return isValidDecimal(); + } + return true; + } + private boolean DECIMAL_VALUE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return isValidDecimal(); + } + return true; + } + private boolean FLOAT_LITERAL_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return isValidDecimal(); + } + return true; + } + private boolean DOUBLE_LITERAL_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 3: + return isValidDecimal(); + } + return true; + } + private boolean BIGDECIMAL_LITERAL_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 4: + return isValidDecimal(); + } + return true; + } + private boolean BRACKETED_COMMENT_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 5: + return !isHint(); + } + return true; + } + + private static final int _serializedATNSegments = 2; + private static final String _serializedATNSegment0 = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0134\u0b77\b\1\4"+ + "\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+ + "\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ + "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ + "\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+ + " \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+ + "+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+ + "\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t"+ + "=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4"+ + "I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\t"+ + "T\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_"+ + "\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k"+ + "\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv"+ + "\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t"+ + "\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+ + "\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089"+ + "\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+ + "\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092"+ + "\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096"+ + "\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b"+ + "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+ + "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ + "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ + "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+ + "\t\u00ad\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1"+ + "\4\u00b2\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6"+ + "\t\u00b6\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\4\u00ba\t\u00ba"+ + "\4\u00bb\t\u00bb\4\u00bc\t\u00bc\4\u00bd\t\u00bd\4\u00be\t\u00be\4\u00bf"+ + "\t\u00bf\4\u00c0\t\u00c0\4\u00c1\t\u00c1\4\u00c2\t\u00c2\4\u00c3\t\u00c3"+ + "\4\u00c4\t\u00c4\4\u00c5\t\u00c5\4\u00c6\t\u00c6\4\u00c7\t\u00c7\4\u00c8"+ + "\t\u00c8\4\u00c9\t\u00c9\4\u00ca\t\u00ca\4\u00cb\t\u00cb\4\u00cc\t\u00cc"+ + "\4\u00cd\t\u00cd\4\u00ce\t\u00ce\4\u00cf\t\u00cf\4\u00d0\t\u00d0\4\u00d1"+ + "\t\u00d1\4\u00d2\t\u00d2\4\u00d3\t\u00d3\4\u00d4\t\u00d4\4\u00d5\t\u00d5"+ + "\4\u00d6\t\u00d6\4\u00d7\t\u00d7\4\u00d8\t\u00d8\4\u00d9\t\u00d9\4\u00da"+ + "\t\u00da\4\u00db\t\u00db\4\u00dc\t\u00dc\4\u00dd\t\u00dd\4\u00de\t\u00de"+ + "\4\u00df\t\u00df\4\u00e0\t\u00e0\4\u00e1\t\u00e1\4\u00e2\t\u00e2\4\u00e3"+ + "\t\u00e3\4\u00e4\t\u00e4\4\u00e5\t\u00e5\4\u00e6\t\u00e6\4\u00e7\t\u00e7"+ + "\4\u00e8\t\u00e8\4\u00e9\t\u00e9\4\u00ea\t\u00ea\4\u00eb\t\u00eb\4\u00ec"+ + "\t\u00ec\4\u00ed\t\u00ed\4\u00ee\t\u00ee\4\u00ef\t\u00ef\4\u00f0\t\u00f0"+ + "\4\u00f1\t\u00f1\4\u00f2\t\u00f2\4\u00f3\t\u00f3\4\u00f4\t\u00f4\4\u00f5"+ + "\t\u00f5\4\u00f6\t\u00f6\4\u00f7\t\u00f7\4\u00f8\t\u00f8\4\u00f9\t\u00f9"+ + "\4\u00fa\t\u00fa\4\u00fb\t\u00fb\4\u00fc\t\u00fc\4\u00fd\t\u00fd\4\u00fe"+ + "\t\u00fe\4\u00ff\t\u00ff\4\u0100\t\u0100\4\u0101\t\u0101\4\u0102\t\u0102"+ + "\4\u0103\t\u0103\4\u0104\t\u0104\4\u0105\t\u0105\4\u0106\t\u0106\4\u0107"+ + "\t\u0107\4\u0108\t\u0108\4\u0109\t\u0109\4\u010a\t\u010a\4\u010b\t\u010b"+ + "\4\u010c\t\u010c\4\u010d\t\u010d\4\u010e\t\u010e\4\u010f\t\u010f\4\u0110"+ + "\t\u0110\4\u0111\t\u0111\4\u0112\t\u0112\4\u0113\t\u0113\4\u0114\t\u0114"+ + "\4\u0115\t\u0115\4\u0116\t\u0116\4\u0117\t\u0117\4\u0118\t\u0118\4\u0119"+ + "\t\u0119\4\u011a\t\u011a\4\u011b\t\u011b\4\u011c\t\u011c\4\u011d\t\u011d"+ + "\4\u011e\t\u011e\4\u011f\t\u011f\4\u0120\t\u0120\4\u0121\t\u0121\4\u0122"+ + "\t\u0122\4\u0123\t\u0123\4\u0124\t\u0124\4\u0125\t\u0125\4\u0126\t\u0126"+ + "\4\u0127\t\u0127\4\u0128\t\u0128\4\u0129\t\u0129\4\u012a\t\u012a\4\u012b"+ + "\t\u012b\4\u012c\t\u012c\4\u012d\t\u012d\4\u012e\t\u012e\4\u012f\t\u012f"+ + "\4\u0130\t\u0130\4\u0131\t\u0131\4\u0132\t\u0132\4\u0133\t\u0133\4\u0134"+ + "\t\u0134\4\u0135\t\u0135\4\u0136\t\u0136\4\u0137\t\u0137\4\u0138\t\u0138"+ + "\4\u0139\t\u0139\4\u013a\t\u013a\4\u013b\t\u013b\4\u013c\t\u013c\4\u013d"+ + "\t\u013d\4\u013e\t\u013e\4\u013f\t\u013f\4\u0140\t\u0140\4\u0141\t\u0141"+ + "\4\u0142\t\u0142\4\u0143\t\u0143\4\u0144\t\u0144\4\u0145\t\u0145\4\u0146"+ + "\t\u0146\4\u0147\t\u0147\4\u0148\t\u0148\4\u0149\t\u0149\4\u014a\t\u014a"+ + "\4\u014b\t\u014b\4\u014c\t\u014c\4\u014d\t\u014d\4\u014e\t\u014e\4\u014f"+ + "\t\u014f\4\u0150\t\u0150\4\u0151\t\u0151\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3"+ + "\4\3\5\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n"+ + "\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3"+ + "\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3"+ + "\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3"+ + "\22\3\22\3\22\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\26\3"+ + "\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3"+ + "\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3"+ + "\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3"+ + "\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3"+ + "\35\3\35\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3"+ + " \3 \3 \3 \3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3"+ + "#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3%\3&\3&\3"+ + "&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3("+ + "\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+"+ + "\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-"+ + "\3-\3.\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3\60\3"+ + "\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3"+ + "\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3"+ + "\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3"+ + "\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3"+ + "\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\3"+ + "8\38\38\38\38\38\38\38\38\38\38\38\38\39\39\39\39\39\39\39\39\39\39\3"+ + "9\39\39\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3<\3=\3=\3"+ + "=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\5=\u0449\n=\3>\3>\3>\3"+ + ">\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3"+ + "@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3"+ + "C\3C\3C\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3"+ + "F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3"+ + "H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3M\3M\3"+ + "M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3"+ + "S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3U\3"+ + "V\3V\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3"+ + "Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3\\\3"+ + "\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_"+ + "\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b"+ + "\3b\3b\3b\3b\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e"+ + "\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h"+ + "\3h\3i\3i\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l"+ + "\3l\3l\3m\3m\3m\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3p\3p\3p\3p"+ + "\3p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3s\3s"+ + "\3t\3t\3t\3t\3t\3t\3t\3t\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v\3v"+ + "\3v\3v\3v\3v\3v\3v\3w\3w\3w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3y\3y\3y"+ + "\3z\3z\3z\3z\3z\3z\3{\3{\3{\3{\3{\3|\3|\3|\3|\3|\3}\3}\3}\3}\3}\3~\3~"+ + "\3~\3~\3~\3~\3~\3~\3\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080"+ + "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081"+ + "\3\u0081\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083"+ + "\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084"+ + "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086"+ + "\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088"+ + "\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ + "\3\u0089\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a"+ + "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008c"+ + "\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d"+ + "\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f"+ + "\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090"+ + "\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091"+ + "\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093"+ + "\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094"+ + "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+ + "\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096"+ + "\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u06bd\n\u0097"+ + "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099"+ + "\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b"+ + "\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d"+ + "\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u00a0"+ + "\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2"+ + "\3\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3"+ + "\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4"+ + "\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5"+ + "\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6"+ + "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8"+ + "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8"+ + "\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+ + "\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa"+ + "\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab"+ + "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac"+ + "\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad"+ + "\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae"+ + "\3\u00ae\3\u00af\3\u00af\3\u00af\3\u00af\3\u00af\3\u00af\3\u00af\3\u00af"+ + "\3\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0"+ + "\3\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1"+ + "\3\u00b1\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2"+ + "\3\u00b2\3\u00b2\3\u00b2\3\u00b3\3\u00b3\3\u00b3\3\u00b3\3\u00b3\3\u00b3"+ + "\3\u00b3\3\u00b3\3\u00b3\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\3\u00b4"+ + "\3\u00b4\3\u00b4\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b6"+ + "\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7\3\u00b7\3\u00b7"+ + "\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b7"+ + "\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8"+ + "\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9"+ + "\3\u00b9\3\u00b9\3\u00b9\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba"+ + "\3\u00ba\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb"+ + "\3\u00bb\3\u00bb\3\u00bb\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc"+ + "\3\u00bc\3\u00bc\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd"+ + "\3\u00be\3\u00be\3\u00be\3\u00be\3\u00be\3\u00be\3\u00be\3\u00bf\3\u00bf"+ + "\3\u00bf\3\u00bf\3\u00bf\3\u00bf\3\u00bf\3\u00bf\3\u00c0\3\u00c0\3\u00c0"+ + "\3\u00c0\3\u00c0\3\u00c0\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c1"+ + "\3\u00c1\3\u00c1\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c2"+ + "\3\u00c2\3\u00c2\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3"+ + "\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c5\3\u00c5\3\u00c5"+ + "\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5"+ + "\3\u00c5\5\u00c5\u0828\n\u00c5\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6"+ + "\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c8\3\u00c8\3\u00c8"+ + "\3\u00c8\3\u00c8\3\u00c8\3\u00c8\3\u00c8\3\u00c8\3\u00c9\3\u00c9\3\u00c9"+ + "\3\u00c9\3\u00c9\3\u00c9\3\u00c9\3\u00ca\3\u00ca\3\u00ca\3\u00ca\3\u00cb"+ + "\3\u00cb\3\u00cb\3\u00cb\3\u00cb\3\u00cc\3\u00cc\3\u00cc\3\u00cc\3\u00cc"+ + "\3\u00cc\3\u00cc\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd"+ + "\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00cf\3\u00cf"+ + "\3\u00cf\3\u00cf\3\u00cf\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0"+ + "\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d1"+ + "\3\u00d1\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2"+ + "\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d3"+ + "\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3"+ + "\3\u00d3\3\u00d3\3\u00d3\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d5\3\u00d5"+ + "\3\u00d5\3\u00d5\3\u00d5\3\u00d5\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6"+ + "\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d8\3\u00d8\3\u00d8\3\u00d8"+ + "\3\u00d8\3\u00d8\3\u00d8\3\u00d9\3\u00d9\3\u00d9\3\u00d9\3\u00d9\3\u00da"+ + "\3\u00da\3\u00da\3\u00da\3\u00da\3\u00db\3\u00db\3\u00db\3\u00db\3\u00db"+ + "\3\u00db\3\u00db\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dd"+ + "\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd"+ + "\3\u00dd\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de\3\u00df"+ + "\3\u00df\3\u00df\3\u00df\3\u00df\3\u00df\3\u00df\3\u00df\3\u00df\3\u00e0"+ + "\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e1\3\u00e1\3\u00e1"+ + "\3\u00e1\3\u00e1\3\u00e1\3\u00e1\3\u00e2\3\u00e2\3\u00e2\3\u00e2\3\u00e2"+ + "\3\u00e2\3\u00e2\3\u00e2\3\u00e2\3\u00e2\3\u00e3\3\u00e3\3\u00e3\3\u00e3"+ + "\3\u00e3\3\u00e4\3\u00e4\3\u00e4\3\u00e4\3\u00e4\3\u00e4\3\u00e5\3\u00e5"+ + "\3\u00e5\3\u00e5\3\u00e5\3\u00e5\3\u00e5\3\u00e6\3\u00e6\3\u00e6\3\u00e6"+ + "\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e7"+ + "\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7"+ + "\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8"+ + "\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8"+ + "\3\u00e8\5\u00e8\u0935\n\u00e8\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9"+ + "\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00ea\3\u00ea\3\u00ea"+ + "\3\u00ea\3\u00ea\3\u00eb\3\u00eb\3\u00eb\3\u00eb\3\u00eb\3\u00ec\3\u00ec"+ + "\3\u00ec\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ee\3\u00ee"+ + "\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ef\3\u00ef"+ + "\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef"+ + "\3\u00ef\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0"+ + "\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f1\3\u00f1\3\u00f1\3\u00f1"+ + "\3\u00f1\3\u00f1\3\u00f1\3\u00f1\3\u00f1\3\u00f1\3\u00f2\3\u00f2\3\u00f2"+ + "\3\u00f2\3\u00f2\3\u00f3\3\u00f3\3\u00f3\3\u00f3\3\u00f3\3\u00f4\3\u00f4"+ + "\3\u00f4\3\u00f4\3\u00f4\3\u00f4\3\u00f4\3\u00f4\3\u00f4\3\u00f5\3\u00f5"+ + "\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f6\3\u00f6"+ + "\3\u00f6\3\u00f6\3\u00f6\3\u00f7\3\u00f7\3\u00f7\3\u00f7\3\u00f7\3\u00f7"+ + "\3\u00f7\3\u00f7\3\u00f7\3\u00f7\3\u00f8\3\u00f8\3\u00f8\3\u00f8\3\u00f8"+ + "\3\u00f8\3\u00f8\3\u00f8\3\u00f8\3\u00f8\3\u00f9\3\u00f9\3\u00f9\3\u00f9"+ + "\3\u00f9\3\u00f9\3\u00f9\3\u00f9\3\u00fa\3\u00fa\3\u00fa\3\u00fa\3\u00fa"+ + "\3\u00fa\3\u00fb\3\u00fb\3\u00fb\3\u00fb\3\u00fb\3\u00fb\3\u00fb\3\u00fc"+ + "\3\u00fc\3\u00fc\3\u00fc\3\u00fc\3\u00fc\3\u00fc\3\u00fc\3\u00fd\3\u00fd"+ + "\3\u00fd\3\u00fd\3\u00fd\3\u00fd\3\u00fd\3\u00fe\3\u00fe\3\u00fe\3\u00fe"+ + "\3\u00fe\3\u00fe\3\u00ff\3\u00ff\3\u00ff\3\u00ff\3\u00ff\3\u00ff\3\u00ff"+ + "\3\u0100\3\u0100\3\u0100\3\u0100\3\u0101\3\u0101\3\u0101\3\u0101\3\u0101"+ + "\3\u0102\3\u0102\3\u0102\3\u0102\3\u0102\3\u0102\3\u0103\3\u0103\3\u0103"+ + "\3\u0103\3\u0103\3\u0103\3\u0103\3\u0104\3\u0104\3\u0104\3\u0104\3\u0104"+ + "\3\u0105\3\u0105\3\u0105\3\u0105\3\u0105\3\u0105\3\u0106\3\u0106\3\u0106"+ + "\3\u0106\3\u0106\3\u0107\3\u0107\3\u0107\3\u0107\3\u0107\3\u0107\3\u0108"+ + "\3\u0108\3\u0108\3\u0108\3\u0108\3\u0108\3\u0108\3\u0109\3\u0109\3\u0109"+ + "\3\u0109\3\u0109\3\u010a\3\u010a\3\u010a\3\u010a\3\u010a\3\u010b\3\u010b"+ + "\3\u010b\3\u010b\3\u010b\3\u010c\3\u010c\3\u010c\5\u010c\u0a2c\n\u010c"+ + "\3\u010d\3\u010d\3\u010d\3\u010d\3\u010e\3\u010e\3\u010e\3\u010f\3\u010f"+ + "\3\u010f\3\u0110\3\u0110\3\u0111\3\u0111\3\u0111\3\u0111\5\u0111\u0a3e"+ + "\n\u0111\3\u0112\3\u0112\3\u0113\3\u0113\3\u0113\3\u0113\5\u0113\u0a46"+ + "\n\u0113\3\u0114\3\u0114\3\u0115\3\u0115\3\u0116\3\u0116\3\u0117\3\u0117"+ + "\3\u0118\3\u0118\3\u0119\3\u0119\3\u011a\3\u011a\3\u011b\3\u011b\3\u011c"+ + "\3\u011c\3\u011c\3\u011d\3\u011d\3\u011e\3\u011e\3\u011f\3\u011f\3\u0120"+ + "\3\u0120\3\u0121\3\u0121\3\u0122\3\u0122\3\u0123\3\u0123\3\u0124\3\u0124"+ + "\3\u0124\3\u0124\7\u0124\u0a6d\n\u0124\f\u0124\16\u0124\u0a70\13\u0124"+ + "\3\u0124\3\u0124\3\u0124\3\u0124\3\u0124\7\u0124\u0a77\n\u0124\f\u0124"+ + "\16\u0124\u0a7a\13\u0124\3\u0124\5\u0124\u0a7d\n\u0124\3\u0125\6\u0125"+ + "\u0a80\n\u0125\r\u0125\16\u0125\u0a81\3\u0125\3\u0125\3\u0126\6\u0126"+ + "\u0a87\n\u0126\r\u0126\16\u0126\u0a88\3\u0126\3\u0126\3\u0127\6\u0127"+ + "\u0a8e\n\u0127\r\u0127\16\u0127\u0a8f\3\u0127\3\u0127\3\u0128\6\u0128"+ + "\u0a95\n\u0128\r\u0128\16\u0128\u0a96\3\u0129\6\u0129\u0a9a\n\u0129\r"+ + "\u0129\16\u0129\u0a9b\3\u0129\3\u0129\3\u0129\3\u0129\3\u0129\3\u0129"+ + "\5\u0129\u0aa4\n\u0129\3\u012a\3\u012a\3\u012a\3\u012b\6\u012b\u0aaa\n"+ + "\u012b\r\u012b\16\u012b\u0aab\3\u012b\5\u012b\u0aaf\n\u012b\3\u012b\3"+ + "\u012b\3\u012b\3\u012b\5\u012b\u0ab5\n\u012b\3\u012b\3\u012b\3\u012b\5"+ + "\u012b\u0aba\n\u012b\3\u012c\6\u012c\u0abd\n\u012c\r\u012c\16\u012c\u0abe"+ + "\3\u012c\5\u012c\u0ac2\n\u012c\3\u012c\3\u012c\3\u012c\3\u012c\5\u012c"+ + "\u0ac8\n\u012c\3\u012c\3\u012c\3\u012c\5\u012c\u0acd\n\u012c\3\u012d\6"+ + "\u012d\u0ad0\n\u012d\r\u012d\16\u012d\u0ad1\3\u012d\5\u012d\u0ad5\n\u012d"+ + "\3\u012d\3\u012d\3\u012d\3\u012d\3\u012d\5\u012d\u0adc\n\u012d\3\u012d"+ + "\3\u012d\3\u012d\3\u012d\3\u012d\5\u012d\u0ae3\n\u012d\3\u012e\3\u012e"+ + "\3\u012e\6\u012e\u0ae8\n\u012e\r\u012e\16\u012e\u0ae9\3\u012f\3\u012f"+ + "\3\u012f\3\u012f\7\u012f\u0af0\n\u012f\f\u012f\16\u012f\u0af3\13\u012f"+ + "\3\u012f\3\u012f\3\u0130\6\u0130\u0af8\n\u0130\r\u0130\16\u0130\u0af9"+ + "\3\u0130\3\u0130\7\u0130\u0afe\n\u0130\f\u0130\16\u0130\u0b01\13\u0130"+ + "\3\u0130\3\u0130\6\u0130\u0b05\n\u0130\r\u0130\16\u0130\u0b06\5\u0130"+ + "\u0b09\n\u0130\3\u0131\3\u0131\5\u0131\u0b0d\n\u0131\3\u0131\6\u0131\u0b10"+ + "\n\u0131\r\u0131\16\u0131\u0b11\3\u0132\3\u0132\3\u0133\3\u0133\3\u0134"+ + "\3\u0134\3\u0135\3\u0135\3\u0136\3\u0136\3\u0137\3\u0137\3\u0138\3\u0138"+ + "\3\u0139\3\u0139\3\u013a\3\u013a\3\u013b\3\u013b\3\u013c\3\u013c\3\u013d"+ + "\3\u013d\3\u013e\3\u013e\3\u013f\3\u013f\3\u0140\3\u0140\3\u0141\3\u0141"+ + "\3\u0142\3\u0142\3\u0143\3\u0143\3\u0144\3\u0144\3\u0145\3\u0145\3\u0146"+ + "\3\u0146\3\u0147\3\u0147\3\u0148\3\u0148\3\u0149\3\u0149\3\u014a\3\u014a"+ + "\3\u014b\3\u014b\3\u014c\3\u014c\3\u014d\3\u014d\3\u014e\3\u014e\3\u014e"+ + "\3\u014e\3\u014e\3\u014e\7\u014e\u0b52\n\u014e\f\u014e\16\u014e\u0b55"+ + "\13\u014e\3\u014e\5\u014e\u0b58\n\u014e\3\u014e\5\u014e\u0b5b\n\u014e"+ + "\3\u014e\3\u014e\3\u014f\3\u014f\3\u014f\3\u014f\3\u014f\3\u014f\7\u014f"+ + "\u0b65\n\u014f\f\u014f\16\u014f\u0b68\13\u014f\3\u014f\3\u014f\3\u014f"+ + "\3\u014f\3\u014f\3\u0150\6\u0150\u0b70\n\u0150\r\u0150\16\u0150\u0b71"+ + "\3\u0150\3\u0150\3\u0151\3\u0151\3\u0b66\2\u0152\3\3\5\4\7\5\t\6\13\7"+ + "\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25"+ + ")\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O"+ + ")Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081"+ + "B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095"+ + "L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9"+ + "V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd"+ + "`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1"+ + "j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5"+ + "t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9"+ + "~\u00fb\177\u00fd\u0080\u00ff\u0081\u0101\u0082\u0103\u0083\u0105\u0084"+ + "\u0107\u0085\u0109\u0086\u010b\u0087\u010d\u0088\u010f\u0089\u0111\u008a"+ + "\u0113\u008b\u0115\u008c\u0117\u008d\u0119\u008e\u011b\u008f\u011d\u0090"+ + "\u011f\u0091\u0121\u0092\u0123\u0093\u0125\u0094\u0127\u0095\u0129\u0096"+ + "\u012b\u0097\u012d\u0098\u012f\u0099\u0131\u009a\u0133\u009b\u0135\u009c"+ + "\u0137\u009d\u0139\u009e\u013b\u009f\u013d\u00a0\u013f\u00a1\u0141\u00a2"+ + "\u0143\u00a3\u0145\u00a4\u0147\u00a5\u0149\u00a6\u014b\u00a7\u014d\u00a8"+ + "\u014f\u00a9\u0151\u00aa\u0153\u00ab\u0155\u00ac\u0157\u00ad\u0159\u00ae"+ + "\u015b\u00af\u015d\u00b0\u015f\u00b1\u0161\u00b2\u0163\u00b3\u0165\u00b4"+ + "\u0167\u00b5\u0169\u00b6\u016b\u00b7\u016d\u00b8\u016f\u00b9\u0171\u00ba"+ + "\u0173\u00bb\u0175\u00bc\u0177\u00bd\u0179\u00be\u017b\u00bf\u017d\u00c0"+ + "\u017f\u00c1\u0181\u00c2\u0183\u00c3\u0185\u00c4\u0187\u00c5\u0189\u00c6"+ + "\u018b\u00c7\u018d\u00c8\u018f\u00c9\u0191\u00ca\u0193\u00cb\u0195\u00cc"+ + "\u0197\u00cd\u0199\u00ce\u019b\u00cf\u019d\u00d0\u019f\u00d1\u01a1\u00d2"+ + "\u01a3\u00d3\u01a5\u00d4\u01a7\u00d5\u01a9\u00d6\u01ab\u00d7\u01ad\u00d8"+ + "\u01af\u00d9\u01b1\u00da\u01b3\u00db\u01b5\u00dc\u01b7\u00dd\u01b9\u00de"+ + "\u01bb\u00df\u01bd\u00e0\u01bf\u00e1\u01c1\u00e2\u01c3\u00e3\u01c5\u00e4"+ + "\u01c7\u00e5\u01c9\u00e6\u01cb\u00e7\u01cd\u00e8\u01cf\u00e9\u01d1\u00ea"+ + "\u01d3\u00eb\u01d5\u00ec\u01d7\u00ed\u01d9\u00ee\u01db\u00ef\u01dd\u00f0"+ + "\u01df\u00f1\u01e1\u00f2\u01e3\u00f3\u01e5\u00f4\u01e7\u00f5\u01e9\u00f6"+ + "\u01eb\u00f7\u01ed\u00f8\u01ef\u00f9\u01f1\u00fa\u01f3\u00fb\u01f5\u00fc"+ + "\u01f7\u00fd\u01f9\u00fe\u01fb\u00ff\u01fd\u0100\u01ff\u0101\u0201\u0102"+ + "\u0203\u0103\u0205\u0104\u0207\u0105\u0209\u0106\u020b\u0107\u020d\u0108"+ + "\u020f\u0109\u0211\u010a\u0213\u010b\u0215\u010c\u0217\u010d\u0219\u010e"+ + "\u021b\u010f\u021d\u0110\u021f\u0111\u0221\u0112\u0223\u0113\u0225\u0114"+ + "\u0227\u0115\u0229\u0116\u022b\u0117\u022d\u0118\u022f\u0119\u0231\u011a"+ + "\u0233\u011b\u0235\u011c\u0237\u011d\u0239\u011e\u023b\u011f\u023d\u0120"+ + "\u023f\u0121\u0241\u0122\u0243\u0123\u0245\u0124\u0247\u0125\u0249\u0126"+ + "\u024b\u0127\u024d\u0128\u024f\u0129\u0251\u012a\u0253\u012b\u0255\u012c"+ + "\u0257\u012d\u0259\u012e\u025b\u012f\u025d\u0130\u025f\2\u0261\2\u0263"+ + "\2\u0265\2\u0267\2\u0269\2\u026b\2\u026d\2\u026f\2\u0271\2\u0273\2\u0275"+ + "\2\u0277\2\u0279\2\u027b\2\u027d\2\u027f\2\u0281\2\u0283\2\u0285\2\u0287"+ + "\2\u0289\2\u028b\2\u028d\2\u028f\2\u0291\2\u0293\2\u0295\2\u0297\2\u0299"+ + "\2\u029b\u0131\u029d\u0132\u029f\u0133\u02a1\u0134\3\2$\4\2))^^\4\2$$"+ + "^^\3\2bb\4\2--//\3\2\62;\4\2C\\c|\4\2CCcc\4\2DDdd\4\2EEee\4\2FFff\4\2"+ + "GGgg\4\2HHhh\4\2IIii\4\2JJjj\4\2KKkk\4\2LLll\4\2MMmm\4\2NNnn\4\2OOoo\4"+ + "\2PPpp\4\2QQqq\4\2RRrr\4\2SSss\4\2TTtt\4\2UUuu\4\2VVvv\4\2WWww\4\2XXx"+ + "x\4\2YYyy\4\2ZZzz\4\2[[{{\4\2\\\\||\4\2\f\f\17\17\5\2\13\f\17\17\"\"\2"+ + "\u0b88\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2"+ + "\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3"+ + "\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2"+ + "\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2"+ + "/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2"+ + "\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2"+ + "G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3"+ + "\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2"+ + "\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2"+ + "m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3"+ + "\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2"+ + "\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2"+ + "\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095"+ + "\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2"+ + "\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7"+ + "\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2"+ + "\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9"+ + "\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+ + "\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb"+ + "\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2"+ + "\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd"+ + "\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2"+ + "\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef"+ + "\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2"+ + "\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101"+ + "\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2"+ + "\2\2\u010b\3\2\2\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2\2\2\u0113"+ + "\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2"+ + "\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0121\3\2\2\2\2\u0123\3\2\2\2\2\u0125"+ + "\3\2\2\2\2\u0127\3\2\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2"+ + "\2\2\u012f\3\2\2\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2\2\2\u0137"+ + "\3\2\2\2\2\u0139\3\2\2\2\2\u013b\3\2\2\2\2\u013d\3\2\2\2\2\u013f\3\2\2"+ + "\2\2\u0141\3\2\2\2\2\u0143\3\2\2\2\2\u0145\3\2\2\2\2\u0147\3\2\2\2\2\u0149"+ + "\3\2\2\2\2\u014b\3\2\2\2\2\u014d\3\2\2\2\2\u014f\3\2\2\2\2\u0151\3\2\2"+ + "\2\2\u0153\3\2\2\2\2\u0155\3\2\2\2\2\u0157\3\2\2\2\2\u0159\3\2\2\2\2\u015b"+ + "\3\2\2\2\2\u015d\3\2\2\2\2\u015f\3\2\2\2\2\u0161\3\2\2\2\2\u0163\3\2\2"+ + "\2\2\u0165\3\2\2\2\2\u0167\3\2\2\2\2\u0169\3\2\2\2\2\u016b\3\2\2\2\2\u016d"+ + "\3\2\2\2\2\u016f\3\2\2\2\2\u0171\3\2\2\2\2\u0173\3\2\2\2\2\u0175\3\2\2"+ + "\2\2\u0177\3\2\2\2\2\u0179\3\2\2\2\2\u017b\3\2\2\2\2\u017d\3\2\2\2\2\u017f"+ + "\3\2\2\2\2\u0181\3\2\2\2\2\u0183\3\2\2\2\2\u0185\3\2\2\2\2\u0187\3\2\2"+ + "\2\2\u0189\3\2\2\2\2\u018b\3\2\2\2\2\u018d\3\2\2\2\2\u018f\3\2\2\2\2\u0191"+ + "\3\2\2\2\2\u0193\3\2\2\2\2\u0195\3\2\2\2\2\u0197\3\2\2\2\2\u0199\3\2\2"+ + "\2\2\u019b\3\2\2\2\2\u019d\3\2\2\2\2\u019f\3\2\2\2\2\u01a1\3\2\2\2\2\u01a3"+ + "\3\2\2\2\2\u01a5\3\2\2\2\2\u01a7\3\2\2\2\2\u01a9\3\2\2\2\2\u01ab\3\2\2"+ + "\2\2\u01ad\3\2\2\2\2\u01af\3\2\2\2\2\u01b1\3\2\2\2\2\u01b3\3\2\2\2\2\u01b5"+ + "\3\2\2\2\2\u01b7\3\2\2\2\2\u01b9\3\2\2\2\2\u01bb\3\2\2\2\2\u01bd\3\2\2"+ + "\2\2\u01bf\3\2\2\2\2\u01c1\3\2\2\2\2\u01c3\3\2\2\2\2\u01c5\3\2\2\2\2\u01c7"+ + "\3\2\2\2\2\u01c9\3\2\2\2\2\u01cb\3\2\2\2\2\u01cd\3\2\2\2\2\u01cf\3\2\2"+ + "\2\2\u01d1\3\2\2\2\2\u01d3\3\2\2\2\2\u01d5\3\2\2\2\2\u01d7\3\2\2\2\2\u01d9"+ + "\3\2\2\2\2\u01db\3\2\2\2\2\u01dd\3\2\2\2\2\u01df\3\2\2\2\2\u01e1\3\2\2"+ + "\2\2\u01e3\3\2\2\2\2\u01e5\3\2\2\2\2\u01e7\3\2\2\2\2\u01e9\3\2\2\2\2\u01eb"+ + "\3\2\2\2\2\u01ed\3\2\2\2\2\u01ef\3\2\2\2\2\u01f1\3\2\2\2\2\u01f3\3\2\2"+ + "\2\2\u01f5\3\2\2\2\2\u01f7\3\2\2\2\2\u01f9\3\2\2\2\2\u01fb\3\2\2\2\2\u01fd"+ + "\3\2\2\2\2\u01ff\3\2\2\2\2\u0201\3\2\2\2\2\u0203\3\2\2\2\2\u0205\3\2\2"+ + "\2\2\u0207\3\2\2\2\2\u0209\3\2\2\2\2\u020b\3\2\2\2\2\u020d\3\2\2\2\2\u020f"+ + "\3\2\2\2\2\u0211\3\2\2\2\2\u0213\3\2\2\2\2\u0215\3\2\2\2\2\u0217\3\2\2"+ + "\2\2\u0219\3\2\2\2\2\u021b\3\2\2\2\2\u021d\3\2\2\2\2\u021f\3\2\2\2\2\u0221"+ + "\3\2\2\2\2\u0223\3\2\2\2\2\u0225\3\2\2\2\2\u0227\3\2\2\2\2\u0229\3\2\2"+ + "\2\2\u022b\3\2\2\2\2\u022d\3\2\2\2\2\u022f\3\2\2\2\2\u0231\3\2\2\2\2\u0233"+ + "\3\2\2\2\2\u0235\3\2\2\2\2\u0237\3\2\2\2\2\u0239\3\2\2\2\2\u023b\3\2\2"+ + "\2\2\u023d\3\2\2\2\2\u023f\3\2\2\2\2\u0241\3\2\2\2\2\u0243\3\2\2\2\2\u0245"+ + "\3\2\2\2\2\u0247\3\2\2\2\2\u0249\3\2\2\2\2\u024b\3\2\2\2\2\u024d\3\2\2"+ + "\2\2\u024f\3\2\2\2\2\u0251\3\2\2\2\2\u0253\3\2\2\2\2\u0255\3\2\2\2\2\u0257"+ + "\3\2\2\2\2\u0259\3\2\2\2\2\u025b\3\2\2\2\2\u025d\3\2\2\2\2\u029b\3\2\2"+ + "\2\2\u029d\3\2\2\2\2\u029f\3\2\2\2\2\u02a1\3\2\2\2\3\u02a3\3\2\2\2\5\u02a5"+ + "\3\2\2\2\7\u02a7\3\2\2\2\t\u02ab\3\2\2\2\13\u02ae\3\2\2\2\r\u02b1\3\2"+ + "\2\2\17\u02b3\3\2\2\2\21\u02b5\3\2\2\2\23\u02b9\3\2\2\2\25\u02bf\3\2\2"+ + "\2\27\u02c3\3\2\2\2\31\u02c9\3\2\2\2\33\u02d1\3\2\2\2\35\u02d5\3\2\2\2"+ + "\37\u02da\3\2\2\2!\u02de\3\2\2\2#\u02e6\3\2\2\2%\u02ec\3\2\2\2\'\u02ef"+ + "\3\2\2\2)\u02f3\3\2\2\2+\u02f6\3\2\2\2-\u0304\3\2\2\2/\u030c\3\2\2\2\61"+ + "\u0311\3\2\2\2\63\u0318\3\2\2\2\65\u0320\3\2\2\2\67\u0323\3\2\2\29\u0329"+ + "\3\2\2\2;\u0331\3\2\2\2=\u0336\3\2\2\2?\u033b\3\2\2\2A\u0342\3\2\2\2C"+ + "\u0348\3\2\2\2E\u034e\3\2\2\2G\u0356\3\2\2\2I\u0360\3\2\2\2K\u0368\3\2"+ + "\2\2M\u0370\3\2\2\2O\u037b\3\2\2\2Q\u0382\3\2\2\2S\u038a\3\2\2\2U\u0392"+ + "\3\2\2\2W\u0399\3\2\2\2Y\u03a1\3\2\2\2[\u03ad\3\2\2\2]\u03b5\3\2\2\2_"+ + "\u03c1\3\2\2\2a\u03cc\3\2\2\2c\u03d1\3\2\2\2e\u03d8\3\2\2\2g\u03de\3\2"+ + "\2\2i\u03e3\3\2\2\2k\u03eb\3\2\2\2m\u03f8\3\2\2\2o\u0405\3\2\2\2q\u0417"+ + "\3\2\2\2s\u0424\3\2\2\2u\u0428\3\2\2\2w\u042d\3\2\2\2y\u0448\3\2\2\2{"+ + "\u044a\3\2\2\2}\u0457\3\2\2\2\177\u045f\3\2\2\2\u0081\u0466\3\2\2\2\u0083"+ + "\u0470\3\2\2\2\u0085\u0475\3\2\2\2\u0087\u047e\3\2\2\2\u0089\u0482\3\2"+ + "\2\2\u008b\u048e\3\2\2\2\u008d\u0498\3\2\2\2\u008f\u04a1\3\2\2\2\u0091"+ + "\u04ac\3\2\2\2\u0093\u04b0\3\2\2\2\u0095\u04b5\3\2\2\2\u0097\u04ba\3\2"+ + "\2\2\u0099\u04be\3\2\2\2\u009b\u04c5\3\2\2\2\u009d\u04cd\3\2\2\2\u009f"+ + "\u04d4\3\2\2\2\u00a1\u04dd\3\2\2\2\u00a3\u04e4\3\2\2\2\u00a5\u04ec\3\2"+ + "\2\2\u00a7\u04f3\3\2\2\2\u00a9\u04fc\3\2\2\2\u00ab\u0505\3\2\2\2\u00ad"+ + "\u050d\3\2\2\2\u00af\u0513\3\2\2\2\u00b1\u0519\3\2\2\2\u00b3\u0520\3\2"+ + "\2\2\u00b5\u0527\3\2\2\2\u00b7\u0532\3\2\2\2\u00b9\u0538\3\2\2\2\u00bb"+ + "\u0542\3\2\2\2\u00bd\u0546\3\2\2\2\u00bf\u054e\3\2\2\2\u00c1\u0555\3\2"+ + "\2\2\u00c3\u055f\3\2\2\2\u00c5\u0564\3\2\2\2\u00c7\u0569\3\2\2\2\u00c9"+ + "\u0572\3\2\2\2\u00cb\u057c\3\2\2\2\u00cd\u0583\3\2\2\2\u00cf\u0589\3\2"+ + "\2\2\u00d1\u058f\3\2\2\2\u00d3\u0598\3\2\2\2\u00d5\u059f\3\2\2\2\u00d7"+ + "\u05a4\3\2\2\2\u00d9\u05a7\3\2\2\2\u00db\u05ae\3\2\2\2\u00dd\u05b5\3\2"+ + "\2\2\u00df\u05b8\3\2\2\2\u00e1\u05be\3\2\2\2\u00e3\u05c6\3\2\2\2\u00e5"+ + "\u05cc\3\2\2\2\u00e7\u05d3\3\2\2\2\u00e9\u05df\3\2\2\2\u00eb\u05e6\3\2"+ + "\2\2\u00ed\u05f0\3\2\2\2\u00ef\u05f9\3\2\2\2\u00f1\u05fe\3\2\2\2\u00f3"+ + "\u0601\3\2\2\2\u00f5\u0607\3\2\2\2\u00f7\u060c\3\2\2\2\u00f9\u0611\3\2"+ + "\2\2\u00fb\u0616\3\2\2\2\u00fd\u061e\3\2\2\2\u00ff\u0623\3\2\2\2\u0101"+ + "\u062b\3\2\2\2\u0103\u0630\3\2\2\2\u0105\u0635\3\2\2\2\u0107\u063b\3\2"+ + "\2\2\u0109\u0641\3\2\2\2\u010b\u0646\3\2\2\2\u010d\u064b\3\2\2\2\u010f"+ + "\u0651\3\2\2\2\u0111\u065a\3\2\2\2\u0113\u065f\3\2\2\2\u0115\u0665\3\2"+ + "\2\2\u0117\u066d\3\2\2\2\u0119\u0673\3\2\2\2\u011b\u0677\3\2\2\2\u011d"+ + "\u067f\3\2\2\2\u011f\u0685\3\2\2\2\u0121\u068c\3\2\2\2\u0123\u0692\3\2"+ + "\2\2\u0125\u0697\3\2\2\2\u0127\u06a1\3\2\2\2\u0129\u06ac\3\2\2\2\u012b"+ + "\u06b4\3\2\2\2\u012d\u06bc\3\2\2\2\u012f\u06be\3\2\2\2\u0131\u06c3\3\2"+ + "\2\2\u0133\u06c9\3\2\2\2\u0135\u06cc\3\2\2\2\u0137\u06d3\3\2\2\2\u0139"+ + "\u06d6\3\2\2\2\u013b\u06db\3\2\2\2\u013d\u06e2\3\2\2\2\u013f\u06ea\3\2"+ + "\2\2\u0141\u06ed\3\2\2\2\u0143\u06f3\3\2\2\2\u0145\u06f7\3\2\2\2\u0147"+ + "\u06fd\3\2\2\2\u0149\u070a\3\2\2\2\u014b\u070f\3\2\2\2\u014d\u0718\3\2"+ + "\2\2\u014f\u0720\3\2\2\2\u0151\u072a\3\2\2\2\u0153\u0734\3\2\2\2\u0155"+ + "\u0740\3\2\2\2\u0157\u074b\3\2\2\2\u0159\u0753\3\2\2\2\u015b\u0759\3\2"+ + "\2\2\u015d\u0761\3\2\2\2\u015f\u076a\3\2\2\2\u0161\u0774\3\2\2\2\u0163"+ + "\u077c\3\2\2\2\u0165\u0787\3\2\2\2\u0167\u0792\3\2\2\2\u0169\u0798\3\2"+ + "\2\2\u016b\u079e\3\2\2\2\u016d\u07a4\3\2\2\2\u016f\u07b1\3\2\2\2\u0171"+ + "\u07be\3\2\2\2\u0173\u07c6\3\2\2\2\u0175\u07cd\3\2\2\2\u0177\u07d8\3\2"+ + "\2\2\u0179\u07e0\3\2\2\2\u017b\u07e7\3\2\2\2\u017d\u07ee\3\2\2\2\u017f"+ + "\u07f6\3\2\2\2\u0181\u07fc\3\2\2\2\u0183\u0804\3\2\2\2\u0185\u080d\3\2"+ + "\2\2\u0187\u0814\3\2\2\2\u0189\u0827\3\2\2\2\u018b\u0829\3\2\2\2\u018d"+ + "\u082e\3\2\2\2\u018f\u0834\3\2\2\2\u0191\u083d\3\2\2\2\u0193\u0844\3\2"+ + "\2\2\u0195\u0848\3\2\2\2\u0197\u084d\3\2\2\2\u0199\u0854\3\2\2\2\u019b"+ + "\u085b\3\2\2\2\u019d\u0862\3\2\2\2\u019f\u0867\3\2\2\2\u01a1\u0871\3\2"+ + "\2\2\u01a3\u0877\3\2\2\2\u01a5\u0887\3\2\2\2\u01a7\u0894\3\2\2\2\u01a9"+ + "\u0898\3\2\2\2\u01ab\u089e\3\2\2\2\u01ad\u08a3\3\2\2\2\u01af\u08a8\3\2"+ + "\2\2\u01b1\u08af\3\2\2\2\u01b3\u08b4\3\2\2\2\u01b5\u08b9\3\2\2\2\u01b7"+ + "\u08c0\3\2\2\2\u01b9\u08c6\3\2\2\2\u01bb\u08d1\3\2\2\2\u01bd\u08d8\3\2"+ + "\2\2\u01bf\u08e1\3\2\2\2\u01c1\u08e8\3\2\2\2\u01c3\u08ef\3\2\2\2\u01c5"+ + "\u08f9\3\2\2\2\u01c7\u08fe\3\2\2\2\u01c9\u0904\3\2\2\2\u01cb\u090b\3\2"+ + "\2\2\u01cd\u0917\3\2\2\2\u01cf\u0934\3\2\2\2\u01d1\u0936\3\2\2\2\u01d3"+ + "\u0941\3\2\2\2\u01d5\u0946\3\2\2\2\u01d7\u094b\3\2\2\2\u01d9\u094e\3\2"+ + "\2\2\u01db\u0954\3\2\2\2\u01dd\u095d\3\2\2\2\u01df\u0969\3\2\2\2\u01e1"+ + "\u0976\3\2\2\2\u01e3\u0980\3\2\2\2\u01e5\u0985\3\2\2\2\u01e7\u098a\3\2"+ + "\2\2\u01e9\u0993\3\2\2\2\u01eb\u099c\3\2\2\2\u01ed\u09a1\3\2\2\2\u01ef"+ + "\u09ab\3\2\2\2\u01f1\u09b5\3\2\2\2\u01f3\u09bd\3\2\2\2\u01f5\u09c3\3\2"+ + "\2\2\u01f7\u09ca\3\2\2\2\u01f9\u09d2\3\2\2\2\u01fb\u09d9\3\2\2\2\u01fd"+ + "\u09df\3\2\2\2\u01ff\u09e6\3\2\2\2\u0201\u09ea\3\2\2\2\u0203\u09ef\3\2"+ + "\2\2\u0205\u09f5\3\2\2\2\u0207\u09fc\3\2\2\2\u0209\u0a01\3\2\2\2\u020b"+ + "\u0a07\3\2\2\2\u020d\u0a0c\3\2\2\2\u020f\u0a12\3\2\2\2\u0211\u0a19\3\2"+ + "\2\2\u0213\u0a1e\3\2\2\2\u0215\u0a23\3\2\2\2\u0217\u0a2b\3\2\2\2\u0219"+ + "\u0a2d\3\2\2\2\u021b\u0a31\3\2\2\2\u021d\u0a34\3\2\2\2\u021f\u0a37\3\2"+ + "\2\2\u0221\u0a3d\3\2\2\2\u0223\u0a3f\3\2\2\2\u0225\u0a45\3\2\2\2\u0227"+ + "\u0a47\3\2\2\2\u0229\u0a49\3\2\2\2\u022b\u0a4b\3\2\2\2\u022d\u0a4d\3\2"+ + "\2\2\u022f\u0a4f\3\2\2\2\u0231\u0a51\3\2\2\2\u0233\u0a53\3\2\2\2\u0235"+ + "\u0a55\3\2\2\2\u0237\u0a57\3\2\2\2\u0239\u0a5a\3\2\2\2\u023b\u0a5c\3\2"+ + "\2\2\u023d\u0a5e\3\2\2\2\u023f\u0a60\3\2\2\2\u0241\u0a62\3\2\2\2\u0243"+ + "\u0a64\3\2\2\2\u0245\u0a66\3\2\2\2\u0247\u0a7c\3\2\2\2\u0249\u0a7f\3\2"+ + "\2\2\u024b\u0a86\3\2\2\2\u024d\u0a8d\3\2\2\2\u024f\u0a94\3\2\2\2\u0251"+ + "\u0aa3\3\2\2\2\u0253\u0aa5\3\2\2\2\u0255\u0ab9\3\2\2\2\u0257\u0acc\3\2"+ + "\2\2\u0259\u0ae2\3\2\2\2\u025b\u0ae7\3\2\2\2\u025d\u0aeb\3\2\2\2\u025f"+ + "\u0b08\3\2\2\2\u0261\u0b0a\3\2\2\2\u0263\u0b13\3\2\2\2\u0265\u0b15\3\2"+ + "\2\2\u0267\u0b17\3\2\2\2\u0269\u0b19\3\2\2\2\u026b\u0b1b\3\2\2\2\u026d"+ + "\u0b1d\3\2\2\2\u026f\u0b1f\3\2\2\2\u0271\u0b21\3\2\2\2\u0273\u0b23\3\2"+ + "\2\2\u0275\u0b25\3\2\2\2\u0277\u0b27\3\2\2\2\u0279\u0b29\3\2\2\2\u027b"+ + "\u0b2b\3\2\2\2\u027d\u0b2d\3\2\2\2\u027f\u0b2f\3\2\2\2\u0281\u0b31\3\2"+ + "\2\2\u0283\u0b33\3\2\2\2\u0285\u0b35\3\2\2\2\u0287\u0b37\3\2\2\2\u0289"+ + "\u0b39\3\2\2\2\u028b\u0b3b\3\2\2\2\u028d\u0b3d\3\2\2\2\u028f\u0b3f\3\2"+ + "\2\2\u0291\u0b41\3\2\2\2\u0293\u0b43\3\2\2\2\u0295\u0b45\3\2\2\2\u0297"+ + "\u0b47\3\2\2\2\u0299\u0b49\3\2\2\2\u029b\u0b4b\3\2\2\2\u029d\u0b5e\3\2"+ + "\2\2\u029f\u0b6f\3\2\2\2\u02a1\u0b75\3\2\2\2\u02a3\u02a4\7*\2\2\u02a4"+ + "\4\3\2\2\2\u02a5\u02a6\7+\2\2\u02a6\6\3\2\2\2\u02a7\u02a8\7\61\2\2\u02a8"+ + "\u02a9\7,\2\2\u02a9\u02aa\7-\2\2\u02aa\b\3\2\2\2\u02ab\u02ac\7,\2\2\u02ac"+ + "\u02ad\7\61\2\2\u02ad\n\3\2\2\2\u02ae\u02af\7/\2\2\u02af\u02b0\7@\2\2"+ + "\u02b0\f\3\2\2\2\u02b1\u02b2\7]\2\2\u02b2\16\3\2\2\2\u02b3\u02b4\7_\2"+ + "\2\u02b4\20\3\2\2\2\u02b5\u02b6\5\u0267\u0134\2\u02b6\u02b7\5\u026d\u0137"+ + "\2\u02b7\u02b8\5\u026d\u0137\2\u02b8\22\3\2\2\2\u02b9\u02ba\5\u0267\u0134"+ + "\2\u02ba\u02bb\5\u0271\u0139\2\u02bb\u02bc\5\u028d\u0147\2\u02bc\u02bd"+ + "\5\u026f\u0138\2\u02bd\u02be\5\u0289\u0145\2\u02be\24\3\2\2\2\u02bf\u02c0"+ + "\5\u0267\u0134\2\u02c0\u02c1\5\u027d\u013f\2\u02c1\u02c2\5\u027d\u013f"+ + "\2\u02c2\26\3\2\2\2\u02c3\u02c4\5\u0267\u0134\2\u02c4\u02c5\5\u027d\u013f"+ + "\2\u02c5\u02c6\5\u028d\u0147\2\u02c6\u02c7\5\u026f\u0138\2\u02c7\u02c8"+ + "\5\u0289\u0145\2\u02c8\30\3\2\2\2\u02c9\u02ca\5\u0267\u0134\2\u02ca\u02cb"+ + "\5\u0281\u0141\2\u02cb\u02cc\5\u0267\u0134\2\u02cc\u02cd\5\u027d\u013f"+ + "\2\u02cd\u02ce\5\u0297\u014c\2\u02ce\u02cf\5\u0299\u014d\2\u02cf\u02d0"+ + "\5\u026f\u0138\2\u02d0\32\3\2\2\2\u02d1\u02d2\5\u0267\u0134\2\u02d2\u02d3"+ + "\5\u0281\u0141\2\u02d3\u02d4\5\u026d\u0137\2\u02d4\34\3\2\2\2\u02d5\u02d6"+ + "\5\u0267\u0134\2\u02d6\u02d7\5\u0281\u0141\2\u02d7\u02d8\5\u028d\u0147"+ + "\2\u02d8\u02d9\5\u0277\u013c\2\u02d9\36\3\2\2\2\u02da\u02db\5\u0267\u0134"+ + "\2\u02db\u02dc\5\u0281\u0141\2\u02dc\u02dd\5\u0297\u014c\2\u02dd \3\2"+ + "\2\2\u02de\u02df\5\u0267\u0134\2\u02df\u02e0\5\u0289\u0145\2\u02e0\u02e1"+ + "\5\u026b\u0136\2\u02e1\u02e2\5\u0275\u013b\2\u02e2\u02e3\5\u0277\u013c"+ + "\2\u02e3\u02e4\5\u0291\u0149\2\u02e4\u02e5\5\u026f\u0138\2\u02e5\"\3\2"+ + "\2\2\u02e6\u02e7\5\u0267\u0134\2\u02e7\u02e8\5\u0289\u0145\2\u02e8\u02e9"+ + "\5\u0289\u0145\2\u02e9\u02ea\5\u0267\u0134\2\u02ea\u02eb\5\u0297\u014c"+ + "\2\u02eb$\3\2\2\2\u02ec\u02ed\5\u0267\u0134\2\u02ed\u02ee\5\u028b\u0146"+ + "\2\u02ee&\3\2\2\2\u02ef\u02f0\5\u0267\u0134\2\u02f0\u02f1\5\u028b\u0146"+ + "\2\u02f1\u02f2\5\u026b\u0136\2\u02f2(\3\2\2\2\u02f3\u02f4\5\u0267\u0134"+ + "\2\u02f4\u02f5\5\u028d\u0147\2\u02f5*\3\2\2\2\u02f6\u02f7\5\u0267\u0134"+ + "\2\u02f7\u02f8\5\u028f\u0148\2\u02f8\u02f9\5\u028d\u0147\2\u02f9\u02fa"+ + "\5\u0275\u013b\2\u02fa\u02fb\5\u0283\u0142\2\u02fb\u02fc\5\u0289\u0145"+ + "\2\u02fc\u02fd\5\u0277\u013c\2\u02fd\u02fe\5\u0299\u014d\2\u02fe\u02ff"+ + "\5\u0267\u0134\2\u02ff\u0300\5\u028d\u0147\2\u0300\u0301\5\u0277\u013c"+ + "\2\u0301\u0302\5\u0283\u0142\2\u0302\u0303\5\u0281\u0141\2\u0303,\3\2"+ + "\2\2\u0304\u0305\5\u0269\u0135\2\u0305\u0306\5\u026f\u0138\2\u0306\u0307"+ + "\5\u028d\u0147\2\u0307\u0308\5\u0293\u014a\2\u0308\u0309\5\u026f\u0138"+ + "\2\u0309\u030a\5\u026f\u0138\2\u030a\u030b\5\u0281\u0141\2\u030b.\3\2"+ + "\2\2\u030c\u030d\5\u0269\u0135\2\u030d\u030e\5\u0283\u0142\2\u030e\u030f"+ + "\5\u028d\u0147\2\u030f\u0310\5\u0275\u013b\2\u0310\60\3\2\2\2\u0311\u0312"+ + "\5\u0269\u0135\2\u0312\u0313\5\u028f\u0148\2\u0313\u0314\5\u026b\u0136"+ + "\2\u0314\u0315\5\u027b\u013e\2\u0315\u0316\5\u026f\u0138\2\u0316\u0317"+ + "\5\u028d\u0147\2\u0317\62\3\2\2\2\u0318\u0319\5\u0269\u0135\2\u0319\u031a"+ + "\5\u028f\u0148\2\u031a\u031b\5\u026b\u0136\2\u031b\u031c\5\u027b\u013e"+ + "\2\u031c\u031d\5\u026f\u0138\2\u031d\u031e\5\u028d\u0147\2\u031e\u031f"+ + "\5\u028b\u0146\2\u031f\64\3\2\2\2\u0320\u0321\5\u0269\u0135\2\u0321\u0322"+ + "\5\u0297\u014c\2\u0322\66\3\2\2\2\u0323\u0324\5\u026b\u0136\2\u0324\u0325"+ + "\5\u0267\u0134\2\u0325\u0326\5\u026b\u0136\2\u0326\u0327\5\u0275\u013b"+ + "\2\u0327\u0328\5\u026f\u0138\2\u03288\3\2\2\2\u0329\u032a\5\u026b\u0136"+ + "\2\u032a\u032b\5\u0267\u0134\2\u032b\u032c\5\u028b\u0146\2\u032c\u032d"+ + "\5\u026b\u0136\2\u032d\u032e\5\u0267\u0134\2\u032e\u032f\5\u026d\u0137"+ + "\2\u032f\u0330\5\u026f\u0138\2\u0330:\3\2\2\2\u0331\u0332\5\u026b\u0136"+ + "\2\u0332\u0333\5\u0267\u0134\2\u0333\u0334\5\u028b\u0146\2\u0334\u0335"+ + "\5\u026f\u0138\2\u0335<\3\2\2\2\u0336\u0337\5\u026b\u0136\2\u0337\u0338"+ + "\5\u0267\u0134\2\u0338\u0339\5\u028b\u0146\2\u0339\u033a\5\u028d\u0147"+ + "\2\u033a>\3\2\2\2\u033b\u033c\5\u026b\u0136\2\u033c\u033d\5\u0275\u013b"+ + "\2\u033d\u033e\5\u0267\u0134\2\u033e\u033f\5\u0281\u0141\2\u033f\u0340"+ + "\5\u0273\u013a\2\u0340\u0341\5\u026f\u0138\2\u0341@\3\2\2\2\u0342\u0343"+ + "\5\u026b\u0136\2\u0343\u0344\5\u0275\u013b\2\u0344\u0345\5\u026f\u0138"+ + "\2\u0345\u0346\5\u026b\u0136\2\u0346\u0347\5\u027b\u013e\2\u0347B\3\2"+ + "\2\2\u0348\u0349\5\u026b\u0136\2\u0349\u034a\5\u027d\u013f\2\u034a\u034b"+ + "\5\u026f\u0138\2\u034b\u034c\5\u0267\u0134\2\u034c\u034d\5\u0289\u0145"+ + "\2\u034dD\3\2\2\2\u034e\u034f\5\u026b\u0136\2\u034f\u0350\5\u027d\u013f"+ + "\2\u0350\u0351\5\u028f\u0148\2\u0351\u0352\5\u028b\u0146\2\u0352\u0353"+ + "\5\u028d\u0147\2\u0353\u0354\5\u026f\u0138\2\u0354\u0355\5\u0289\u0145"+ + "\2\u0355F\3\2\2\2\u0356\u0357\5\u026b\u0136\2\u0357\u0358\5\u027d\u013f"+ + "\2\u0358\u0359\5\u028f\u0148\2\u0359\u035a\5\u028b\u0146\2\u035a\u035b"+ + "\5\u028d\u0147\2\u035b\u035c\5\u026f\u0138\2\u035c\u035d\5\u0289\u0145"+ + "\2\u035d\u035e\5\u026f\u0138\2\u035e\u035f\5\u026d\u0137\2\u035fH\3\2"+ + "\2\2\u0360\u0361\5\u026b\u0136\2\u0361\u0362\5\u0283\u0142\2\u0362\u0363"+ + "\5\u026d\u0137\2\u0363\u0364\5\u026f\u0138\2\u0364\u0365\5\u0273\u013a"+ + "\2\u0365\u0366\5\u026f\u0138\2\u0366\u0367\5\u0281\u0141\2\u0367J\3\2"+ + "\2\2\u0368\u0369\5\u026b\u0136\2\u0369\u036a\5\u0283\u0142\2\u036a\u036b"+ + "\5\u027d\u013f\2\u036b\u036c\5\u027d\u013f\2\u036c\u036d\5\u0267\u0134"+ + "\2\u036d\u036e\5\u028d\u0147\2\u036e\u036f\5\u026f\u0138\2\u036fL\3\2"+ + "\2\2\u0370\u0371\5\u026b\u0136\2\u0371\u0372\5\u0283\u0142\2\u0372\u0373"+ + "\5\u027d\u013f\2\u0373\u0374\5\u027d\u013f\2\u0374\u0375\5\u026f\u0138"+ + "\2\u0375\u0376\5\u026b\u0136\2\u0376\u0377\5\u028d\u0147\2\u0377\u0378"+ + "\5\u0277\u013c\2\u0378\u0379\5\u0283\u0142\2\u0379\u037a\5\u0281\u0141"+ + "\2\u037aN\3\2\2\2\u037b\u037c\5\u026b\u0136\2\u037c\u037d\5\u0283\u0142"+ + "\2\u037d\u037e\5\u027d\u013f\2\u037e\u037f\5\u028f\u0148\2\u037f\u0380"+ + "\5\u027f\u0140\2\u0380\u0381\5\u0281\u0141\2\u0381P\3\2\2\2\u0382\u0383"+ + "\5\u026b\u0136\2\u0383\u0384\5\u0283\u0142\2\u0384\u0385\5\u027d\u013f"+ + "\2\u0385\u0386\5\u028f\u0148\2\u0386\u0387\5\u027f\u0140\2\u0387\u0388"+ + "\5\u0281\u0141\2\u0388\u0389\5\u028b\u0146\2\u0389R\3\2\2\2\u038a\u038b"+ + "\5\u026b\u0136\2\u038b\u038c\5\u0283\u0142\2\u038c\u038d\5\u027f\u0140"+ + "\2\u038d\u038e\5\u027f\u0140\2\u038e\u038f\5\u026f\u0138\2\u038f\u0390"+ + "\5\u0281\u0141\2\u0390\u0391\5\u028d\u0147\2\u0391T\3\2\2\2\u0392\u0393"+ + "\5\u026b\u0136\2\u0393\u0394\5\u0283\u0142\2\u0394\u0395\5\u027f\u0140"+ + "\2\u0395\u0396\5\u027f\u0140\2\u0396\u0397\5\u0277\u013c\2\u0397\u0398"+ + "\5\u028d\u0147\2\u0398V\3\2\2\2\u0399\u039a\5\u026b\u0136\2\u039a\u039b"+ + "\5\u0283\u0142\2\u039b\u039c\5\u027f\u0140\2\u039c\u039d\5\u0285\u0143"+ + "\2\u039d\u039e\5\u0267\u0134\2\u039e\u039f\5\u026b\u0136\2\u039f\u03a0"+ + "\5\u028d\u0147\2\u03a0X\3\2\2\2\u03a1\u03a2\5\u026b\u0136\2\u03a2\u03a3"+ + "\5\u0283\u0142\2\u03a3\u03a4\5\u027f\u0140\2\u03a4\u03a5\5\u0285\u0143"+ + "\2\u03a5\u03a6\5\u0267\u0134\2\u03a6\u03a7\5\u026b\u0136\2\u03a7\u03a8"+ + "\5\u028d\u0147\2\u03a8\u03a9\5\u0277\u013c\2\u03a9\u03aa\5\u0283\u0142"+ + "\2\u03aa\u03ab\5\u0281\u0141\2\u03ab\u03ac\5\u028b\u0146\2\u03acZ\3\2"+ + "\2\2\u03ad\u03ae\5\u026b\u0136\2\u03ae\u03af\5\u0283\u0142\2\u03af\u03b0"+ + "\5\u027f\u0140\2\u03b0\u03b1\5\u0285\u0143\2\u03b1\u03b2\5\u028f\u0148"+ + "\2\u03b2\u03b3\5\u028d\u0147\2\u03b3\u03b4\5\u026f\u0138\2\u03b4\\\3\2"+ + "\2\2\u03b5\u03b6\5\u026b\u0136\2\u03b6\u03b7\5\u0283\u0142\2\u03b7\u03b8"+ + "\5\u0281\u0141\2\u03b8\u03b9\5\u026b\u0136\2\u03b9\u03ba\5\u0267\u0134"+ + "\2\u03ba\u03bb\5\u028d\u0147\2\u03bb\u03bc\5\u026f\u0138\2\u03bc\u03bd"+ + "\5\u0281\u0141\2\u03bd\u03be\5\u0267\u0134\2\u03be\u03bf\5\u028d\u0147"+ + "\2\u03bf\u03c0\5\u026f\u0138\2\u03c0^\3\2\2\2\u03c1\u03c2\5\u026b\u0136"+ + "\2\u03c2\u03c3\5\u0283\u0142\2\u03c3\u03c4\5\u0281\u0141\2\u03c4\u03c5"+ + "\5\u028b\u0146\2\u03c5\u03c6\5\u028d\u0147\2\u03c6\u03c7\5\u0289\u0145"+ + "\2\u03c7\u03c8\5\u0267\u0134\2\u03c8\u03c9\5\u0277\u013c\2\u03c9\u03ca"+ + "\5\u0281\u0141\2\u03ca\u03cb\5\u028d\u0147\2\u03cb`\3\2\2\2\u03cc\u03cd"+ + "\5\u026b\u0136\2\u03cd\u03ce\5\u0283\u0142\2\u03ce\u03cf\5\u028b\u0146"+ + "\2\u03cf\u03d0\5\u028d\u0147\2\u03d0b\3\2\2\2\u03d1\u03d2\5\u026b\u0136"+ + "\2\u03d2\u03d3\5\u0289\u0145\2\u03d3\u03d4\5\u026f\u0138\2\u03d4\u03d5"+ + "\5\u0267\u0134\2\u03d5\u03d6\5\u028d\u0147\2\u03d6\u03d7\5\u026f\u0138"+ + "\2\u03d7d\3\2\2\2\u03d8\u03d9\5\u026b\u0136\2\u03d9\u03da\5\u0289\u0145"+ + "\2\u03da\u03db\5\u0283\u0142\2\u03db\u03dc\5\u028b\u0146\2\u03dc\u03dd"+ + "\5\u028b\u0146\2\u03ddf\3\2\2\2\u03de\u03df\5\u026b\u0136\2\u03df\u03e0"+ + "\5\u028f\u0148\2\u03e0\u03e1\5\u0269\u0135\2\u03e1\u03e2\5\u026f\u0138"+ + "\2\u03e2h\3\2\2\2\u03e3\u03e4\5\u026b\u0136\2\u03e4\u03e5\5\u028f\u0148"+ + "\2\u03e5\u03e6\5\u0289\u0145\2\u03e6\u03e7\5\u0289\u0145\2\u03e7\u03e8"+ + "\5\u026f\u0138\2\u03e8\u03e9\5\u0281\u0141\2\u03e9\u03ea\5\u028d\u0147"+ + "\2\u03eaj\3\2\2\2\u03eb\u03ec\5\u026b\u0136\2\u03ec\u03ed\5\u028f\u0148"+ + "\2\u03ed\u03ee\5\u0289\u0145\2\u03ee\u03ef\5\u0289\u0145\2\u03ef\u03f0"+ + "\5\u026f\u0138\2\u03f0\u03f1\5\u0281\u0141\2\u03f1\u03f2\5\u028d\u0147"+ + "\2\u03f2\u03f3\5\u023b\u011e\2\u03f3\u03f4\5\u026d\u0137\2\u03f4\u03f5"+ + "\5\u0267\u0134\2\u03f5\u03f6\5\u028d\u0147\2\u03f6\u03f7\5\u026f\u0138"+ + "\2\u03f7l\3\2\2\2\u03f8\u03f9\5\u026b\u0136\2\u03f9\u03fa\5\u028f\u0148"+ + "\2\u03fa\u03fb\5\u0289\u0145\2\u03fb\u03fc\5\u0289\u0145\2\u03fc\u03fd"+ + "\5\u026f\u0138\2\u03fd\u03fe\5\u0281\u0141\2\u03fe\u03ff\5\u028d\u0147"+ + "\2\u03ff\u0400\5\u023b\u011e\2\u0400\u0401\5\u028d\u0147\2\u0401\u0402"+ + "\5\u0277\u013c\2\u0402\u0403\5\u027f\u0140\2\u0403\u0404\5\u026f\u0138"+ + "\2\u0404n\3\2\2\2\u0405\u0406\5\u026b\u0136\2\u0406\u0407\5\u028f\u0148"+ + "\2\u0407\u0408\5\u0289\u0145\2\u0408\u0409\5\u0289\u0145\2\u0409\u040a"+ + "\5\u026f\u0138\2\u040a\u040b\5\u0281\u0141\2\u040b\u040c\5\u028d\u0147"+ + "\2\u040c\u040d\5\u023b\u011e\2\u040d\u040e\5\u028d\u0147\2\u040e\u040f"+ + "\5\u0277\u013c\2\u040f\u0410\5\u027f\u0140\2\u0410\u0411\5\u026f\u0138"+ + "\2\u0411\u0412\5\u028b\u0146\2\u0412\u0413\5\u028d\u0147\2\u0413\u0414"+ + "\5\u0267\u0134\2\u0414\u0415\5\u027f\u0140\2\u0415\u0416\5\u0285\u0143"+ + "\2\u0416p\3\2\2\2\u0417\u0418\5\u026b\u0136\2\u0418\u0419\5\u028f\u0148"+ + "\2\u0419\u041a\5\u0289\u0145\2\u041a\u041b\5\u0289\u0145\2\u041b\u041c"+ + "\5\u026f\u0138\2\u041c\u041d\5\u0281\u0141\2\u041d\u041e\5\u028d\u0147"+ + "\2\u041e\u041f\5\u023b\u011e\2\u041f\u0420\5\u028f\u0148\2\u0420\u0421"+ + "\5\u028b\u0146\2\u0421\u0422\5\u026f\u0138\2\u0422\u0423\5\u0289\u0145"+ + "\2\u0423r\3\2\2\2\u0424\u0425\5\u026d\u0137\2\u0425\u0426\5\u0267\u0134"+ + "\2\u0426\u0427\5\u0297\u014c\2\u0427t\3\2\2\2\u0428\u0429\5\u026d\u0137"+ + "\2\u0429\u042a\5\u0267\u0134\2\u042a\u042b\5\u028d\u0147\2\u042b\u042c"+ + "\5\u0267\u0134\2\u042cv\3\2\2\2\u042d\u042e\5\u026d\u0137\2\u042e\u042f"+ + "\5\u0267\u0134\2\u042f\u0430\5\u028d\u0147\2\u0430\u0431\5\u0267\u0134"+ + "\2\u0431\u0432\5\u0269\u0135\2\u0432\u0433\5\u0267\u0134\2\u0433\u0434"+ + "\5\u028b\u0146\2\u0434\u0435\5\u026f\u0138\2\u0435x\3\2\2\2\u0436\u0437"+ + "\5\u026d\u0137\2\u0437\u0438\5\u0267\u0134\2\u0438\u0439\5\u028d\u0147"+ + "\2\u0439\u043a\5\u0267\u0134\2\u043a\u043b\5\u0269\u0135\2\u043b\u043c"+ + "\5\u0267\u0134\2\u043c\u043d\5\u028b\u0146\2\u043d\u043e\5\u026f\u0138"+ + "\2\u043e\u043f\5\u028b\u0146\2\u043f\u0449\3\2\2\2\u0440\u0441\5\u028b"+ + "\u0146\2\u0441\u0442\5\u026b\u0136\2\u0442\u0443\5\u0275\u013b\2\u0443"+ + "\u0444\5\u026f\u0138\2\u0444\u0445\5\u027f\u0140\2\u0445\u0446\5\u0267"+ + "\u0134\2\u0446\u0447\5\u028b\u0146\2\u0447\u0449\3\2\2\2\u0448\u0436\3"+ + "\2\2\2\u0448\u0440\3\2\2\2\u0449z\3\2\2\2\u044a\u044b\5\u026d\u0137\2"+ + "\u044b\u044c\5\u0269\u0135\2\u044c\u044d\5\u0285\u0143\2\u044d\u044e\5"+ + "\u0289\u0145\2\u044e\u044f\5\u0283\u0142\2\u044f\u0450\5\u0285\u0143\2"+ + "\u0450\u0451\5\u026f\u0138\2\u0451\u0452\5\u0289\u0145\2\u0452\u0453\5"+ + "\u028d\u0147\2\u0453\u0454\5\u0277\u013c\2\u0454\u0455\5\u026f\u0138\2"+ + "\u0455\u0456\5\u028b\u0146\2\u0456|\3\2\2\2\u0457\u0458\5\u026d\u0137"+ + "\2\u0458\u0459\5\u026f\u0138\2\u0459\u045a\5\u0271\u0139\2\u045a\u045b"+ + "\5\u0277\u013c\2\u045b\u045c\5\u0281\u0141\2\u045c\u045d\5\u026f\u0138"+ + "\2\u045d\u045e\5\u026d\u0137\2\u045e~\3\2\2\2\u045f\u0460\5\u026d\u0137"+ + "\2\u0460\u0461\5\u026f\u0138\2\u0461\u0462\5\u027d\u013f\2\u0462\u0463"+ + "\5\u026f\u0138\2\u0463\u0464\5\u028d\u0147\2\u0464\u0465\5\u026f\u0138"+ + "\2\u0465\u0080\3\2\2\2\u0466\u0467\5\u026d\u0137\2\u0467\u0468\5\u026f"+ + "\u0138\2\u0468\u0469\5\u027d\u013f\2\u0469\u046a\5\u0277\u013c\2\u046a"+ + "\u046b\5\u027f\u0140\2\u046b\u046c\5\u0277\u013c\2\u046c\u046d\5\u028d"+ + "\u0147\2\u046d\u046e\5\u026f\u0138\2\u046e\u046f\5\u026d\u0137\2\u046f"+ + "\u0082\3\2\2\2\u0470\u0471\5\u026d\u0137\2\u0471\u0472\5\u026f\u0138\2"+ + "\u0472\u0473\5\u028b\u0146\2\u0473\u0474\5\u026b\u0136\2\u0474\u0084\3"+ + "\2\2\2\u0475\u0476\5\u026d\u0137\2\u0476\u0477\5\u026f\u0138\2\u0477\u0478"+ + "\5\u028b\u0146\2\u0478\u0479\5\u026b\u0136\2\u0479\u047a\5\u0289\u0145"+ + "\2\u047a\u047b\5\u0277\u013c\2\u047b\u047c\5\u0269\u0135\2\u047c\u047d"+ + "\5\u026f\u0138\2\u047d\u0086\3\2\2\2\u047e\u047f\5\u026d\u0137\2\u047f"+ + "\u0480\5\u0271\u0139\2\u0480\u0481\5\u028b\u0146\2\u0481\u0088\3\2\2\2"+ + "\u0482\u0483\5\u026d\u0137\2\u0483\u0484\5\u0277\u013c\2\u0484\u0485\5"+ + "\u0289\u0145\2\u0485\u0486\5\u026f\u0138\2\u0486\u0487\5\u026b\u0136\2"+ + "\u0487\u0488\5\u028d\u0147\2\u0488\u0489\5\u0283\u0142\2\u0489\u048a\5"+ + "\u0289\u0145\2\u048a\u048b\5\u0277\u013c\2\u048b\u048c\5\u026f\u0138\2"+ + "\u048c\u048d\5\u028b\u0146\2\u048d\u008a\3\2\2\2\u048e\u048f\5\u026d\u0137"+ + "\2\u048f\u0490\5\u0277\u013c\2\u0490\u0491\5\u0289\u0145\2\u0491\u0492"+ + "\5\u026f\u0138\2\u0492\u0493\5\u026b\u0136\2\u0493\u0494\5\u028d\u0147"+ + "\2\u0494\u0495\5\u0283\u0142\2\u0495\u0496\5\u0289\u0145\2\u0496\u0497"+ + "\5\u0297\u014c\2\u0497\u008c\3\2\2\2\u0498\u0499\5\u026d\u0137\2\u0499"+ + "\u049a\5\u0277\u013c\2\u049a\u049b\5\u028b\u0146\2\u049b\u049c\5\u028d"+ + "\u0147\2\u049c\u049d\5\u0277\u013c\2\u049d\u049e\5\u0281\u0141\2\u049e"+ + "\u049f\5\u026b\u0136\2\u049f\u04a0\5\u028d\u0147\2\u04a0\u008e\3\2\2\2"+ + "\u04a1\u04a2\5\u026d\u0137\2\u04a2\u04a3\5\u0277\u013c\2\u04a3\u04a4\5"+ + "\u028b\u0146\2\u04a4\u04a5\5\u028d\u0147\2\u04a5\u04a6\5\u0289\u0145\2"+ + "\u04a6\u04a7\5\u0277\u013c\2\u04a7\u04a8\5\u0269\u0135\2\u04a8\u04a9\5"+ + "\u028f\u0148\2\u04a9\u04aa\5\u028d\u0147\2\u04aa\u04ab\5\u026f\u0138\2"+ + "\u04ab\u0090\3\2\2\2\u04ac\u04ad\5\u026d\u0137\2\u04ad\u04ae\5\u0277\u013c"+ + "\2\u04ae\u04af\5\u0291\u0149\2\u04af\u0092\3\2\2\2\u04b0\u04b1\5\u026d"+ + "\u0137\2\u04b1\u04b2\5\u0289\u0145\2\u04b2\u04b3\5\u0283\u0142\2\u04b3"+ + "\u04b4\5\u0285\u0143\2\u04b4\u0094\3\2\2\2\u04b5\u04b6\5\u026f\u0138\2"+ + "\u04b6\u04b7\5\u027d\u013f\2\u04b7\u04b8\5\u028b\u0146\2\u04b8\u04b9\5"+ + "\u026f\u0138\2\u04b9\u0096\3\2\2\2\u04ba\u04bb\5\u026f\u0138\2\u04bb\u04bc"+ + "\5\u0281\u0141\2\u04bc\u04bd\5\u026d\u0137\2\u04bd\u0098\3\2\2\2\u04be"+ + "\u04bf\5\u026f\u0138\2\u04bf\u04c0\5\u028b\u0146\2\u04c0\u04c1\5\u026b"+ + "\u0136\2\u04c1\u04c2\5\u0267\u0134\2\u04c2\u04c3\5\u0285\u0143\2\u04c3"+ + "\u04c4\5\u026f\u0138\2\u04c4\u009a\3\2\2\2\u04c5\u04c6\5\u026f\u0138\2"+ + "\u04c6\u04c7\5\u028b\u0146\2\u04c7\u04c8\5\u026b\u0136\2\u04c8\u04c9\5"+ + "\u0267\u0134\2\u04c9\u04ca\5\u0285\u0143\2\u04ca\u04cb\5\u026f\u0138\2"+ + "\u04cb\u04cc\5\u026d\u0137\2\u04cc\u009c\3\2\2\2\u04cd\u04ce\5\u026f\u0138"+ + "\2\u04ce\u04cf\5\u0295\u014b\2\u04cf\u04d0\5\u026b\u0136\2\u04d0\u04d1"+ + "\5\u026f\u0138\2\u04d1\u04d2\5\u0285\u0143\2\u04d2\u04d3\5\u028d\u0147"+ + "\2\u04d3\u009e\3\2\2\2\u04d4\u04d5\5\u026f\u0138\2\u04d5\u04d6\5\u0295"+ + "\u014b\2\u04d6\u04d7\5\u026b\u0136\2\u04d7\u04d8\5\u0275\u013b\2\u04d8"+ + "\u04d9\5\u0267\u0134\2\u04d9\u04da\5\u0281\u0141\2\u04da\u04db\5\u0273"+ + "\u013a\2\u04db\u04dc\5\u026f\u0138\2\u04dc\u00a0\3\2\2\2\u04dd\u04de\5"+ + "\u026f\u0138\2\u04de\u04df\5\u0295\u014b\2\u04df\u04e0\5\u0277\u013c\2"+ + "\u04e0\u04e1\5\u028b\u0146\2\u04e1\u04e2\5\u028d\u0147\2\u04e2\u04e3\5"+ + "\u028b\u0146\2\u04e3\u00a2\3\2\2\2\u04e4\u04e5\5\u026f\u0138\2\u04e5\u04e6"+ + "\5\u0295\u014b\2\u04e6\u04e7\5\u0285\u0143\2\u04e7\u04e8\5\u027d\u013f"+ + "\2\u04e8\u04e9\5\u0267\u0134\2\u04e9\u04ea\5\u0277\u013c\2\u04ea\u04eb"+ + "\5\u0281\u0141\2\u04eb\u00a4\3\2\2\2\u04ec\u04ed\5\u026f\u0138\2\u04ed"+ + "\u04ee\5\u0295\u014b\2\u04ee\u04ef\5\u0285\u0143\2\u04ef\u04f0\5\u0283"+ + "\u0142\2\u04f0\u04f1\5\u0289\u0145\2\u04f1\u04f2\5\u028d\u0147\2\u04f2"+ + "\u00a6\3\2\2\2\u04f3\u04f4\5\u026f\u0138\2\u04f4\u04f5\5\u0295\u014b\2"+ + "\u04f5\u04f6\5\u028d\u0147\2\u04f6\u04f7\5\u026f\u0138\2\u04f7\u04f8\5"+ + "\u0281\u0141\2\u04f8\u04f9\5\u026d\u0137\2\u04f9\u04fa\5\u026f\u0138\2"+ + "\u04fa\u04fb\5\u026d\u0137\2\u04fb\u00a8\3\2\2\2\u04fc\u04fd\5\u026f\u0138"+ + "\2\u04fd\u04fe\5\u0295\u014b\2\u04fe\u04ff\5\u028d\u0147\2\u04ff\u0500"+ + "\5\u026f\u0138\2\u0500\u0501\5\u0289\u0145\2\u0501\u0502\5\u0281\u0141"+ + "\2\u0502\u0503\5\u0267\u0134\2\u0503\u0504\5\u027d\u013f\2\u0504\u00aa"+ + "\3\2\2\2\u0505\u0506\5\u026f\u0138\2\u0506\u0507\5\u0295\u014b\2\u0507"+ + "\u0508\5\u028d\u0147\2\u0508\u0509\5\u0289\u0145\2\u0509\u050a\5\u0267"+ + "\u0134\2\u050a\u050b\5\u026b\u0136\2\u050b\u050c\5\u028d\u0147\2\u050c"+ + "\u00ac\3\2\2\2\u050d\u050e\5\u0271\u0139\2\u050e\u050f\5\u0267\u0134\2"+ + "\u050f\u0510\5\u027d\u013f\2\u0510\u0511\5\u028b\u0146\2\u0511\u0512\5"+ + "\u026f\u0138\2\u0512\u00ae\3\2\2\2\u0513\u0514\5\u0271\u0139\2\u0514\u0515"+ + "\5\u026f\u0138\2\u0515\u0516\5\u028d\u0147\2\u0516\u0517\5\u026b\u0136"+ + "\2\u0517\u0518\5\u0275\u013b\2\u0518\u00b0\3\2\2\2\u0519\u051a\5\u0271"+ + "\u0139\2\u051a\u051b\5\u0277\u013c\2\u051b\u051c\5\u026f\u0138\2\u051c"+ + "\u051d\5\u027d\u013f\2\u051d\u051e\5\u026d\u0137\2\u051e\u051f\5\u028b"+ + "\u0146\2\u051f\u00b2\3\2\2\2\u0520\u0521\5\u0271\u0139\2\u0521\u0522\5"+ + "\u0277\u013c\2\u0522\u0523\5\u027d\u013f\2\u0523\u0524\5\u028d\u0147\2"+ + "\u0524\u0525\5\u026f\u0138\2\u0525\u0526\5\u0289\u0145\2\u0526\u00b4\3"+ + "\2\2\2\u0527\u0528\5\u0271\u0139\2\u0528\u0529\5\u0277\u013c\2\u0529\u052a"+ + "\5\u027d\u013f\2\u052a\u052b\5\u026f\u0138\2\u052b\u052c\5\u0271\u0139"+ + "\2\u052c\u052d\5\u0283\u0142\2\u052d\u052e\5\u0289\u0145\2\u052e\u052f"+ + "\5\u027f\u0140\2\u052f\u0530\5\u0267\u0134\2\u0530\u0531\5\u028d\u0147"+ + "\2\u0531\u00b6\3\2\2\2\u0532\u0533\5\u0271\u0139\2\u0533\u0534\5\u0277"+ + "\u013c\2\u0534\u0535\5\u0289\u0145\2\u0535\u0536\5\u028b\u0146\2\u0536"+ + "\u0537\5\u028d\u0147\2\u0537\u00b8\3\2\2\2\u0538\u0539\5\u0271\u0139\2"+ + "\u0539\u053a\5\u0283\u0142\2\u053a\u053b\5\u027d\u013f\2\u053b\u053c\5"+ + "\u027d\u013f\2\u053c\u053d\5\u0283\u0142\2\u053d\u053e\5\u0293\u014a\2"+ + "\u053e\u053f\5\u0277\u013c\2\u053f\u0540\5\u0281\u0141\2\u0540\u0541\5"+ + "\u0273\u013a\2\u0541\u00ba\3\2\2\2\u0542\u0543\5\u0271\u0139\2\u0543\u0544"+ + "\5\u0283\u0142\2\u0544\u0545\5\u0289\u0145\2\u0545\u00bc\3\2\2\2\u0546"+ + "\u0547\5\u0271\u0139\2\u0547\u0548\5\u0283\u0142\2\u0548\u0549\5\u0289"+ + "\u0145\2\u0549\u054a\5\u026f\u0138\2\u054a\u054b\5\u0277\u013c\2\u054b"+ + "\u054c\5\u0273\u013a\2\u054c\u054d\5\u0281\u0141\2\u054d\u00be\3\2\2\2"+ + "\u054e\u054f\5\u0271\u0139\2\u054f\u0550\5\u0283\u0142\2\u0550\u0551\5"+ + "\u0289\u0145\2\u0551\u0552\5\u027f\u0140\2\u0552\u0553\5\u0267\u0134\2"+ + "\u0553\u0554\5\u028d\u0147\2\u0554\u00c0\3\2\2\2\u0555\u0556\5\u0271\u0139"+ + "\2\u0556\u0557\5\u0283\u0142\2\u0557\u0558\5\u0289\u0145\2\u0558\u0559"+ + "\5\u027f\u0140\2\u0559\u055a\5\u0267\u0134\2\u055a\u055b\5\u028d\u0147"+ + "\2\u055b\u055c\5\u028d\u0147\2\u055c\u055d\5\u026f\u0138\2\u055d\u055e"+ + "\5\u026d\u0137\2\u055e\u00c2\3\2\2\2\u055f\u0560\5\u0271\u0139\2\u0560"+ + "\u0561\5\u0289\u0145\2\u0561\u0562\5\u0283\u0142\2\u0562\u0563\5\u027f"+ + "\u0140\2\u0563\u00c4\3\2\2\2\u0564\u0565\5\u0271\u0139\2\u0565\u0566\5"+ + "\u028f\u0148\2\u0566\u0567\5\u027d\u013f\2\u0567\u0568\5\u027d\u013f\2"+ + "\u0568\u00c6\3\2\2\2\u0569\u056a\5\u0271\u0139\2\u056a\u056b\5\u028f\u0148"+ + "\2\u056b\u056c\5\u0281\u0141\2\u056c\u056d\5\u026b\u0136\2\u056d\u056e"+ + "\5\u028d\u0147\2\u056e\u056f\5\u0277\u013c\2\u056f\u0570\5\u0283\u0142"+ + "\2\u0570\u0571\5\u0281\u0141\2\u0571\u00c8\3\2\2\2\u0572\u0573\5\u0271"+ + "\u0139\2\u0573\u0574\5\u028f\u0148\2\u0574\u0575\5\u0281\u0141\2\u0575"+ + "\u0576\5\u026b\u0136\2\u0576\u0577\5\u028d\u0147\2\u0577\u0578\5\u0277"+ + "\u013c\2\u0578\u0579\5\u0283\u0142\2\u0579\u057a\5\u0281\u0141\2\u057a"+ + "\u057b\5\u028b\u0146\2\u057b\u00ca\3\2\2\2\u057c\u057d\5\u0273\u013a\2"+ + "\u057d\u057e\5\u027d\u013f\2\u057e\u057f\5\u0283\u0142\2\u057f\u0580\5"+ + "\u0269\u0135\2\u0580\u0581\5\u0267\u0134\2\u0581\u0582\5\u027d\u013f\2"+ + "\u0582\u00cc\3\2\2\2\u0583\u0584\5\u0273\u013a\2\u0584\u0585\5\u0289\u0145"+ + "\2\u0585\u0586\5\u0267\u0134\2\u0586\u0587\5\u0281\u0141\2\u0587\u0588"+ + "\5\u028d\u0147\2\u0588\u00ce\3\2\2\2\u0589\u058a\5\u0273\u013a\2\u058a"+ + "\u058b\5\u0289\u0145\2\u058b\u058c\5\u0283\u0142\2\u058c\u058d\5\u028f"+ + "\u0148\2\u058d\u058e\5\u0285\u0143\2\u058e\u00d0\3\2\2\2\u058f\u0590\5"+ + "\u0273\u013a\2\u0590\u0591\5\u0289\u0145\2\u0591\u0592\5\u0283\u0142\2"+ + "\u0592\u0593\5\u028f\u0148\2\u0593\u0594\5\u0285\u0143\2\u0594\u0595\5"+ + "\u0277\u013c\2\u0595\u0596\5\u0281\u0141\2\u0596\u0597\5\u0273\u013a\2"+ + "\u0597\u00d2\3\2\2\2\u0598\u0599\5\u0275\u013b\2\u0599\u059a\5\u0267\u0134"+ + "\2\u059a\u059b\5\u0291\u0149\2\u059b\u059c\5\u0277\u013c\2\u059c\u059d"+ + "\5\u0281\u0141\2\u059d\u059e\5\u0273\u013a\2\u059e\u00d4\3\2\2\2\u059f"+ + "\u05a0\5\u0275\u013b\2\u05a0\u05a1\5\u0283\u0142\2\u05a1\u05a2\5\u028f"+ + "\u0148\2\u05a2\u05a3\5\u0289\u0145\2\u05a3\u00d6\3\2\2\2\u05a4\u05a5\5"+ + "\u0277\u013c\2\u05a5\u05a6\5\u0271\u0139\2\u05a6\u00d8\3\2\2\2\u05a7\u05a8"+ + "\5\u0277\u013c\2\u05a8\u05a9\5\u0273\u013a\2\u05a9\u05aa\5\u0281\u0141"+ + "\2\u05aa\u05ab\5\u0283\u0142\2\u05ab\u05ac\5\u0289\u0145\2\u05ac\u05ad"+ + "\5\u026f\u0138\2\u05ad\u00da\3\2\2\2\u05ae\u05af\5\u0277\u013c\2\u05af"+ + "\u05b0\5\u027f\u0140\2\u05b0\u05b1\5\u0285\u0143\2\u05b1\u05b2\5\u0283"+ + "\u0142\2\u05b2\u05b3\5\u0289\u0145\2\u05b3\u05b4\5\u028d\u0147\2\u05b4"+ + "\u00dc\3\2\2\2\u05b5\u05b6\5\u0277\u013c\2\u05b6\u05b7\5\u0281\u0141\2"+ + "\u05b7\u00de\3\2\2\2\u05b8\u05b9\5\u0277\u013c\2\u05b9\u05ba\5\u0281\u0141"+ + "\2\u05ba\u05bb\5\u026d\u0137\2\u05bb\u05bc\5\u026f\u0138\2\u05bc\u05bd"+ + "\5\u0295\u014b\2\u05bd\u00e0\3\2\2\2\u05be\u05bf\5\u0277\u013c\2\u05bf"+ + "\u05c0\5\u0281\u0141\2\u05c0\u05c1\5\u026d\u0137\2\u05c1\u05c2\5\u026f"+ + "\u0138\2\u05c2\u05c3\5\u0295\u014b\2\u05c3\u05c4\5\u026f\u0138\2\u05c4"+ + "\u05c5\5\u028b\u0146\2\u05c5\u00e2\3\2\2\2\u05c6\u05c7\5\u0277\u013c\2"+ + "\u05c7\u05c8\5\u0281\u0141\2\u05c8\u05c9\5\u0281\u0141\2\u05c9\u05ca\5"+ + "\u026f\u0138\2\u05ca\u05cb\5\u0289\u0145\2\u05cb\u00e4\3\2\2\2\u05cc\u05cd"+ + "\5\u0277\u013c\2\u05cd\u05ce\5\u0281\u0141\2\u05ce\u05cf\5\u0285\u0143"+ + "\2\u05cf\u05d0\5\u0267\u0134\2\u05d0\u05d1\5\u028d\u0147\2\u05d1\u05d2"+ + "\5\u0275\u013b\2\u05d2\u00e6\3\2\2\2\u05d3\u05d4\5\u0277\u013c\2\u05d4"+ + "\u05d5\5\u0281\u0141\2\u05d5\u05d6\5\u0285\u0143\2\u05d6\u05d7\5\u028f"+ + "\u0148\2\u05d7\u05d8\5\u028d\u0147\2\u05d8\u05d9\5\u0271\u0139\2\u05d9"+ + "\u05da\5\u0283\u0142\2\u05da\u05db\5\u0289\u0145\2\u05db\u05dc\5\u027f"+ + "\u0140\2\u05dc\u05dd\5\u0267\u0134\2\u05dd\u05de\5\u028d\u0147\2\u05de"+ + "\u00e8\3\2\2\2\u05df\u05e0\5\u0277\u013c\2\u05e0\u05e1\5\u0281\u0141\2"+ + "\u05e1\u05e2\5\u028b\u0146\2\u05e2\u05e3\5\u026f\u0138\2\u05e3\u05e4\5"+ + "\u0289\u0145\2\u05e4\u05e5\5\u028d\u0147\2\u05e5\u00ea\3\2\2\2\u05e6\u05e7"+ + "\5\u0277\u013c\2\u05e7\u05e8\5\u0281\u0141\2\u05e8\u05e9\5\u028d\u0147"+ + "\2\u05e9\u05ea\5\u026f\u0138\2\u05ea\u05eb\5\u0289\u0145\2\u05eb\u05ec"+ + "\5\u028b\u0146\2\u05ec\u05ed\5\u026f\u0138\2\u05ed\u05ee\5\u026b\u0136"+ + "\2\u05ee\u05ef\5\u028d\u0147\2\u05ef\u00ec\3\2\2\2\u05f0\u05f1\5\u0277"+ + "\u013c\2\u05f1\u05f2\5\u0281\u0141\2\u05f2\u05f3\5\u028d\u0147\2\u05f3"+ + "\u05f4\5\u026f\u0138\2\u05f4\u05f5\5\u0289\u0145\2\u05f5\u05f6\5\u0291"+ + "\u0149\2\u05f6\u05f7\5\u0267\u0134\2\u05f7\u05f8\5\u027d\u013f\2\u05f8"+ + "\u00ee\3\2\2\2\u05f9\u05fa\5\u0277\u013c\2\u05fa\u05fb\5\u0281\u0141\2"+ + "\u05fb\u05fc\5\u028d\u0147\2\u05fc\u05fd\5\u0283\u0142\2\u05fd\u00f0\3"+ + "\2\2\2\u05fe\u05ff\5\u0277\u013c\2\u05ff\u0600\5\u028b\u0146\2\u0600\u00f2"+ + "\3\2\2\2\u0601\u0602\5\u0277\u013c\2\u0602\u0603\5\u028d\u0147\2\u0603"+ + "\u0604\5\u026f\u0138\2\u0604\u0605\5\u027f\u0140\2\u0605\u0606\5\u028b"+ + "\u0146\2\u0606\u00f4\3\2\2\2\u0607\u0608\5\u0279\u013d\2\u0608\u0609\5"+ + "\u0283\u0142\2\u0609\u060a\5\u0277\u013c\2\u060a\u060b\5\u0281\u0141\2"+ + "\u060b\u00f6\3\2\2\2\u060c\u060d\5\u027b\u013e\2\u060d\u060e\5\u026f\u0138"+ + "\2\u060e\u060f\5\u0297\u014c\2\u060f\u0610\5\u028b\u0146\2\u0610\u00f8"+ + "\3\2\2\2\u0611\u0612\5\u027d\u013f\2\u0612\u0613\5\u0267\u0134\2\u0613"+ + "\u0614\5\u028b\u0146\2\u0614\u0615\5\u028d\u0147\2\u0615\u00fa\3\2\2\2"+ + "\u0616\u0617\5\u027d\u013f\2\u0617\u0618\5\u0267\u0134\2\u0618\u0619\5"+ + "\u028d\u0147\2\u0619\u061a\5\u026f\u0138\2\u061a\u061b\5\u0289\u0145\2"+ + "\u061b\u061c\5\u0267\u0134\2\u061c\u061d\5\u027d\u013f\2\u061d\u00fc\3"+ + "\2\2\2\u061e\u061f\5\u027d\u013f\2\u061f\u0620\5\u0267\u0134\2\u0620\u0621"+ + "\5\u0299\u014d\2\u0621\u0622\5\u0297\u014c\2\u0622\u00fe\3\2\2\2\u0623"+ + "\u0624\5\u027d\u013f\2\u0624\u0625\5\u026f\u0138\2\u0625\u0626\5\u0267"+ + "\u0134\2\u0626\u0627\5\u026d\u0137\2\u0627\u0628\5\u0277\u013c\2\u0628"+ + "\u0629\5\u0281\u0141\2\u0629\u062a\5\u0273\u013a\2\u062a\u0100\3\2\2\2"+ + "\u062b\u062c\5\u027d\u013f\2\u062c\u062d\5\u026f\u0138\2\u062d\u062e\5"+ + "\u0271\u0139\2\u062e\u062f\5\u028d\u0147\2\u062f\u0102\3\2\2\2\u0630\u0631"+ + "\5\u027d\u013f\2\u0631\u0632\5\u0277\u013c\2\u0632\u0633\5\u027b\u013e"+ + "\2\u0633\u0634\5\u026f\u0138\2\u0634\u0104\3\2\2\2\u0635\u0636\5\u027d"+ + "\u013f\2\u0636\u0637\5\u0277\u013c\2\u0637\u0638\5\u027f\u0140\2\u0638"+ + "\u0639\5\u0277\u013c\2\u0639\u063a\5\u028d\u0147\2\u063a\u0106\3\2\2\2"+ + "\u063b\u063c\5\u027d\u013f\2\u063c\u063d\5\u0277\u013c\2\u063d\u063e\5"+ + "\u0281\u0141\2\u063e\u063f\5\u026f\u0138\2\u063f\u0640\5\u028b\u0146\2"+ + "\u0640\u0108\3\2\2\2\u0641\u0642\5\u027d\u013f\2\u0642\u0643\5\u0277\u013c"+ + "\2\u0643\u0644\5\u028b\u0146\2\u0644\u0645\5\u028d\u0147\2\u0645\u010a"+ + "\3\2\2\2\u0646\u0647\5\u027d\u013f\2\u0647\u0648\5\u0283\u0142\2\u0648"+ + "\u0649\5\u0267\u0134\2\u0649\u064a\5\u026d\u0137\2\u064a\u010c\3\2\2\2"+ + "\u064b\u064c\5\u027d\u013f\2\u064c\u064d\5\u0283\u0142\2\u064d\u064e\5"+ + "\u026b\u0136\2\u064e\u064f\5\u0267\u0134\2\u064f\u0650\5\u027d\u013f\2"+ + "\u0650\u010e\3\2\2\2\u0651\u0652\5\u027d\u013f\2\u0652\u0653\5\u0283\u0142"+ + "\2\u0653\u0654\5\u026b\u0136\2\u0654\u0655\5\u0267\u0134\2\u0655\u0656"+ + "\5\u028d\u0147\2\u0656\u0657\5\u0277\u013c\2\u0657\u0658\5\u0283\u0142"+ + "\2\u0658\u0659\5\u0281\u0141\2\u0659\u0110\3\2\2\2\u065a\u065b\5\u027d"+ + "\u013f\2\u065b\u065c\5\u0283\u0142\2\u065c\u065d\5\u026b\u0136\2\u065d"+ + "\u065e\5\u027b\u013e\2\u065e\u0112\3\2\2\2\u065f\u0660\5\u027d\u013f\2"+ + "\u0660\u0661\5\u0283\u0142\2\u0661\u0662\5\u026b\u0136\2\u0662\u0663\5"+ + "\u027b\u013e\2\u0663\u0664\5\u028b\u0146\2\u0664\u0114\3\2\2\2\u0665\u0666"+ + "\5\u027d\u013f\2\u0666\u0667\5\u0283\u0142\2\u0667\u0668\5\u0273\u013a"+ + "\2\u0668\u0669\5\u0277\u013c\2\u0669\u066a\5\u026b\u0136\2\u066a\u066b"+ + "\5\u0267\u0134\2\u066b\u066c\5\u027d\u013f\2\u066c\u0116\3\2\2\2\u066d"+ + "\u066e\5\u027f\u0140\2\u066e\u066f\5\u0267\u0134\2\u066f\u0670\5\u026b"+ + "\u0136\2\u0670\u0671\5\u0289\u0145\2\u0671\u0672\5\u0283\u0142\2\u0672"+ + "\u0118\3\2\2\2\u0673\u0674\5\u027f\u0140\2\u0674\u0675\5\u0267\u0134\2"+ + "\u0675\u0676\5\u0285\u0143\2\u0676\u011a\3\2\2\2\u0677\u0678\5\u027f\u0140"+ + "\2\u0678\u0679\5\u0267\u0134\2\u0679\u067a\5\u028d\u0147\2\u067a\u067b"+ + "\5\u026b\u0136\2\u067b\u067c\5\u0275\u013b\2\u067c\u067d\5\u026f\u0138"+ + "\2\u067d\u067e\5\u026d\u0137\2\u067e\u011c\3\2\2\2\u067f\u0680\5\u027f"+ + "\u0140\2\u0680\u0681\5\u026f\u0138\2\u0681\u0682\5\u0289\u0145\2\u0682"+ + "\u0683\5\u0273\u013a\2\u0683\u0684\5\u026f\u0138\2\u0684\u011e\3\2\2\2"+ + "\u0685\u0686\5\u027f\u0140\2\u0686\u0687\5\u0277\u013c\2\u0687\u0688\5"+ + "\u0281\u0141\2\u0688\u0689\5\u028f\u0148\2\u0689\u068a\5\u028d\u0147\2"+ + "\u068a\u068b\5\u026f\u0138\2\u068b\u0120\3\2\2\2\u068c\u068d\5\u027f\u0140"+ + "\2\u068d\u068e\5\u0283\u0142\2\u068e\u068f\5\u0281\u0141\2\u068f\u0690"+ + "\5\u028d\u0147\2\u0690\u0691\5\u0275\u013b\2\u0691\u0122\3\2\2\2\u0692"+ + "\u0693\5\u027f\u0140\2\u0693\u0694\5\u028b\u0146\2\u0694\u0695\5\u026b"+ + "\u0136\2\u0695\u0696\5\u027b\u013e\2\u0696\u0124\3\2\2\2\u0697\u0698\5"+ + "\u0281\u0141\2\u0698\u0699\5\u0267\u0134\2\u0699\u069a\5\u027f\u0140\2"+ + "\u069a\u069b\5\u026f\u0138\2\u069b\u069c\5\u028b\u0146\2\u069c\u069d\5"+ + "\u0285\u0143\2\u069d\u069e\5\u0267\u0134\2\u069e\u069f\5\u026b\u0136\2"+ + "\u069f\u06a0\5\u026f\u0138\2\u06a0\u0126\3\2\2\2\u06a1\u06a2\5\u0281\u0141"+ + "\2\u06a2\u06a3\5\u0267\u0134\2\u06a3\u06a4\5\u027f\u0140\2\u06a4\u06a5"+ + "\5\u026f\u0138\2\u06a5\u06a6\5\u028b\u0146\2\u06a6\u06a7\5\u0285\u0143"+ + "\2\u06a7\u06a8\5\u0267\u0134\2\u06a8\u06a9\5\u026b\u0136\2\u06a9\u06aa"+ + "\5\u026f\u0138\2\u06aa\u06ab\5\u028b\u0146\2\u06ab\u0128\3\2\2\2\u06ac"+ + "\u06ad\5\u0281\u0141\2\u06ad\u06ae\5\u0267\u0134\2\u06ae\u06af\5\u028d"+ + "\u0147\2\u06af\u06b0\5\u028f\u0148\2\u06b0\u06b1\5\u0289\u0145\2\u06b1"+ + "\u06b2\5\u0267\u0134\2\u06b2\u06b3\5\u027d\u013f\2\u06b3\u012a\3\2\2\2"+ + "\u06b4\u06b5\5\u0281\u0141\2\u06b5\u06b6\5\u0283\u0142\2\u06b6\u012c\3"+ + "\2\2\2\u06b7\u06b8\5\u0281\u0141\2\u06b8\u06b9\5\u0283\u0142\2\u06b9\u06ba"+ + "\5\u028d\u0147\2\u06ba\u06bd\3\2\2\2\u06bb\u06bd\5\u023d\u011f\2\u06bc"+ + "\u06b7\3\2\2\2\u06bc\u06bb\3\2\2\2\u06bd\u012e\3\2\2\2\u06be\u06bf\5\u0281"+ + "\u0141\2\u06bf\u06c0\5\u028f\u0148\2\u06c0\u06c1\5\u027d\u013f\2\u06c1"+ + "\u06c2\5\u027d\u013f\2\u06c2\u0130\3\2\2\2\u06c3\u06c4\5\u0281\u0141\2"+ + "\u06c4\u06c5\5\u028f\u0148\2\u06c5\u06c6\5\u027d\u013f\2\u06c6\u06c7\5"+ + "\u027d\u013f\2\u06c7\u06c8\5\u028b\u0146\2\u06c8\u0132\3\2\2\2\u06c9\u06ca"+ + "\5\u0283\u0142\2\u06ca\u06cb\5\u0271\u0139\2\u06cb\u0134\3\2\2\2\u06cc"+ + "\u06cd\5\u0283\u0142\2\u06cd\u06ce\5\u0271\u0139\2\u06ce\u06cf\5\u0271"+ + "\u0139\2\u06cf\u06d0\5\u028b\u0146\2\u06d0\u06d1\5\u026f\u0138\2\u06d1"+ + "\u06d2\5\u028d\u0147\2\u06d2\u0136\3\2\2\2\u06d3\u06d4\5\u0283\u0142\2"+ + "\u06d4\u06d5\5\u0281\u0141\2\u06d5\u0138\3\2\2\2\u06d6\u06d7\5\u0283\u0142"+ + "\2\u06d7\u06d8\5\u0281\u0141\2\u06d8\u06d9\5\u027d\u013f\2\u06d9\u06da"+ + "\5\u0297\u014c\2\u06da\u013a\3\2\2\2\u06db\u06dc\5\u0283\u0142\2\u06dc"+ + "\u06dd\5\u0285\u0143\2\u06dd\u06de\5\u028d\u0147\2\u06de\u06df\5\u0277"+ + "\u013c\2\u06df\u06e0\5\u0283\u0142\2\u06e0\u06e1\5\u0281\u0141\2\u06e1"+ + "\u013c\3\2\2\2\u06e2\u06e3\5\u0283\u0142\2\u06e3\u06e4\5\u0285\u0143\2"+ + "\u06e4\u06e5\5\u028d\u0147\2\u06e5\u06e6\5\u0277\u013c\2\u06e6\u06e7\5"+ + "\u0283\u0142\2\u06e7\u06e8\5\u0281\u0141\2\u06e8\u06e9\5\u028b\u0146\2"+ + "\u06e9\u013e\3\2\2\2\u06ea\u06eb\5\u0283\u0142\2\u06eb\u06ec\5\u0289\u0145"+ + "\2\u06ec\u0140\3\2\2\2\u06ed\u06ee\5\u0283\u0142\2\u06ee\u06ef\5\u0289"+ + "\u0145\2\u06ef\u06f0\5\u026d\u0137\2\u06f0\u06f1\5\u026f\u0138\2\u06f1"+ + "\u06f2\5\u0289\u0145\2\u06f2\u0142\3\2\2\2\u06f3\u06f4\5\u0283\u0142\2"+ + "\u06f4\u06f5\5\u028f\u0148\2\u06f5\u06f6\5\u028d\u0147\2\u06f6\u0144\3"+ + "\2\2\2\u06f7\u06f8\5\u0283\u0142\2\u06f8\u06f9\5\u028f\u0148\2\u06f9\u06fa"+ + "\5\u028d\u0147\2\u06fa\u06fb\5\u026f\u0138\2\u06fb\u06fc\5\u0289\u0145"+ + "\2\u06fc\u0146\3\2\2\2\u06fd\u06fe\5\u0283\u0142\2\u06fe\u06ff\5\u028f"+ + "\u0148\2\u06ff\u0700\5\u028d\u0147\2\u0700\u0701\5\u0285\u0143\2\u0701"+ + "\u0702\5\u028f\u0148\2\u0702\u0703\5\u028d\u0147\2\u0703\u0704\5\u0271"+ + "\u0139\2\u0704\u0705\5\u0283\u0142\2\u0705\u0706\5\u0289\u0145\2\u0706"+ + "\u0707\5\u027f\u0140\2\u0707\u0708\5\u0267\u0134\2\u0708\u0709\5\u028d"+ + "\u0147\2\u0709\u0148\3\2\2\2\u070a\u070b\5\u0283\u0142\2\u070b\u070c\5"+ + "\u0291\u0149\2\u070c\u070d\5\u026f\u0138\2\u070d\u070e\5\u0289\u0145\2"+ + "\u070e\u014a\3\2\2\2\u070f\u0710\5\u0283\u0142\2\u0710\u0711\5\u0291\u0149"+ + "\2\u0711\u0712\5\u026f\u0138\2\u0712\u0713\5\u0289\u0145\2\u0713\u0714"+ + "\5\u027d\u013f\2\u0714\u0715\5\u0267\u0134\2\u0715\u0716\5\u0285\u0143"+ + "\2\u0716\u0717\5\u028b\u0146\2\u0717\u014c\3\2\2\2\u0718\u0719\5\u0283"+ + "\u0142\2\u0719\u071a\5\u0291\u0149\2\u071a\u071b\5\u026f\u0138\2\u071b"+ + "\u071c\5\u0289\u0145\2\u071c\u071d\5\u027d\u013f\2\u071d\u071e\5\u0267"+ + "\u0134\2\u071e\u071f\5\u0297\u014c\2\u071f\u014e\3\2\2\2\u0720\u0721\5"+ + "\u0283\u0142\2\u0721\u0722\5\u0291\u0149\2\u0722\u0723\5\u026f\u0138\2"+ + "\u0723\u0724\5\u0289\u0145\2\u0724\u0725\5\u0293\u014a\2\u0725\u0726\5"+ + "\u0289\u0145\2\u0726\u0727\5\u0277\u013c\2\u0727\u0728\5\u028d\u0147\2"+ + "\u0728\u0729\5\u026f\u0138\2\u0729\u0150\3\2\2\2\u072a\u072b\5\u0285\u0143"+ + "\2\u072b\u072c\5\u0267\u0134\2\u072c\u072d\5\u0289\u0145\2\u072d\u072e"+ + "\5\u028d\u0147\2\u072e\u072f\5\u0277\u013c\2\u072f\u0730\5\u028d\u0147"+ + "\2\u0730\u0731\5\u0277\u013c\2\u0731\u0732\5\u0283\u0142\2\u0732\u0733"+ + "\5\u0281\u0141\2\u0733\u0152\3\2\2\2\u0734\u0735\5\u0285\u0143\2\u0735"+ + "\u0736\5\u0267\u0134\2\u0736\u0737\5\u0289\u0145\2\u0737\u0738\5\u028d"+ + "\u0147\2\u0738\u0739\5\u0277\u013c\2\u0739\u073a\5\u028d\u0147\2\u073a"+ + "\u073b\5\u0277\u013c\2\u073b\u073c\5\u0283\u0142\2\u073c\u073d\5\u0281"+ + "\u0141\2\u073d\u073e\5\u026f\u0138\2\u073e\u073f\5\u026d\u0137\2\u073f"+ + "\u0154\3\2\2\2\u0740\u0741\5\u0285\u0143\2\u0741\u0742\5\u0267\u0134\2"+ + "\u0742\u0743\5\u0289\u0145\2\u0743\u0744\5\u028d\u0147\2\u0744\u0745\5"+ + "\u0277\u013c\2\u0745\u0746\5\u028d\u0147\2\u0746\u0747\5\u0277\u013c\2"+ + "\u0747\u0748\5\u0283\u0142\2\u0748\u0749\5\u0281\u0141\2\u0749\u074a\5"+ + "\u028b\u0146\2\u074a\u0156\3\2\2\2\u074b\u074c\5\u0285\u0143\2\u074c\u074d"+ + "\5\u026f\u0138\2\u074d\u074e\5\u0289\u0145\2\u074e\u074f\5\u026b\u0136"+ + "\2\u074f\u0750\5\u026f\u0138\2\u0750\u0751\5\u0281\u0141\2\u0751\u0752"+ + "\5\u028d\u0147\2\u0752\u0158\3\2\2\2\u0753\u0754\5\u0285\u0143\2\u0754"+ + "\u0755\5\u0277\u013c\2\u0755\u0756\5\u0291\u0149\2\u0756\u0757\5\u0283"+ + "\u0142\2\u0757\u0758\5\u028d\u0147\2\u0758\u015a\3\2\2\2\u0759\u075a\5"+ + "\u0285\u0143\2\u075a\u075b\5\u027d\u013f\2\u075b\u075c\5\u0267\u0134\2"+ + "\u075c\u075d\5\u026b\u0136\2\u075d\u075e\5\u0277\u013c\2\u075e\u075f\5"+ + "\u0281\u0141\2\u075f\u0760\5\u0273\u013a\2\u0760\u015c\3\2\2\2\u0761\u0762"+ + "\5\u0285\u0143\2\u0762\u0763\5\u0283\u0142\2\u0763\u0764\5\u028b\u0146"+ + "\2\u0764\u0765\5\u0277\u013c\2\u0765\u0766\5\u028d\u0147\2\u0766\u0767"+ + "\5\u0277\u013c\2\u0767\u0768\5\u0283\u0142\2\u0768\u0769\5\u0281\u0141"+ + "\2\u0769\u015e\3\2\2\2\u076a\u076b\5\u0285\u0143\2\u076b\u076c\5\u0289"+ + "\u0145\2\u076c\u076d\5\u026f\u0138\2\u076d\u076e\5\u026b\u0136\2\u076e"+ + "\u076f\5\u026f\u0138\2\u076f\u0770\5\u026d\u0137\2\u0770\u0771\5\u0277"+ + "\u013c\2\u0771\u0772\5\u0281\u0141\2\u0772\u0773\5\u0273\u013a\2\u0773"+ + "\u0160\3\2\2\2\u0774\u0775\5\u0285\u0143\2\u0775\u0776\5\u0289\u0145\2"+ + "\u0776\u0777\5\u0277\u013c\2\u0777\u0778\5\u027f\u0140\2\u0778\u0779\5"+ + "\u0267\u0134\2\u0779\u077a\5\u0289\u0145\2\u077a\u077b\5\u0297\u014c\2"+ + "\u077b\u0162\3\2\2\2\u077c\u077d\5\u0285\u0143\2\u077d\u077e\5\u0289\u0145"+ + "\2\u077e\u077f\5\u0277\u013c\2\u077f\u0780\5\u0281\u0141\2\u0780\u0781"+ + "\5\u026b\u0136\2\u0781\u0782\5\u0277\u013c\2\u0782\u0783\5\u0285\u0143"+ + "\2\u0783\u0784\5\u0267\u0134\2\u0784\u0785\5\u027d\u013f\2\u0785\u0786"+ + "\5\u028b\u0146\2\u0786\u0164\3\2\2\2\u0787\u0788\5\u0285\u0143\2\u0788"+ + "\u0789\5\u0289\u0145\2\u0789\u078a\5\u0283\u0142\2\u078a\u078b\5\u0285"+ + "\u0143\2\u078b\u078c\5\u026f\u0138\2\u078c\u078d\5\u0289\u0145\2\u078d"+ + "\u078e\5\u028d\u0147\2\u078e\u078f\5\u0277\u013c\2\u078f\u0790\5\u026f"+ + "\u0138\2\u0790\u0791\5\u028b\u0146\2\u0791\u0166\3\2\2\2\u0792\u0793\5"+ + "\u0285\u0143\2\u0793\u0794\5\u028f\u0148\2\u0794\u0795\5\u0289\u0145\2"+ + "\u0795\u0796\5\u0273\u013a\2\u0796\u0797\5\u026f\u0138\2\u0797\u0168\3"+ + "\2\2\2\u0798\u0799\5\u0287\u0144\2\u0799\u079a\5\u028f\u0148\2\u079a\u079b"+ + "\5\u026f\u0138\2\u079b\u079c\5\u0289\u0145\2\u079c\u079d\5\u0297\u014c"+ + "\2\u079d\u016a\3\2\2\2\u079e\u079f\5\u0289\u0145\2\u079f\u07a0\5\u0267"+ + "\u0134\2\u07a0\u07a1\5\u0281\u0141\2\u07a1\u07a2\5\u0273\u013a\2\u07a2"+ + "\u07a3\5\u026f\u0138\2\u07a3\u016c\3\2\2\2\u07a4\u07a5\5\u0289\u0145\2"+ + "\u07a5\u07a6\5\u026f\u0138\2\u07a6\u07a7\5\u026b\u0136\2\u07a7\u07a8\5"+ + "\u0283\u0142\2\u07a8\u07a9\5\u0289\u0145\2\u07a9\u07aa\5\u026d\u0137\2"+ + "\u07aa\u07ab\5\u0289\u0145\2\u07ab\u07ac\5\u026f\u0138\2\u07ac\u07ad\5"+ + "\u0267\u0134\2\u07ad\u07ae\5\u026d\u0137\2\u07ae\u07af\5\u026f\u0138\2"+ + "\u07af\u07b0\5\u0289\u0145\2\u07b0\u016e\3\2\2\2\u07b1\u07b2\5\u0289\u0145"+ + "\2\u07b2\u07b3\5\u026f\u0138\2\u07b3\u07b4\5\u026b\u0136\2\u07b4\u07b5"+ + "\5\u0283\u0142\2\u07b5\u07b6\5\u0289\u0145\2\u07b6\u07b7\5\u026d\u0137"+ + "\2\u07b7\u07b8\5\u0293\u014a\2\u07b8\u07b9\5\u0289\u0145\2\u07b9\u07ba"+ + "\5\u0277\u013c\2\u07ba\u07bb\5\u028d\u0147\2\u07bb\u07bc\5\u026f\u0138"+ + "\2\u07bc\u07bd\5\u0289\u0145\2\u07bd\u0170\3\2\2\2\u07be\u07bf\5\u0289"+ + "\u0145\2\u07bf\u07c0\5\u026f\u0138\2\u07c0\u07c1\5\u026b\u0136\2\u07c1"+ + "\u07c2\5\u0283\u0142\2\u07c2\u07c3\5\u0291\u0149\2\u07c3\u07c4\5\u026f"+ + "\u0138\2\u07c4\u07c5\5\u0289\u0145\2\u07c5\u0172\3\2\2\2\u07c6\u07c7\5"+ + "\u0289\u0145\2\u07c7\u07c8\5\u026f\u0138\2\u07c8\u07c9\5\u026d\u0137\2"+ + "\u07c9\u07ca\5\u028f\u0148\2\u07ca\u07cb\5\u026b\u0136\2\u07cb\u07cc\5"+ + "\u026f\u0138\2\u07cc\u0174\3\2\2\2\u07cd\u07ce\5\u0289\u0145\2\u07ce\u07cf"+ + "\5\u026f\u0138\2\u07cf\u07d0\5\u0271\u0139\2\u07d0\u07d1\5\u026f\u0138"+ + "\2\u07d1\u07d2\5\u0289\u0145\2\u07d2\u07d3\5\u026f\u0138\2\u07d3\u07d4"+ + "\5\u0281\u0141\2\u07d4\u07d5\5\u026b\u0136\2\u07d5\u07d6\5\u026f\u0138"+ + "\2\u07d6\u07d7\5\u028b\u0146\2\u07d7\u0176\3\2\2\2\u07d8\u07d9\5\u0289"+ + "\u0145\2\u07d9\u07da\5\u026f\u0138\2\u07da\u07db\5\u0271\u0139\2\u07db"+ + "\u07dc\5\u0289\u0145\2\u07dc\u07dd\5\u026f\u0138\2\u07dd\u07de\5\u028b"+ + "\u0146\2\u07de\u07df\5\u0275\u013b\2\u07df\u0178\3\2\2\2\u07e0\u07e1\5"+ + "\u0289\u0145\2\u07e1\u07e2\5\u026f\u0138\2\u07e2\u07e3\5\u0281\u0141\2"+ + "\u07e3\u07e4\5\u0267\u0134\2\u07e4\u07e5\5\u027f\u0140\2\u07e5\u07e6\5"+ + "\u026f\u0138\2\u07e6\u017a\3\2\2\2\u07e7\u07e8\5\u0289\u0145\2\u07e8\u07e9"+ + "\5\u026f\u0138\2\u07e9\u07ea\5\u0285\u0143\2\u07ea\u07eb\5\u0267\u0134"+ + "\2\u07eb\u07ec\5\u0277\u013c\2\u07ec\u07ed\5\u0289\u0145\2\u07ed\u017c"+ + "\3\2\2\2\u07ee\u07ef\5\u0289\u0145\2\u07ef\u07f0\5\u026f\u0138\2\u07f0"+ + "\u07f1\5\u0285\u0143\2\u07f1\u07f2\5\u027d\u013f\2\u07f2\u07f3\5\u0267"+ + "\u0134\2\u07f3\u07f4\5\u026b\u0136\2\u07f4\u07f5\5\u026f\u0138\2\u07f5"+ + "\u017e\3\2\2\2\u07f6\u07f7\5\u0289\u0145\2\u07f7\u07f8\5\u026f\u0138\2"+ + "\u07f8\u07f9\5\u028b\u0146\2\u07f9\u07fa\5\u026f\u0138\2\u07fa\u07fb\5"+ + "\u028d\u0147\2\u07fb\u0180\3\2\2\2\u07fc\u07fd\5\u0289\u0145\2\u07fd\u07fe"+ + "\5\u026f\u0138\2\u07fe\u07ff\5\u028b\u0146\2\u07ff\u0800\5\u0285\u0143"+ + "\2\u0800\u0801\5\u026f\u0138\2\u0801\u0802\5\u026b\u0136\2\u0802\u0803"+ + "\5\u028d\u0147\2\u0803\u0182\3\2\2\2\u0804\u0805\5\u0289\u0145\2\u0805"+ + "\u0806\5\u026f\u0138\2\u0806\u0807\5\u028b\u0146\2\u0807\u0808\5\u028d"+ + "\u0147\2\u0808\u0809\5\u0289\u0145\2\u0809\u080a\5\u0277\u013c\2\u080a"+ + "\u080b\5\u026b\u0136\2\u080b\u080c\5\u028d\u0147\2\u080c\u0184\3\2\2\2"+ + "\u080d\u080e\5\u0289\u0145\2\u080e\u080f\5\u026f\u0138\2\u080f\u0810\5"+ + "\u0291\u0149\2\u0810\u0811\5\u0283\u0142\2\u0811\u0812\5\u027b\u013e\2"+ + "\u0812\u0813\5\u026f\u0138\2\u0813\u0186\3\2\2\2\u0814\u0815\5\u0289\u0145"+ + "\2\u0815\u0816\5\u0277\u013c\2\u0816\u0817\5\u0273\u013a\2\u0817\u0818"+ + "\5\u0275\u013b\2\u0818\u0819\5\u028d\u0147\2\u0819\u0188\3\2\2\2\u081a"+ + "\u081b\5\u0289\u0145\2\u081b\u081c\5\u027d\u013f\2\u081c\u081d\5\u0277"+ + "\u013c\2\u081d\u081e\5\u027b\u013e\2\u081e\u081f\5\u026f\u0138\2\u081f"+ + "\u0828\3\2\2\2\u0820\u0821\5\u0289\u0145\2\u0821\u0822\5\u026f\u0138\2"+ + "\u0822\u0823\5\u0273\u013a\2\u0823\u0824\5\u026f\u0138\2\u0824\u0825\5"+ + "\u0295\u014b\2\u0825\u0826\5\u0285\u0143\2\u0826\u0828\3\2\2\2\u0827\u081a"+ + "\3\2\2\2\u0827\u0820\3\2\2\2\u0828\u018a\3\2\2\2\u0829\u082a\5\u0289\u0145"+ + "\2\u082a\u082b\5\u0283\u0142\2\u082b\u082c\5\u027d\u013f\2\u082c\u082d"+ + "\5\u026f\u0138\2\u082d\u018c\3\2\2\2\u082e\u082f\5\u0289\u0145\2\u082f"+ + "\u0830\5\u0283\u0142\2\u0830\u0831\5\u027d\u013f\2\u0831\u0832\5\u026f"+ + "\u0138\2\u0832\u0833\5\u028b\u0146\2\u0833\u018e\3\2\2\2\u0834\u0835\5"+ + "\u0289\u0145\2\u0835\u0836\5\u0283\u0142\2\u0836\u0837\5\u027d\u013f\2"+ + "\u0837\u0838\5\u027d\u013f\2\u0838\u0839\5\u0269\u0135\2\u0839\u083a\5"+ + "\u0267\u0134\2\u083a\u083b\5\u026b\u0136\2\u083b\u083c\5\u027b\u013e\2"+ + "\u083c\u0190\3\2\2\2\u083d\u083e\5\u0289\u0145\2\u083e\u083f\5\u0283\u0142"+ + "\2\u083f\u0840\5\u027d\u013f\2\u0840\u0841\5\u027d\u013f\2\u0841\u0842"+ + "\5\u028f\u0148\2\u0842\u0843\5\u0285\u0143\2\u0843\u0192\3\2\2\2\u0844"+ + "\u0845\5\u0289\u0145\2\u0845\u0846\5\u0283\u0142\2\u0846\u0847\5\u0293"+ + "\u014a\2\u0847\u0194\3\2\2\2\u0848\u0849\5\u0289\u0145\2\u0849\u084a\5"+ + "\u0283\u0142\2\u084a\u084b\5\u0293\u014a\2\u084b\u084c\5\u028b\u0146\2"+ + "\u084c\u0196\3\2\2\2\u084d\u084e\5\u028b\u0146\2\u084e\u084f\5\u026f\u0138"+ + "\2\u084f\u0850\5\u026b\u0136\2\u0850\u0851\5\u0283\u0142\2\u0851\u0852"+ + "\5\u0281\u0141\2\u0852\u0853\5\u026d\u0137\2\u0853\u0198\3\2\2\2\u0854"+ + "\u0855\5\u028b\u0146\2\u0855\u0856\5\u026b\u0136\2\u0856\u0857\5\u0275"+ + "\u013b\2\u0857\u0858\5\u026f\u0138\2\u0858\u0859\5\u027f\u0140\2\u0859"+ + "\u085a\5\u0267\u0134\2\u085a\u019a\3\2\2\2\u085b\u085c\5\u028b\u0146\2"+ + "\u085c\u085d\5\u026f\u0138\2\u085d\u085e\5\u027d\u013f\2\u085e\u085f\5"+ + "\u026f\u0138\2\u085f\u0860\5\u026b\u0136\2\u0860\u0861\5\u028d\u0147\2"+ + "\u0861\u019c\3\2\2\2\u0862\u0863\5\u028b\u0146\2\u0863\u0864\5\u026f\u0138"+ + "\2\u0864\u0865\5\u027f\u0140\2\u0865\u0866\5\u0277\u013c\2\u0866\u019e"+ + "\3\2\2\2\u0867\u0868\5\u028b\u0146\2\u0868\u0869\5\u026f\u0138\2\u0869"+ + "\u086a\5\u0285\u0143\2\u086a\u086b\5\u0267\u0134\2\u086b\u086c\5\u0289"+ + "\u0145\2\u086c\u086d\5\u0267\u0134\2\u086d\u086e\5\u028d\u0147\2\u086e"+ + "\u086f\5\u026f\u0138\2\u086f\u0870\5\u026d\u0137\2\u0870\u01a0\3\2\2\2"+ + "\u0871\u0872\5\u028b\u0146\2\u0872\u0873\5\u026f\u0138\2\u0873\u0874\5"+ + "\u0289\u0145\2\u0874\u0875\5\u026d\u0137\2\u0875\u0876\5\u026f\u0138\2"+ + "\u0876\u01a2\3\2\2\2\u0877\u0878\5\u028b\u0146\2\u0878\u0879\5\u026f\u0138"+ + "\2\u0879\u087a\5\u0289\u0145\2\u087a\u087b\5\u026d\u0137\2\u087b\u087c"+ + "\5\u026f\u0138\2\u087c\u087d\5\u0285\u0143\2\u087d\u087e\5\u0289\u0145"+ + "\2\u087e\u087f\5\u0283\u0142\2\u087f\u0880\5\u0285\u0143\2\u0880\u0881"+ + "\5\u026f\u0138\2\u0881\u0882\5\u0289\u0145\2\u0882\u0883\5\u028d\u0147"+ + "\2\u0883\u0884\5\u0277\u013c\2\u0884\u0885\5\u026f\u0138\2\u0885\u0886"+ + "\5\u028b\u0146\2\u0886\u01a4\3\2\2\2\u0887\u0888\5\u028b\u0146\2\u0888"+ + "\u0889\5\u026f\u0138\2\u0889\u088a\5\u028b\u0146\2\u088a\u088b\5\u028b"+ + "\u0146\2\u088b\u088c\5\u0277\u013c\2\u088c\u088d\5\u0283\u0142\2\u088d"+ + "\u088e\5\u0281\u0141\2\u088e\u088f\5\u023b\u011e\2\u088f\u0890\5\u028f"+ + "\u0148\2\u0890\u0891\5\u028b\u0146\2\u0891\u0892\5\u026f\u0138\2\u0892"+ + "\u0893\5\u0289\u0145\2\u0893\u01a6\3\2\2\2\u0894\u0895\5\u028b\u0146\2"+ + "\u0895\u0896\5\u026f\u0138\2\u0896\u0897\5\u028d\u0147\2\u0897\u01a8\3"+ + "\2\2\2\u0898\u0899\5\u027f\u0140\2\u0899\u089a\5\u0277\u013c\2\u089a\u089b"+ + "\5\u0281\u0141\2\u089b\u089c\5\u028f\u0148\2\u089c\u089d\5\u028b\u0146"+ + "\2\u089d\u01aa\3\2\2\2\u089e\u089f\5\u028b\u0146\2\u089f\u08a0\5\u026f"+ + "\u0138\2\u08a0\u08a1\5\u028d\u0147\2\u08a1\u08a2\5\u028b\u0146\2\u08a2"+ + "\u01ac\3\2\2\2\u08a3\u08a4\5\u028b\u0146\2\u08a4\u08a5\5\u0275\u013b\2"+ + "\u08a5\u08a6\5\u0283\u0142\2\u08a6\u08a7\5\u0293\u014a\2\u08a7\u01ae\3"+ + "\2\2\2\u08a8\u08a9\5\u028b\u0146\2\u08a9\u08aa\5\u027b\u013e\2\u08aa\u08ab"+ + "\5\u026f\u0138\2\u08ab\u08ac\5\u0293\u014a\2\u08ac\u08ad\5\u026f\u0138"+ + "\2\u08ad\u08ae\5\u026d\u0137\2\u08ae\u01b0\3\2\2\2\u08af\u08b0\5\u028b"+ + "\u0146\2\u08b0\u08b1\5\u0283\u0142\2\u08b1\u08b2\5\u027f\u0140\2\u08b2"+ + "\u08b3\5\u026f\u0138\2\u08b3\u01b2\3\2\2\2\u08b4\u08b5\5\u028b\u0146\2"+ + "\u08b5\u08b6\5\u0283\u0142\2\u08b6\u08b7\5\u0289\u0145\2\u08b7\u08b8\5"+ + "\u028d\u0147\2\u08b8\u01b4\3\2\2\2\u08b9\u08ba\5\u028b\u0146\2\u08ba\u08bb"+ + "\5\u0283\u0142\2\u08bb\u08bc\5\u0289\u0145\2\u08bc\u08bd\5\u028d\u0147"+ + "\2\u08bd\u08be\5\u026f\u0138\2\u08be\u08bf\5\u026d\u0137\2\u08bf\u01b6"+ + "\3\2\2\2\u08c0\u08c1\5\u028b\u0146\2\u08c1\u08c2\5\u028d\u0147\2\u08c2"+ + "\u08c3\5\u0267\u0134\2\u08c3\u08c4\5\u0289\u0145\2\u08c4\u08c5\5\u028d"+ + "\u0147\2\u08c5\u01b8\3\2\2\2\u08c6\u08c7\5\u028b\u0146\2\u08c7\u08c8\5"+ + "\u028d\u0147\2\u08c8\u08c9\5\u0267\u0134\2\u08c9\u08ca\5\u028d\u0147\2"+ + "\u08ca\u08cb\5\u0277\u013c\2\u08cb\u08cc\5\u028b\u0146\2\u08cc\u08cd\5"+ + "\u028d\u0147\2\u08cd\u08ce\5\u0277\u013c\2\u08ce\u08cf\5\u026b\u0136\2"+ + "\u08cf\u08d0\5\u028b\u0146\2\u08d0\u01ba\3\2\2\2\u08d1\u08d2\5\u028b\u0146"+ + "\2\u08d2\u08d3\5\u028d\u0147\2\u08d3\u08d4\5\u0283\u0142\2\u08d4\u08d5"+ + "\5\u0289\u0145\2\u08d5\u08d6\5\u026f\u0138\2\u08d6\u08d7\5\u026d\u0137"+ + "\2\u08d7\u01bc\3\2\2\2\u08d8\u08d9\5\u028b\u0146\2\u08d9\u08da\5\u028d"+ + "\u0147\2\u08da\u08db\5\u0289\u0145\2\u08db\u08dc\5\u0267\u0134\2\u08dc"+ + "\u08dd\5\u028d\u0147\2\u08dd\u08de\5\u0277\u013c\2\u08de\u08df\5\u0271"+ + "\u0139\2\u08df\u08e0\5\u0297\u014c\2\u08e0\u01be\3\2\2\2\u08e1\u08e2\5"+ + "\u028b\u0146\2\u08e2\u08e3\5\u028d\u0147\2\u08e3\u08e4\5\u0289\u0145\2"+ + "\u08e4\u08e5\5\u028f\u0148\2\u08e5\u08e6\5\u026b\u0136\2\u08e6\u08e7\5"+ + "\u028d\u0147\2\u08e7\u01c0\3\2\2\2\u08e8\u08e9\5\u028b\u0146\2\u08e9\u08ea"+ + "\5\u028f\u0148\2\u08ea\u08eb\5\u0269\u0135\2\u08eb\u08ec\5\u028b\u0146"+ + "\2\u08ec\u08ed\5\u028d\u0147\2\u08ed\u08ee\5\u0289\u0145\2\u08ee\u01c2"+ + "\3\2\2\2\u08ef\u08f0\5\u028b\u0146\2\u08f0\u08f1\5\u028f\u0148\2\u08f1"+ + "\u08f2\5\u0269\u0135\2\u08f2\u08f3\5\u028b\u0146\2\u08f3\u08f4\5\u028d"+ + "\u0147\2\u08f4\u08f5\5\u0289\u0145\2\u08f5\u08f6\5\u0277\u013c\2\u08f6"+ + "\u08f7\5\u0281\u0141\2\u08f7\u08f8\5\u0273\u013a\2\u08f8\u01c4\3\2\2\2"+ + "\u08f9\u08fa\5\u028b\u0146\2\u08fa\u08fb\5\u0297\u014c\2\u08fb\u08fc\5"+ + "\u0281\u0141\2\u08fc\u08fd\5\u026b\u0136\2\u08fd\u01c6\3\2\2\2\u08fe\u08ff"+ + "\5\u028d\u0147\2\u08ff\u0900\5\u0267\u0134\2\u0900\u0901\5\u0269\u0135"+ + "\2\u0901\u0902\5\u027d\u013f\2\u0902\u0903\5\u026f\u0138\2\u0903\u01c8"+ + "\3\2\2\2\u0904\u0905\5\u028d\u0147\2\u0905\u0906\5\u0267\u0134\2\u0906"+ + "\u0907\5\u0269\u0135\2\u0907\u0908\5\u027d\u013f\2\u0908\u0909\5\u026f"+ + "\u0138\2\u0909\u090a\5\u028b\u0146\2\u090a\u01ca\3\2\2\2\u090b\u090c\5"+ + "\u028d\u0147\2\u090c\u090d\5\u0267\u0134\2\u090d\u090e\5\u0269\u0135\2"+ + "\u090e\u090f\5\u027d\u013f\2\u090f\u0910\5\u026f\u0138\2\u0910\u0911\5"+ + "\u028b\u0146\2\u0911\u0912\5\u0267\u0134\2\u0912\u0913\5\u027f\u0140\2"+ + "\u0913\u0914\5\u0285\u0143\2\u0914\u0915\5\u027d\u013f\2\u0915\u0916\5"+ + "\u026f\u0138\2\u0916\u01cc\3\2\2\2\u0917\u0918\5\u028d\u0147\2\u0918\u0919"+ + "\5\u0269\u0135\2\u0919\u091a\5\u027d\u013f\2\u091a\u091b\5\u0285\u0143"+ + "\2\u091b\u091c\5\u0289\u0145\2\u091c\u091d\5\u0283\u0142\2\u091d\u091e"+ + "\5\u0285\u0143\2\u091e\u091f\5\u026f\u0138\2\u091f\u0920\5\u0289\u0145"+ + "\2\u0920\u0921\5\u028d\u0147\2\u0921\u0922\5\u0277\u013c\2\u0922\u0923"+ + "\5\u026f\u0138\2\u0923\u0924\5\u028b\u0146\2\u0924\u01ce\3\2\2\2\u0925"+ + "\u0926\5\u028d\u0147\2\u0926\u0927\5\u026f\u0138\2\u0927\u0928\5\u027f"+ + "\u0140\2\u0928\u0929\5\u0285\u0143\2\u0929\u092a\5\u0283\u0142\2\u092a"+ + "\u092b\5\u0289\u0145\2\u092b\u092c\5\u0267\u0134\2\u092c\u092d\5\u0289"+ + "\u0145\2\u092d\u092e\5\u0297\u014c\2\u092e\u0935\3\2\2\2\u092f\u0930\5"+ + "\u028d\u0147\2\u0930\u0931\5\u026f\u0138\2\u0931\u0932\5\u027f\u0140\2"+ + "\u0932\u0933\5\u0285\u0143\2\u0933\u0935\3\2\2\2\u0934\u0925\3\2\2\2\u0934"+ + "\u092f\3\2\2\2\u0935\u01d0\3\2\2\2\u0936\u0937\5\u028d\u0147\2\u0937\u0938"+ + "\5\u026f\u0138\2\u0938\u0939\5\u0289\u0145\2\u0939\u093a\5\u027f\u0140"+ + "\2\u093a\u093b\5\u0277\u013c\2\u093b\u093c\5\u0281\u0141\2\u093c\u093d"+ + "\5\u0267\u0134\2\u093d\u093e\5\u028d\u0147\2\u093e\u093f\5\u026f\u0138"+ + "\2\u093f\u0940\5\u026d\u0137\2\u0940\u01d2\3\2\2\2\u0941\u0942\5\u028d"+ + "\u0147\2\u0942\u0943\5\u0275\u013b\2\u0943\u0944\5\u026f\u0138\2\u0944"+ + "\u0945\5\u0281\u0141\2\u0945\u01d4\3\2\2\2\u0946\u0947\5\u028d\u0147\2"+ + "\u0947\u0948\5\u0277\u013c\2\u0948\u0949\5\u027f\u0140\2\u0949\u094a\5"+ + "\u026f\u0138\2\u094a\u01d6\3\2\2\2\u094b\u094c\5\u028d\u0147\2\u094c\u094d"+ + "\5\u0283\u0142\2\u094d\u01d8\3\2\2\2\u094e\u094f\5\u028d\u0147\2\u094f"+ + "\u0950\5\u0283\u0142\2\u0950\u0951\5\u028f\u0148\2\u0951\u0952\5\u026b"+ + "\u0136\2\u0952\u0953\5\u0275\u013b\2\u0953\u01da\3\2\2\2\u0954\u0955\5"+ + "\u028d\u0147\2\u0955\u0956\5\u0289\u0145\2\u0956\u0957\5\u0267\u0134\2"+ + "\u0957\u0958\5\u0277\u013c\2\u0958\u0959\5\u027d\u013f\2\u0959\u095a\5"+ + "\u0277\u013c\2\u095a\u095b\5\u0281\u0141\2\u095b\u095c\5\u0273\u013a\2"+ + "\u095c\u01dc\3\2\2\2\u095d\u095e\5\u028d\u0147\2\u095e\u095f\5\u0289\u0145"+ + "\2\u095f\u0960\5\u0267\u0134\2\u0960\u0961\5\u0281\u0141\2\u0961\u0962"+ + "\5\u028b\u0146\2\u0962\u0963\5\u0267\u0134\2\u0963\u0964\5\u026b\u0136"+ + "\2\u0964\u0965\5\u028d\u0147\2\u0965\u0966\5\u0277\u013c\2\u0966\u0967"+ + "\5\u0283\u0142\2\u0967\u0968\5\u0281\u0141\2\u0968\u01de\3\2\2\2\u0969"+ + "\u096a\5\u028d\u0147\2\u096a\u096b\5\u0289\u0145\2\u096b\u096c\5\u0267"+ + "\u0134\2\u096c\u096d\5\u0281\u0141\2\u096d\u096e\5\u028b\u0146\2\u096e"+ + "\u096f\5\u0267\u0134\2\u096f\u0970\5\u026b\u0136\2\u0970\u0971\5\u028d"+ + "\u0147\2\u0971\u0972\5\u0277\u013c\2\u0972\u0973\5\u0283\u0142\2\u0973"+ + "\u0974\5\u0281\u0141\2\u0974\u0975\5\u028b\u0146\2\u0975\u01e0\3\2\2\2"+ + "\u0976\u0977\5\u028d\u0147\2\u0977\u0978\5\u0289\u0145\2\u0978\u0979\5"+ + "\u0267\u0134\2\u0979\u097a\5\u0281\u0141\2\u097a\u097b\5\u028b\u0146\2"+ + "\u097b\u097c\5\u0271\u0139\2\u097c\u097d\5\u0283\u0142\2\u097d\u097e\5"+ + "\u0289\u0145\2\u097e\u097f\5\u027f\u0140\2\u097f\u01e2\3\2\2\2\u0980\u0981"+ + "\5\u028d\u0147\2\u0981\u0982\5\u0289\u0145\2\u0982\u0983\5\u0277\u013c"+ + "\2\u0983\u0984\5\u027f\u0140\2\u0984\u01e4\3\2\2\2\u0985\u0986\5\u028d"+ + "\u0147\2\u0986\u0987\5\u0289\u0145\2\u0987\u0988\5\u028f\u0148\2\u0988"+ + "\u0989\5\u026f\u0138\2\u0989\u01e6\3\2\2\2\u098a\u098b\5\u028d\u0147\2"+ + "\u098b\u098c\5\u0289\u0145\2\u098c\u098d\5\u028f\u0148\2\u098d\u098e\5"+ + "\u0281\u0141\2\u098e\u098f\5\u026b\u0136\2\u098f\u0990\5\u0267\u0134\2"+ + "\u0990\u0991\5\u028d\u0147\2\u0991\u0992\5\u026f\u0138\2\u0992\u01e8\3"+ + "\2\2\2\u0993\u0994\5\u028d\u0147\2\u0994\u0995\5\u0289\u0145\2\u0995\u0996"+ + "\5\u0297\u014c\2\u0996\u0997\5\u023b\u011e\2\u0997\u0998\5\u026b\u0136"+ + "\2\u0998\u0999\5\u0267\u0134\2\u0999\u099a\5\u028b\u0146\2\u099a\u099b"+ + "\5\u028d\u0147\2\u099b\u01ea\3\2\2\2\u099c\u099d\5\u028d\u0147\2\u099d"+ + "\u099e\5\u0297\u014c\2\u099e\u099f\5\u0285\u0143\2\u099f\u09a0\5\u026f"+ + "\u0138\2\u09a0\u01ec\3\2\2\2\u09a1\u09a2\5\u028f\u0148\2\u09a2\u09a3\5"+ + "\u0281\u0141\2\u09a3\u09a4\5\u0267\u0134\2\u09a4\u09a5\5\u0289\u0145\2"+ + "\u09a5\u09a6\5\u026b\u0136\2\u09a6\u09a7\5\u0275\u013b\2\u09a7\u09a8\5"+ + "\u0277\u013c\2\u09a8\u09a9\5\u0291\u0149\2\u09a9\u09aa\5\u026f\u0138\2"+ + "\u09aa\u01ee\3\2\2\2\u09ab\u09ac\5\u028f\u0148\2\u09ac\u09ad\5\u0281\u0141"+ + "\2\u09ad\u09ae\5\u0269\u0135\2\u09ae\u09af\5\u0283\u0142\2\u09af\u09b0"+ + "\5\u028f\u0148\2\u09b0\u09b1\5\u0281\u0141\2\u09b1\u09b2\5\u026d\u0137"+ + "\2\u09b2\u09b3\5\u026f\u0138\2\u09b3\u09b4\5\u026d\u0137\2\u09b4\u01f0"+ + "\3\2\2\2\u09b5\u09b6\5\u028f\u0148\2\u09b6\u09b7\5\u0281\u0141\2\u09b7"+ + "\u09b8\5\u026b\u0136\2\u09b8\u09b9\5\u0267\u0134\2\u09b9\u09ba\5\u026b"+ + "\u0136\2\u09ba\u09bb\5\u0275\u013b\2\u09bb\u09bc\5\u026f\u0138\2\u09bc"+ + "\u01f2\3\2\2\2\u09bd\u09be\5\u028f\u0148\2\u09be\u09bf\5\u0281\u0141\2"+ + "\u09bf\u09c0\5\u0277\u013c\2\u09c0\u09c1\5\u0283\u0142\2\u09c1\u09c2\5"+ + "\u0281\u0141\2\u09c2\u01f4\3\2\2\2\u09c3\u09c4\5\u028f\u0148\2\u09c4\u09c5"+ + "\5\u0281\u0141\2\u09c5\u09c6\5\u0277\u013c\2\u09c6\u09c7\5\u0287\u0144"+ + "\2\u09c7\u09c8\5\u028f\u0148\2\u09c8\u09c9\5\u026f\u0138\2\u09c9\u01f6"+ + "\3\2\2\2\u09ca\u09cb\5\u028f\u0148\2\u09cb\u09cc\5\u0281\u0141\2\u09cc"+ + "\u09cd\5\u027b\u013e\2\u09cd\u09ce\5\u0281\u0141\2\u09ce\u09cf\5\u0283"+ + "\u0142\2\u09cf\u09d0\5\u0293\u014a\2\u09d0\u09d1\5\u0281\u0141\2\u09d1"+ + "\u01f8\3\2\2\2\u09d2\u09d3\5\u028f\u0148\2\u09d3\u09d4\5\u0281\u0141\2"+ + "\u09d4\u09d5\5\u027d\u013f\2\u09d5\u09d6\5\u0283\u0142\2\u09d6\u09d7\5"+ + "\u026b\u0136\2\u09d7\u09d8\5\u027b\u013e\2\u09d8\u01fa\3\2\2\2\u09d9\u09da"+ + "\5\u028f\u0148\2\u09da\u09db\5\u0281\u0141\2\u09db\u09dc\5\u028b\u0146"+ + "\2\u09dc\u09dd\5\u026f\u0138\2\u09dd\u09de\5\u028d\u0147\2\u09de\u01fc"+ + "\3\2\2\2\u09df\u09e0\5\u028f\u0148\2\u09e0\u09e1\5\u0285\u0143\2\u09e1"+ + "\u09e2\5\u026d\u0137\2\u09e2\u09e3\5\u0267\u0134\2\u09e3\u09e4\5\u028d"+ + "\u0147\2\u09e4\u09e5\5\u026f\u0138\2"; + private static final String _serializedATNSegment1 = + "\u09e5\u01fe\3\2\2\2\u09e6\u09e7\5\u028f\u0148\2\u09e7\u09e8\5\u028b\u0146"+ + "\2\u09e8\u09e9\5\u026f\u0138\2\u09e9\u0200\3\2\2\2\u09ea\u09eb\5\u028f"+ + "\u0148\2\u09eb\u09ec\5\u028b\u0146\2\u09ec\u09ed\5\u026f\u0138\2\u09ed"+ + "\u09ee\5\u0289\u0145\2\u09ee\u0202\3\2\2\2\u09ef\u09f0\5\u028f\u0148\2"+ + "\u09f0\u09f1\5\u028b\u0146\2\u09f1\u09f2\5\u0277\u013c\2\u09f2\u09f3\5"+ + "\u0281\u0141\2\u09f3\u09f4\5\u0273\u013a\2\u09f4\u0204\3\2\2\2\u09f5\u09f6"+ + "\5\u0291\u0149\2\u09f6\u09f7\5\u0267\u0134\2\u09f7\u09f8\5\u027d\u013f"+ + "\2\u09f8\u09f9\5\u028f\u0148\2\u09f9\u09fa\5\u026f\u0138\2\u09fa\u09fb"+ + "\5\u028b\u0146\2\u09fb\u0206\3\2\2\2\u09fc\u09fd\5\u0291\u0149\2\u09fd"+ + "\u09fe\5\u0277\u013c\2\u09fe\u09ff\5\u026f\u0138\2\u09ff\u0a00\5\u0293"+ + "\u014a\2\u0a00\u0208\3\2\2\2\u0a01\u0a02\5\u0291\u0149\2\u0a02\u0a03\5"+ + "\u0277\u013c\2\u0a03\u0a04\5\u026f\u0138\2\u0a04\u0a05\5\u0293\u014a\2"+ + "\u0a05\u0a06\5\u028b\u0146\2\u0a06\u020a\3\2\2\2\u0a07\u0a08\5\u0293\u014a"+ + "\2\u0a08\u0a09\5\u0275\u013b\2\u0a09\u0a0a\5\u026f\u0138\2\u0a0a\u0a0b"+ + "\5\u0281\u0141\2\u0a0b\u020c\3\2\2\2\u0a0c\u0a0d\5\u0293\u014a\2\u0a0d"+ + "\u0a0e\5\u0275\u013b\2\u0a0e\u0a0f\5\u026f\u0138\2\u0a0f\u0a10\5\u0289"+ + "\u0145\2\u0a10\u0a11\5\u026f\u0138\2\u0a11\u020e\3\2\2\2\u0a12\u0a13\5"+ + "\u0293\u014a\2\u0a13\u0a14\5\u0277\u013c\2\u0a14\u0a15\5\u0281\u0141\2"+ + "\u0a15\u0a16\5\u026d\u0137\2\u0a16\u0a17\5\u0283\u0142\2\u0a17\u0a18\5"+ + "\u0293\u014a\2\u0a18\u0210\3\2\2\2\u0a19\u0a1a\5\u0293\u014a\2\u0a1a\u0a1b"+ + "\5\u0277\u013c\2\u0a1b\u0a1c\5\u028d\u0147\2\u0a1c\u0a1d\5\u0275\u013b"+ + "\2\u0a1d\u0212\3\2\2\2\u0a1e\u0a1f\5\u0297\u014c\2\u0a1f\u0a20\5\u026f"+ + "\u0138\2\u0a20\u0a21\5\u0267\u0134\2\u0a21\u0a22\5\u0289\u0145\2\u0a22"+ + "\u0214\3\2\2\2\u0a23\u0a24\5\u0299\u014d\2\u0a24\u0a25\5\u0283\u0142\2"+ + "\u0a25\u0a26\5\u0281\u0141\2\u0a26\u0a27\5\u026f\u0138\2\u0a27\u0216\3"+ + "\2\2\2\u0a28\u0a2c\7?\2\2\u0a29\u0a2a\7?\2\2\u0a2a\u0a2c\7?\2\2\u0a2b"+ + "\u0a28\3\2\2\2\u0a2b\u0a29\3\2\2\2\u0a2c\u0218\3\2\2\2\u0a2d\u0a2e\7>"+ + "\2\2\u0a2e\u0a2f\7?\2\2\u0a2f\u0a30\7@\2\2\u0a30\u021a\3\2\2\2\u0a31\u0a32"+ + "\7>\2\2\u0a32\u0a33\7@\2\2\u0a33\u021c\3\2\2\2\u0a34\u0a35\7#\2\2\u0a35"+ + "\u0a36\7?\2\2\u0a36\u021e\3\2\2\2\u0a37\u0a38\7>\2\2\u0a38\u0220\3\2\2"+ + "\2\u0a39\u0a3a\7>\2\2\u0a3a\u0a3e\7?\2\2\u0a3b\u0a3c\7#\2\2\u0a3c\u0a3e"+ + "\7@\2\2\u0a3d\u0a39\3\2\2\2\u0a3d\u0a3b\3\2\2\2\u0a3e\u0222\3\2\2\2\u0a3f"+ + "\u0a40\7@\2\2\u0a40\u0224\3\2\2\2\u0a41\u0a42\7@\2\2\u0a42\u0a46\7?\2"+ + "\2\u0a43\u0a44\7#\2\2\u0a44\u0a46\7>\2\2\u0a45\u0a41\3\2\2\2\u0a45\u0a43"+ + "\3\2\2\2\u0a46\u0226\3\2\2\2\u0a47\u0a48\7-\2\2\u0a48\u0228\3\2\2\2\u0a49"+ + "\u0a4a\7/\2\2\u0a4a\u022a\3\2\2\2\u0a4b\u0a4c\7,\2\2\u0a4c\u022c\3\2\2"+ + "\2\u0a4d\u0a4e\7\61\2\2\u0a4e\u022e\3\2\2\2\u0a4f\u0a50\7\'\2\2\u0a50"+ + "\u0230\3\2\2\2\u0a51\u0a52\7\u0080\2\2\u0a52\u0232\3\2\2\2\u0a53\u0a54"+ + "\7(\2\2\u0a54\u0234\3\2\2\2\u0a55\u0a56\7~\2\2\u0a56\u0236\3\2\2\2\u0a57"+ + "\u0a58\7~\2\2\u0a58\u0a59\7~\2\2\u0a59\u0238\3\2\2\2\u0a5a\u0a5b\7`\2"+ + "\2\u0a5b\u023a\3\2\2\2\u0a5c\u0a5d\7a\2\2\u0a5d\u023c\3\2\2\2\u0a5e\u0a5f"+ + "\7#\2\2\u0a5f\u023e\3\2\2\2\u0a60\u0a61\7\60\2\2\u0a61\u0240\3\2\2\2\u0a62"+ + "\u0a63\7.\2\2\u0a63\u0242\3\2\2\2\u0a64\u0a65\7<\2\2\u0a65\u0244\3\2\2"+ + "\2\u0a66\u0a67\7=\2\2\u0a67\u0246\3\2\2\2\u0a68\u0a6e\7)\2\2\u0a69\u0a6d"+ + "\n\2\2\2\u0a6a\u0a6b\7^\2\2\u0a6b\u0a6d\13\2\2\2\u0a6c\u0a69\3\2\2\2\u0a6c"+ + "\u0a6a\3\2\2\2\u0a6d\u0a70\3\2\2\2\u0a6e\u0a6c\3\2\2\2\u0a6e\u0a6f\3\2"+ + "\2\2\u0a6f\u0a71\3\2\2\2\u0a70\u0a6e\3\2\2\2\u0a71\u0a7d\7)\2\2\u0a72"+ + "\u0a78\7$\2\2\u0a73\u0a77\n\3\2\2\u0a74\u0a75\7^\2\2\u0a75\u0a77\13\2"+ + "\2\2\u0a76\u0a73\3\2\2\2\u0a76\u0a74\3\2\2\2\u0a77\u0a7a\3\2\2\2\u0a78"+ + "\u0a76\3\2\2\2\u0a78\u0a79\3\2\2\2\u0a79\u0a7b\3\2\2\2\u0a7a\u0a78\3\2"+ + "\2\2\u0a7b\u0a7d\7$\2\2\u0a7c\u0a68\3\2\2\2\u0a7c\u0a72\3\2\2\2\u0a7d"+ + "\u0248\3\2\2\2\u0a7e\u0a80\5\u0263\u0132\2\u0a7f\u0a7e\3\2\2\2\u0a80\u0a81"+ + "\3\2\2\2\u0a81\u0a7f\3\2\2\2\u0a81\u0a82\3\2\2\2\u0a82\u0a83\3\2\2\2\u0a83"+ + "\u0a84\7N\2\2\u0a84\u024a\3\2\2\2\u0a85\u0a87\5\u0263\u0132\2\u0a86\u0a85"+ + "\3\2\2\2\u0a87\u0a88\3\2\2\2\u0a88\u0a86\3\2\2\2\u0a88\u0a89\3\2\2\2\u0a89"+ + "\u0a8a\3\2\2\2\u0a8a\u0a8b\7U\2\2\u0a8b\u024c\3\2\2\2\u0a8c\u0a8e\5\u0263"+ + "\u0132\2\u0a8d\u0a8c\3\2\2\2\u0a8e\u0a8f\3\2\2\2\u0a8f\u0a8d\3\2\2\2\u0a8f"+ + "\u0a90\3\2\2\2\u0a90\u0a91\3\2\2\2\u0a91\u0a92\7[\2\2\u0a92\u024e\3\2"+ + "\2\2\u0a93\u0a95\5\u0263\u0132\2\u0a94\u0a93\3\2\2\2\u0a95\u0a96\3\2\2"+ + "\2\u0a96\u0a94\3\2\2\2\u0a96\u0a97\3\2\2\2\u0a97\u0250\3\2\2\2\u0a98\u0a9a"+ + "\5\u0263\u0132\2\u0a99\u0a98\3\2\2\2\u0a9a\u0a9b\3\2\2\2\u0a9b\u0a99\3"+ + "\2\2\2\u0a9b\u0a9c\3\2\2\2\u0a9c\u0a9d\3\2\2\2\u0a9d\u0a9e\5\u0261\u0131"+ + "\2\u0a9e\u0aa4\3\2\2\2\u0a9f\u0aa0\5\u025f\u0130\2\u0aa0\u0aa1\5\u0261"+ + "\u0131\2\u0aa1\u0aa2\6\u0129\2\2\u0aa2\u0aa4\3\2\2\2\u0aa3\u0a99\3\2\2"+ + "\2\u0aa3\u0a9f\3\2\2\2\u0aa4\u0252\3\2\2\2\u0aa5\u0aa6\5\u025f\u0130\2"+ + "\u0aa6\u0aa7\6\u012a\3\2\u0aa7\u0254\3\2\2\2\u0aa8\u0aaa\5\u0263\u0132"+ + "\2\u0aa9\u0aa8\3\2\2\2\u0aaa\u0aab\3\2\2\2\u0aab\u0aa9\3\2\2\2\u0aab\u0aac"+ + "\3\2\2\2\u0aac\u0aae\3\2\2\2\u0aad\u0aaf\5\u0261\u0131\2\u0aae\u0aad\3"+ + "\2\2\2\u0aae\u0aaf\3\2\2\2\u0aaf\u0ab0\3\2\2\2\u0ab0\u0ab1\7H\2\2\u0ab1"+ + "\u0aba\3\2\2\2\u0ab2\u0ab4\5\u025f\u0130\2\u0ab3\u0ab5\5\u0261\u0131\2"+ + "\u0ab4\u0ab3\3\2\2\2\u0ab4\u0ab5\3\2\2\2\u0ab5\u0ab6\3\2\2\2\u0ab6\u0ab7"+ + "\7H\2\2\u0ab7\u0ab8\6\u012b\4\2\u0ab8\u0aba\3\2\2\2\u0ab9\u0aa9\3\2\2"+ + "\2\u0ab9\u0ab2\3\2\2\2\u0aba\u0256\3\2\2\2\u0abb\u0abd\5\u0263\u0132\2"+ + "\u0abc\u0abb\3\2\2\2\u0abd\u0abe\3\2\2\2\u0abe\u0abc\3\2\2\2\u0abe\u0abf"+ + "\3\2\2\2\u0abf\u0ac1\3\2\2\2\u0ac0\u0ac2\5\u0261\u0131\2\u0ac1\u0ac0\3"+ + "\2\2\2\u0ac1\u0ac2\3\2\2\2\u0ac2\u0ac3\3\2\2\2\u0ac3\u0ac4\7F\2\2\u0ac4"+ + "\u0acd\3\2\2\2\u0ac5\u0ac7\5\u025f\u0130\2\u0ac6\u0ac8\5\u0261\u0131\2"+ + "\u0ac7\u0ac6\3\2\2\2\u0ac7\u0ac8\3\2\2\2\u0ac8\u0ac9\3\2\2\2\u0ac9\u0aca"+ + "\7F\2\2\u0aca\u0acb\6\u012c\5\2\u0acb\u0acd\3\2\2\2\u0acc\u0abc\3\2\2"+ + "\2\u0acc\u0ac5\3\2\2\2\u0acd\u0258\3\2\2\2\u0ace\u0ad0\5\u0263\u0132\2"+ + "\u0acf\u0ace\3\2\2\2\u0ad0\u0ad1\3\2\2\2\u0ad1\u0acf\3\2\2\2\u0ad1\u0ad2"+ + "\3\2\2\2\u0ad2\u0ad4\3\2\2\2\u0ad3\u0ad5\5\u0261\u0131\2\u0ad4\u0ad3\3"+ + "\2\2\2\u0ad4\u0ad5\3\2\2\2\u0ad5\u0ad6\3\2\2\2\u0ad6\u0ad7\7D\2\2\u0ad7"+ + "\u0ad8\7F\2\2\u0ad8\u0ae3\3\2\2\2\u0ad9\u0adb\5\u025f\u0130\2\u0ada\u0adc"+ + "\5\u0261\u0131\2\u0adb\u0ada\3\2\2\2\u0adb\u0adc\3\2\2\2\u0adc\u0add\3"+ + "\2\2\2\u0add\u0ade\7D\2\2\u0ade\u0adf\7F\2\2\u0adf\u0ae0\3\2\2\2\u0ae0"+ + "\u0ae1\6\u012d\6\2\u0ae1\u0ae3\3\2\2\2\u0ae2\u0acf\3\2\2\2\u0ae2\u0ad9"+ + "\3\2\2\2\u0ae3\u025a\3\2\2\2\u0ae4\u0ae8\5\u0265\u0133\2\u0ae5\u0ae8\5"+ + "\u0263\u0132\2\u0ae6\u0ae8\7a\2\2\u0ae7\u0ae4\3\2\2\2\u0ae7\u0ae5\3\2"+ + "\2\2\u0ae7\u0ae6\3\2\2\2\u0ae8\u0ae9\3\2\2\2\u0ae9\u0ae7\3\2\2\2\u0ae9"+ + "\u0aea\3\2\2\2\u0aea\u025c\3\2\2\2\u0aeb\u0af1\7b\2\2\u0aec\u0af0\n\4"+ + "\2\2\u0aed\u0aee\7b\2\2\u0aee\u0af0\7b\2\2\u0aef\u0aec\3\2\2\2\u0aef\u0aed"+ + "\3\2\2\2\u0af0\u0af3\3\2\2\2\u0af1\u0aef\3\2\2\2\u0af1\u0af2\3\2\2\2\u0af2"+ + "\u0af4\3\2\2\2\u0af3\u0af1\3\2\2\2\u0af4\u0af5\7b\2\2\u0af5\u025e\3\2"+ + "\2\2\u0af6\u0af8\5\u0263\u0132\2\u0af7\u0af6\3\2\2\2\u0af8\u0af9\3\2\2"+ + "\2\u0af9\u0af7\3\2\2\2\u0af9\u0afa\3\2\2\2\u0afa\u0afb\3\2\2\2\u0afb\u0aff"+ + "\7\60\2\2\u0afc\u0afe\5\u0263\u0132\2\u0afd\u0afc\3\2\2\2\u0afe\u0b01"+ + "\3\2\2\2\u0aff\u0afd\3\2\2\2\u0aff\u0b00\3\2\2\2\u0b00\u0b09\3\2\2\2\u0b01"+ + "\u0aff\3\2\2\2\u0b02\u0b04\7\60\2\2\u0b03\u0b05\5\u0263\u0132\2\u0b04"+ + "\u0b03\3\2\2\2\u0b05\u0b06\3\2\2\2\u0b06\u0b04\3\2\2\2\u0b06\u0b07\3\2"+ + "\2\2\u0b07\u0b09\3\2\2\2\u0b08\u0af7\3\2\2\2\u0b08\u0b02\3\2\2\2\u0b09"+ + "\u0260\3\2\2\2\u0b0a\u0b0c\7G\2\2\u0b0b\u0b0d\t\5\2\2\u0b0c\u0b0b\3\2"+ + "\2\2\u0b0c\u0b0d\3\2\2\2\u0b0d\u0b0f\3\2\2\2\u0b0e\u0b10\5\u0263\u0132"+ + "\2\u0b0f\u0b0e\3\2\2\2\u0b10\u0b11\3\2\2\2\u0b11\u0b0f\3\2\2\2\u0b11\u0b12"+ + "\3\2\2\2\u0b12\u0262\3\2\2\2\u0b13\u0b14\t\6\2\2\u0b14\u0264\3\2\2\2\u0b15"+ + "\u0b16\t\7\2\2\u0b16\u0266\3\2\2\2\u0b17\u0b18\t\b\2\2\u0b18\u0268\3\2"+ + "\2\2\u0b19\u0b1a\t\t\2\2\u0b1a\u026a\3\2\2\2\u0b1b\u0b1c\t\n\2\2\u0b1c"+ + "\u026c\3\2\2\2\u0b1d\u0b1e\t\13\2\2\u0b1e\u026e\3\2\2\2\u0b1f\u0b20\t"+ + "\f\2\2\u0b20\u0270\3\2\2\2\u0b21\u0b22\t\r\2\2\u0b22\u0272\3\2\2\2\u0b23"+ + "\u0b24\t\16\2\2\u0b24\u0274\3\2\2\2\u0b25\u0b26\t\17\2\2\u0b26\u0276\3"+ + "\2\2\2\u0b27\u0b28\t\20\2\2\u0b28\u0278\3\2\2\2\u0b29\u0b2a\t\21\2\2\u0b2a"+ + "\u027a\3\2\2\2\u0b2b\u0b2c\t\22\2\2\u0b2c\u027c\3\2\2\2\u0b2d\u0b2e\t"+ + "\23\2\2\u0b2e\u027e\3\2\2\2\u0b2f\u0b30\t\24\2\2\u0b30\u0280\3\2\2\2\u0b31"+ + "\u0b32\t\25\2\2\u0b32\u0282\3\2\2\2\u0b33\u0b34\t\26\2\2\u0b34\u0284\3"+ + "\2\2\2\u0b35\u0b36\t\27\2\2\u0b36\u0286\3\2\2\2\u0b37\u0b38\t\30\2\2\u0b38"+ + "\u0288\3\2\2\2\u0b39\u0b3a\t\31\2\2\u0b3a\u028a\3\2\2\2\u0b3b\u0b3c\t"+ + "\32\2\2\u0b3c\u028c\3\2\2\2\u0b3d\u0b3e\t\33\2\2\u0b3e\u028e\3\2\2\2\u0b3f"+ + "\u0b40\t\34\2\2\u0b40\u0290\3\2\2\2\u0b41\u0b42\t\35\2\2\u0b42\u0292\3"+ + "\2\2\2\u0b43\u0b44\t\36\2\2\u0b44\u0294\3\2\2\2\u0b45\u0b46\t\37\2\2\u0b46"+ + "\u0296\3\2\2\2\u0b47\u0b48\t \2\2\u0b48\u0298\3\2\2\2\u0b49\u0b4a\t!\2"+ + "\2\u0b4a\u029a\3\2\2\2\u0b4b\u0b4c\7/\2\2\u0b4c\u0b4d\7/\2\2\u0b4d\u0b53"+ + "\3\2\2\2\u0b4e\u0b4f\7^\2\2\u0b4f\u0b52\7\f\2\2\u0b50\u0b52\n\"\2\2\u0b51"+ + "\u0b4e\3\2\2\2\u0b51\u0b50\3\2\2\2\u0b52\u0b55\3\2\2\2\u0b53\u0b51\3\2"+ + "\2\2\u0b53\u0b54\3\2\2\2\u0b54\u0b57\3\2\2\2\u0b55\u0b53\3\2\2\2\u0b56"+ + "\u0b58\7\17\2\2\u0b57\u0b56\3\2\2\2\u0b57\u0b58\3\2\2\2\u0b58\u0b5a\3"+ + "\2\2\2\u0b59\u0b5b\7\f\2\2\u0b5a\u0b59\3\2\2\2\u0b5a\u0b5b\3\2\2\2\u0b5b"+ + "\u0b5c\3\2\2\2\u0b5c\u0b5d\b\u014e\2\2\u0b5d\u029c\3\2\2\2\u0b5e\u0b5f"+ + "\7\61\2\2\u0b5f\u0b60\7,\2\2\u0b60\u0b61\3\2\2\2\u0b61\u0b66\6\u014f\7"+ + "\2\u0b62\u0b65\5\u029d\u014f\2\u0b63\u0b65\13\2\2\2\u0b64\u0b62\3\2\2"+ + "\2\u0b64\u0b63\3\2\2\2\u0b65\u0b68\3\2\2\2\u0b66\u0b67\3\2\2\2\u0b66\u0b64"+ + "\3\2\2\2\u0b67\u0b69\3\2\2\2\u0b68\u0b66\3\2\2\2\u0b69\u0b6a\7,\2\2\u0b6a"+ + "\u0b6b\7\61\2\2\u0b6b\u0b6c\3\2\2\2\u0b6c\u0b6d\b\u014f\2\2\u0b6d\u029e"+ + "\3\2\2\2\u0b6e\u0b70\t#\2\2\u0b6f\u0b6e\3\2\2\2\u0b70\u0b71\3\2\2\2\u0b71"+ + "\u0b6f\3\2\2\2\u0b71\u0b72\3\2\2\2\u0b72\u0b73\3\2\2\2\u0b73\u0b74\b\u0150"+ + "\2\2\u0b74\u02a0\3\2\2\2\u0b75\u0b76\13\2\2\2\u0b76\u02a2\3\2\2\2\62\2"+ + "\u0448\u06bc\u0827\u0934\u0a2b\u0a3d\u0a45\u0a6c\u0a6e\u0a76\u0a78\u0a7c"+ + "\u0a81\u0a88\u0a8f\u0a96\u0a9b\u0aa3\u0aab\u0aae\u0ab4\u0ab9\u0abe\u0ac1"+ + "\u0ac7\u0acc\u0ad1\u0ad4\u0adb\u0ae2\u0ae7\u0ae9\u0aef\u0af1\u0af9\u0aff"+ + "\u0b06\u0b08\u0b0c\u0b11\u0b51\u0b53\u0b57\u0b5a\u0b64\u0b66\u0b71\3\2"+ + "\3\2"; + public static final String _serializedATN = Utils.join( + new String[] { + _serializedATNSegment0, + _serializedATNSegment1 + }, + "" + ); + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.tokens b/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.tokens new file mode 100644 index 0000000..9abb698 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQLLexer.tokens @@ -0,0 +1,334 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +ADD=8 +AFTER=9 +ALL=10 +ALTER=11 +ANALYZE=12 +AND=13 +ANTI=14 +ANY=15 +ARCHIVE=16 +ARRAY=17 +AS=18 +ASC=19 +AT=20 +AUTHORIZATION=21 +BETWEEN=22 +BOTH=23 +BUCKET=24 +BUCKETS=25 +BY=26 +CACHE=27 +CASCADE=28 +CASE=29 +CAST=30 +CHANGE=31 +CHECK=32 +CLEAR=33 +CLUSTER=34 +CLUSTERED=35 +CODEGEN=36 +COLLATE=37 +COLLECTION=38 +COLUMN=39 +COLUMNS=40 +COMMENT=41 +COMMIT=42 +COMPACT=43 +COMPACTIONS=44 +COMPUTE=45 +CONCATENATE=46 +CONSTRAINT=47 +COST=48 +CREATE=49 +CROSS=50 +CUBE=51 +CURRENT=52 +CURRENT_DATE=53 +CURRENT_TIME=54 +CURRENT_TIMESTAMP=55 +CURRENT_USER=56 +DAY=57 +DATA=58 +DATABASE=59 +DATABASES=60 +DBPROPERTIES=61 +DEFINED=62 +DELETE=63 +DELIMITED=64 +DESC=65 +DESCRIBE=66 +DFS=67 +DIRECTORIES=68 +DIRECTORY=69 +DISTINCT=70 +DISTRIBUTE=71 +DIV=72 +DROP=73 +ELSE=74 +END=75 +ESCAPE=76 +ESCAPED=77 +EXCEPT=78 +EXCHANGE=79 +EXISTS=80 +EXPLAIN=81 +EXPORT=82 +EXTENDED=83 +EXTERNAL=84 +EXTRACT=85 +FALSE=86 +FETCH=87 +FIELDS=88 +FILTER=89 +FILEFORMAT=90 +FIRST=91 +FOLLOWING=92 +FOR=93 +FOREIGN=94 +FORMAT=95 +FORMATTED=96 +FROM=97 +FULL=98 +FUNCTION=99 +FUNCTIONS=100 +GLOBAL=101 +GRANT=102 +GROUP=103 +GROUPING=104 +HAVING=105 +HOUR=106 +IF=107 +IGNORE=108 +IMPORT=109 +IN=110 +INDEX=111 +INDEXES=112 +INNER=113 +INPATH=114 +INPUTFORMAT=115 +INSERT=116 +INTERSECT=117 +INTERVAL=118 +INTO=119 +IS=120 +ITEMS=121 +JOIN=122 +KEYS=123 +LAST=124 +LATERAL=125 +LAZY=126 +LEADING=127 +LEFT=128 +LIKE=129 +LIMIT=130 +LINES=131 +LIST=132 +LOAD=133 +LOCAL=134 +LOCATION=135 +LOCK=136 +LOCKS=137 +LOGICAL=138 +MACRO=139 +MAP=140 +MATCHED=141 +MERGE=142 +MINUTE=143 +MONTH=144 +MSCK=145 +NAMESPACE=146 +NAMESPACES=147 +NATURAL=148 +NO=149 +NOT=150 +NULL=151 +NULLS=152 +OF=153 +OFFSET=154 +ON=155 +ONLY=156 +OPTION=157 +OPTIONS=158 +OR=159 +ORDER=160 +OUT=161 +OUTER=162 +OUTPUTFORMAT=163 +OVER=164 +OVERLAPS=165 +OVERLAY=166 +OVERWRITE=167 +PARTITION=168 +PARTITIONED=169 +PARTITIONS=170 +PERCENTLIT=171 +PIVOT=172 +PLACING=173 +POSITION=174 +PRECEDING=175 +PRIMARY=176 +PRINCIPALS=177 +PROPERTIES=178 +PURGE=179 +QUERY=180 +RANGE=181 +RECORDREADER=182 +RECORDWRITER=183 +RECOVER=184 +REDUCE=185 +REFERENCES=186 +REFRESH=187 +RENAME=188 +REPAIR=189 +REPLACE=190 +RESET=191 +RESPECT=192 +RESTRICT=193 +REVOKE=194 +RIGHT=195 +RLIKE=196 +ROLE=197 +ROLES=198 +ROLLBACK=199 +ROLLUP=200 +ROW=201 +ROWS=202 +SECOND=203 +SCHEMA=204 +SELECT=205 +SEMI=206 +SEPARATED=207 +SERDE=208 +SERDEPROPERTIES=209 +SESSION_USER=210 +SET=211 +SETMINUS=212 +SETS=213 +SHOW=214 +SKEWED=215 +SOME=216 +SORT=217 +SORTED=218 +START=219 +STATISTICS=220 +STORED=221 +STRATIFY=222 +STRUCT=223 +SUBSTR=224 +SUBSTRING=225 +SYNC=226 +TABLE=227 +TABLES=228 +TABLESAMPLE=229 +TBLPROPERTIES=230 +TEMPORARY=231 +TERMINATED=232 +THEN=233 +TIME=234 +TO=235 +TOUCH=236 +TRAILING=237 +TRANSACTION=238 +TRANSACTIONS=239 +TRANSFORM=240 +TRIM=241 +TRUE=242 +TRUNCATE=243 +TRY_CAST=244 +TYPE=245 +UNARCHIVE=246 +UNBOUNDED=247 +UNCACHE=248 +UNION=249 +UNIQUE=250 +UNKNOWN=251 +UNLOCK=252 +UNSET=253 +UPDATE=254 +USE=255 +USER=256 +USING=257 +VALUES=258 +VIEW=259 +VIEWS=260 +WHEN=261 +WHERE=262 +WINDOW=263 +WITH=264 +YEAR=265 +ZONE=266 +EQ=267 +NSEQ=268 +NEQ=269 +NEQJ=270 +LT=271 +LTE=272 +GT=273 +GTE=274 +PLUS=275 +MINUS=276 +ASTERISK=277 +SLASH=278 +PERCENT=279 +TILDE=280 +AMPERSAND=281 +PIPE=282 +CONCAT_PIPE=283 +HAT=284 +UNDERSCORE=285 +EXCLAMATION=286 +POINT=287 +COMMA=288 +COLON=289 +SEMICOLON=290 +STRING=291 +BIGINT_LITERAL=292 +SMALLINT_LITERAL=293 +TINYINT_LITERAL=294 +INTEGER_VALUE=295 +EXPONENT_VALUE=296 +DECIMAL_VALUE=297 +FLOAT_LITERAL=298 +DOUBLE_LITERAL=299 +BIGDECIMAL_LITERAL=300 +IDENTIFIER=301 +BACKQUOTED_IDENTIFIER=302 +SIMPLE_COMMENT=303 +BRACKETED_COMMENT=304 +WS=305 +UNRECOGNIZED=306 +'('=1 +')'=2 +'/*+'=3 +'*/'=4 +'->'=5 +'['=6 +']'=7 +'<=>'=268 +'<>'=269 +'!='=270 +'<'=271 +'>'=273 +'+'=275 +'-'=276 +'*'=277 +'/'=278 +'%'=279 +'~'=280 +'&'=281 +'|'=282 +'||'=283 +'^'=284 +'_'=285 +'!'=286 +'.'=287 +','=288 +':'=289 +';'=290 diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQLListener.java b/mypages/src/main/java/io/leego/mypages/sql/SQLListener.java new file mode 100644 index 0000000..1724239 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQLListener.java @@ -0,0 +1,3135 @@ +package io.leego.mypages.sql; +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link SQLParser}. + */ +public interface SQLListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link SQLParser#singleStatement}. + * @param ctx the parse tree + */ + void enterSingleStatement(SQLParser.SingleStatementContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#singleStatement}. + * @param ctx the parse tree + */ + void exitSingleStatement(SQLParser.SingleStatementContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#singleExpression}. + * @param ctx the parse tree + */ + void enterSingleExpression(SQLParser.SingleExpressionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#singleExpression}. + * @param ctx the parse tree + */ + void exitSingleExpression(SQLParser.SingleExpressionContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#singleTableIdentifier}. + * @param ctx the parse tree + */ + void enterSingleTableIdentifier(SQLParser.SingleTableIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#singleTableIdentifier}. + * @param ctx the parse tree + */ + void exitSingleTableIdentifier(SQLParser.SingleTableIdentifierContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#singleMultipartIdentifier}. + * @param ctx the parse tree + */ + void enterSingleMultipartIdentifier(SQLParser.SingleMultipartIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#singleMultipartIdentifier}. + * @param ctx the parse tree + */ + void exitSingleMultipartIdentifier(SQLParser.SingleMultipartIdentifierContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#singleFunctionIdentifier}. + * @param ctx the parse tree + */ + void enterSingleFunctionIdentifier(SQLParser.SingleFunctionIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#singleFunctionIdentifier}. + * @param ctx the parse tree + */ + void exitSingleFunctionIdentifier(SQLParser.SingleFunctionIdentifierContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#singleDataType}. + * @param ctx the parse tree + */ + void enterSingleDataType(SQLParser.SingleDataTypeContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#singleDataType}. + * @param ctx the parse tree + */ + void exitSingleDataType(SQLParser.SingleDataTypeContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#singleTableSchema}. + * @param ctx the parse tree + */ + void enterSingleTableSchema(SQLParser.SingleTableSchemaContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#singleTableSchema}. + * @param ctx the parse tree + */ + void exitSingleTableSchema(SQLParser.SingleTableSchemaContext ctx); + /** + * Enter a parse tree produced by the {@code statementDefault} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterStatementDefault(SQLParser.StatementDefaultContext ctx); + /** + * Exit a parse tree produced by the {@code statementDefault} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitStatementDefault(SQLParser.StatementDefaultContext ctx); + /** + * Enter a parse tree produced by the {@code dmlStatement} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDmlStatement(SQLParser.DmlStatementContext ctx); + /** + * Exit a parse tree produced by the {@code dmlStatement} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDmlStatement(SQLParser.DmlStatementContext ctx); + /** + * Enter a parse tree produced by the {@code use} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterUse(SQLParser.UseContext ctx); + /** + * Exit a parse tree produced by the {@code use} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitUse(SQLParser.UseContext ctx); + /** + * Enter a parse tree produced by the {@code createNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCreateNamespace(SQLParser.CreateNamespaceContext ctx); + /** + * Exit a parse tree produced by the {@code createNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCreateNamespace(SQLParser.CreateNamespaceContext ctx); + /** + * Enter a parse tree produced by the {@code setNamespaceProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterSetNamespaceProperties(SQLParser.SetNamespacePropertiesContext ctx); + /** + * Exit a parse tree produced by the {@code setNamespaceProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitSetNamespaceProperties(SQLParser.SetNamespacePropertiesContext ctx); + /** + * Enter a parse tree produced by the {@code setNamespaceLocation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterSetNamespaceLocation(SQLParser.SetNamespaceLocationContext ctx); + /** + * Exit a parse tree produced by the {@code setNamespaceLocation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitSetNamespaceLocation(SQLParser.SetNamespaceLocationContext ctx); + /** + * Enter a parse tree produced by the {@code dropNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDropNamespace(SQLParser.DropNamespaceContext ctx); + /** + * Exit a parse tree produced by the {@code dropNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDropNamespace(SQLParser.DropNamespaceContext ctx); + /** + * Enter a parse tree produced by the {@code showNamespaces} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowNamespaces(SQLParser.ShowNamespacesContext ctx); + /** + * Exit a parse tree produced by the {@code showNamespaces} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowNamespaces(SQLParser.ShowNamespacesContext ctx); + /** + * Enter a parse tree produced by the {@code createTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCreateTable(SQLParser.CreateTableContext ctx); + /** + * Exit a parse tree produced by the {@code createTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCreateTable(SQLParser.CreateTableContext ctx); + /** + * Enter a parse tree produced by the {@code createTableLike} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCreateTableLike(SQLParser.CreateTableLikeContext ctx); + /** + * Exit a parse tree produced by the {@code createTableLike} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCreateTableLike(SQLParser.CreateTableLikeContext ctx); + /** + * Enter a parse tree produced by the {@code replaceTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterReplaceTable(SQLParser.ReplaceTableContext ctx); + /** + * Exit a parse tree produced by the {@code replaceTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitReplaceTable(SQLParser.ReplaceTableContext ctx); + /** + * Enter a parse tree produced by the {@code analyze} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterAnalyze(SQLParser.AnalyzeContext ctx); + /** + * Exit a parse tree produced by the {@code analyze} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitAnalyze(SQLParser.AnalyzeContext ctx); + /** + * Enter a parse tree produced by the {@code analyzeTables} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterAnalyzeTables(SQLParser.AnalyzeTablesContext ctx); + /** + * Exit a parse tree produced by the {@code analyzeTables} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitAnalyzeTables(SQLParser.AnalyzeTablesContext ctx); + /** + * Enter a parse tree produced by the {@code addTableColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterAddTableColumns(SQLParser.AddTableColumnsContext ctx); + /** + * Exit a parse tree produced by the {@code addTableColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitAddTableColumns(SQLParser.AddTableColumnsContext ctx); + /** + * Enter a parse tree produced by the {@code renameTableColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterRenameTableColumn(SQLParser.RenameTableColumnContext ctx); + /** + * Exit a parse tree produced by the {@code renameTableColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitRenameTableColumn(SQLParser.RenameTableColumnContext ctx); + /** + * Enter a parse tree produced by the {@code dropTableColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDropTableColumns(SQLParser.DropTableColumnsContext ctx); + /** + * Exit a parse tree produced by the {@code dropTableColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDropTableColumns(SQLParser.DropTableColumnsContext ctx); + /** + * Enter a parse tree produced by the {@code renameTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterRenameTable(SQLParser.RenameTableContext ctx); + /** + * Exit a parse tree produced by the {@code renameTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitRenameTable(SQLParser.RenameTableContext ctx); + /** + * Enter a parse tree produced by the {@code setTableProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterSetTableProperties(SQLParser.SetTablePropertiesContext ctx); + /** + * Exit a parse tree produced by the {@code setTableProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitSetTableProperties(SQLParser.SetTablePropertiesContext ctx); + /** + * Enter a parse tree produced by the {@code unsetTableProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterUnsetTableProperties(SQLParser.UnsetTablePropertiesContext ctx); + /** + * Exit a parse tree produced by the {@code unsetTableProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitUnsetTableProperties(SQLParser.UnsetTablePropertiesContext ctx); + /** + * Enter a parse tree produced by the {@code alterTableAlterColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterAlterTableAlterColumn(SQLParser.AlterTableAlterColumnContext ctx); + /** + * Exit a parse tree produced by the {@code alterTableAlterColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitAlterTableAlterColumn(SQLParser.AlterTableAlterColumnContext ctx); + /** + * Enter a parse tree produced by the {@code hiveChangeColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterHiveChangeColumn(SQLParser.HiveChangeColumnContext ctx); + /** + * Exit a parse tree produced by the {@code hiveChangeColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitHiveChangeColumn(SQLParser.HiveChangeColumnContext ctx); + /** + * Enter a parse tree produced by the {@code hiveReplaceColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterHiveReplaceColumns(SQLParser.HiveReplaceColumnsContext ctx); + /** + * Exit a parse tree produced by the {@code hiveReplaceColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitHiveReplaceColumns(SQLParser.HiveReplaceColumnsContext ctx); + /** + * Enter a parse tree produced by the {@code setTableSerDe} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterSetTableSerDe(SQLParser.SetTableSerDeContext ctx); + /** + * Exit a parse tree produced by the {@code setTableSerDe} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitSetTableSerDe(SQLParser.SetTableSerDeContext ctx); + /** + * Enter a parse tree produced by the {@code addTablePartition} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterAddTablePartition(SQLParser.AddTablePartitionContext ctx); + /** + * Exit a parse tree produced by the {@code addTablePartition} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitAddTablePartition(SQLParser.AddTablePartitionContext ctx); + /** + * Enter a parse tree produced by the {@code renameTablePartition} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterRenameTablePartition(SQLParser.RenameTablePartitionContext ctx); + /** + * Exit a parse tree produced by the {@code renameTablePartition} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitRenameTablePartition(SQLParser.RenameTablePartitionContext ctx); + /** + * Enter a parse tree produced by the {@code dropTablePartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDropTablePartitions(SQLParser.DropTablePartitionsContext ctx); + /** + * Exit a parse tree produced by the {@code dropTablePartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDropTablePartitions(SQLParser.DropTablePartitionsContext ctx); + /** + * Enter a parse tree produced by the {@code setTableLocation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterSetTableLocation(SQLParser.SetTableLocationContext ctx); + /** + * Exit a parse tree produced by the {@code setTableLocation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitSetTableLocation(SQLParser.SetTableLocationContext ctx); + /** + * Enter a parse tree produced by the {@code recoverPartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterRecoverPartitions(SQLParser.RecoverPartitionsContext ctx); + /** + * Exit a parse tree produced by the {@code recoverPartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitRecoverPartitions(SQLParser.RecoverPartitionsContext ctx); + /** + * Enter a parse tree produced by the {@code dropTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDropTable(SQLParser.DropTableContext ctx); + /** + * Exit a parse tree produced by the {@code dropTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDropTable(SQLParser.DropTableContext ctx); + /** + * Enter a parse tree produced by the {@code dropView} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDropView(SQLParser.DropViewContext ctx); + /** + * Exit a parse tree produced by the {@code dropView} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDropView(SQLParser.DropViewContext ctx); + /** + * Enter a parse tree produced by the {@code createView} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCreateView(SQLParser.CreateViewContext ctx); + /** + * Exit a parse tree produced by the {@code createView} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCreateView(SQLParser.CreateViewContext ctx); + /** + * Enter a parse tree produced by the {@code createTempViewUsing} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCreateTempViewUsing(SQLParser.CreateTempViewUsingContext ctx); + /** + * Exit a parse tree produced by the {@code createTempViewUsing} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCreateTempViewUsing(SQLParser.CreateTempViewUsingContext ctx); + /** + * Enter a parse tree produced by the {@code alterViewQuery} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterAlterViewQuery(SQLParser.AlterViewQueryContext ctx); + /** + * Exit a parse tree produced by the {@code alterViewQuery} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitAlterViewQuery(SQLParser.AlterViewQueryContext ctx); + /** + * Enter a parse tree produced by the {@code createFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCreateFunction(SQLParser.CreateFunctionContext ctx); + /** + * Exit a parse tree produced by the {@code createFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCreateFunction(SQLParser.CreateFunctionContext ctx); + /** + * Enter a parse tree produced by the {@code dropFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDropFunction(SQLParser.DropFunctionContext ctx); + /** + * Exit a parse tree produced by the {@code dropFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDropFunction(SQLParser.DropFunctionContext ctx); + /** + * Enter a parse tree produced by the {@code explain} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterExplain(SQLParser.ExplainContext ctx); + /** + * Exit a parse tree produced by the {@code explain} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitExplain(SQLParser.ExplainContext ctx); + /** + * Enter a parse tree produced by the {@code showTables} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowTables(SQLParser.ShowTablesContext ctx); + /** + * Exit a parse tree produced by the {@code showTables} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowTables(SQLParser.ShowTablesContext ctx); + /** + * Enter a parse tree produced by the {@code showTableExtended} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowTableExtended(SQLParser.ShowTableExtendedContext ctx); + /** + * Exit a parse tree produced by the {@code showTableExtended} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowTableExtended(SQLParser.ShowTableExtendedContext ctx); + /** + * Enter a parse tree produced by the {@code showTblProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowTblProperties(SQLParser.ShowTblPropertiesContext ctx); + /** + * Exit a parse tree produced by the {@code showTblProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowTblProperties(SQLParser.ShowTblPropertiesContext ctx); + /** + * Enter a parse tree produced by the {@code showColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowColumns(SQLParser.ShowColumnsContext ctx); + /** + * Exit a parse tree produced by the {@code showColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowColumns(SQLParser.ShowColumnsContext ctx); + /** + * Enter a parse tree produced by the {@code showViews} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowViews(SQLParser.ShowViewsContext ctx); + /** + * Exit a parse tree produced by the {@code showViews} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowViews(SQLParser.ShowViewsContext ctx); + /** + * Enter a parse tree produced by the {@code showPartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowPartitions(SQLParser.ShowPartitionsContext ctx); + /** + * Exit a parse tree produced by the {@code showPartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowPartitions(SQLParser.ShowPartitionsContext ctx); + /** + * Enter a parse tree produced by the {@code showFunctions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowFunctions(SQLParser.ShowFunctionsContext ctx); + /** + * Exit a parse tree produced by the {@code showFunctions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowFunctions(SQLParser.ShowFunctionsContext ctx); + /** + * Enter a parse tree produced by the {@code showCreateTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowCreateTable(SQLParser.ShowCreateTableContext ctx); + /** + * Exit a parse tree produced by the {@code showCreateTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowCreateTable(SQLParser.ShowCreateTableContext ctx); + /** + * Enter a parse tree produced by the {@code showCurrentNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterShowCurrentNamespace(SQLParser.ShowCurrentNamespaceContext ctx); + /** + * Exit a parse tree produced by the {@code showCurrentNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitShowCurrentNamespace(SQLParser.ShowCurrentNamespaceContext ctx); + /** + * Enter a parse tree produced by the {@code describeFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDescribeFunction(SQLParser.DescribeFunctionContext ctx); + /** + * Exit a parse tree produced by the {@code describeFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDescribeFunction(SQLParser.DescribeFunctionContext ctx); + /** + * Enter a parse tree produced by the {@code describeNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDescribeNamespace(SQLParser.DescribeNamespaceContext ctx); + /** + * Exit a parse tree produced by the {@code describeNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDescribeNamespace(SQLParser.DescribeNamespaceContext ctx); + /** + * Enter a parse tree produced by the {@code describeRelation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDescribeRelation(SQLParser.DescribeRelationContext ctx); + /** + * Exit a parse tree produced by the {@code describeRelation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDescribeRelation(SQLParser.DescribeRelationContext ctx); + /** + * Enter a parse tree produced by the {@code describeQuery} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterDescribeQuery(SQLParser.DescribeQueryContext ctx); + /** + * Exit a parse tree produced by the {@code describeQuery} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitDescribeQuery(SQLParser.DescribeQueryContext ctx); + /** + * Enter a parse tree produced by the {@code commentNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCommentNamespace(SQLParser.CommentNamespaceContext ctx); + /** + * Exit a parse tree produced by the {@code commentNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCommentNamespace(SQLParser.CommentNamespaceContext ctx); + /** + * Enter a parse tree produced by the {@code commentTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCommentTable(SQLParser.CommentTableContext ctx); + /** + * Exit a parse tree produced by the {@code commentTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCommentTable(SQLParser.CommentTableContext ctx); + /** + * Enter a parse tree produced by the {@code refreshTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterRefreshTable(SQLParser.RefreshTableContext ctx); + /** + * Exit a parse tree produced by the {@code refreshTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitRefreshTable(SQLParser.RefreshTableContext ctx); + /** + * Enter a parse tree produced by the {@code refreshFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterRefreshFunction(SQLParser.RefreshFunctionContext ctx); + /** + * Exit a parse tree produced by the {@code refreshFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitRefreshFunction(SQLParser.RefreshFunctionContext ctx); + /** + * Enter a parse tree produced by the {@code refreshResource} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterRefreshResource(SQLParser.RefreshResourceContext ctx); + /** + * Exit a parse tree produced by the {@code refreshResource} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitRefreshResource(SQLParser.RefreshResourceContext ctx); + /** + * Enter a parse tree produced by the {@code cacheTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterCacheTable(SQLParser.CacheTableContext ctx); + /** + * Exit a parse tree produced by the {@code cacheTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitCacheTable(SQLParser.CacheTableContext ctx); + /** + * Enter a parse tree produced by the {@code uncacheTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterUncacheTable(SQLParser.UncacheTableContext ctx); + /** + * Exit a parse tree produced by the {@code uncacheTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitUncacheTable(SQLParser.UncacheTableContext ctx); + /** + * Enter a parse tree produced by the {@code clearCache} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterClearCache(SQLParser.ClearCacheContext ctx); + /** + * Exit a parse tree produced by the {@code clearCache} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitClearCache(SQLParser.ClearCacheContext ctx); + /** + * Enter a parse tree produced by the {@code loadData} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterLoadData(SQLParser.LoadDataContext ctx); + /** + * Exit a parse tree produced by the {@code loadData} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitLoadData(SQLParser.LoadDataContext ctx); + /** + * Enter a parse tree produced by the {@code truncateTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterTruncateTable(SQLParser.TruncateTableContext ctx); + /** + * Exit a parse tree produced by the {@code truncateTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitTruncateTable(SQLParser.TruncateTableContext ctx); + /** + * Enter a parse tree produced by the {@code repairTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterRepairTable(SQLParser.RepairTableContext ctx); + /** + * Exit a parse tree produced by the {@code repairTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitRepairTable(SQLParser.RepairTableContext ctx); + /** + * Enter a parse tree produced by the {@code manageResource} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterManageResource(SQLParser.ManageResourceContext ctx); + /** + * Exit a parse tree produced by the {@code manageResource} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitManageResource(SQLParser.ManageResourceContext ctx); + /** + * Enter a parse tree produced by the {@code failNativeCommand} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterFailNativeCommand(SQLParser.FailNativeCommandContext ctx); + /** + * Exit a parse tree produced by the {@code failNativeCommand} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitFailNativeCommand(SQLParser.FailNativeCommandContext ctx); + /** + * Enter a parse tree produced by the {@code setTimeZone} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterSetTimeZone(SQLParser.SetTimeZoneContext ctx); + /** + * Exit a parse tree produced by the {@code setTimeZone} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitSetTimeZone(SQLParser.SetTimeZoneContext ctx); + /** + * Enter a parse tree produced by the {@code setQuotedConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterSetQuotedConfiguration(SQLParser.SetQuotedConfigurationContext ctx); + /** + * Exit a parse tree produced by the {@code setQuotedConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitSetQuotedConfiguration(SQLParser.SetQuotedConfigurationContext ctx); + /** + * Enter a parse tree produced by the {@code setConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterSetConfiguration(SQLParser.SetConfigurationContext ctx); + /** + * Exit a parse tree produced by the {@code setConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitSetConfiguration(SQLParser.SetConfigurationContext ctx); + /** + * Enter a parse tree produced by the {@code resetQuotedConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterResetQuotedConfiguration(SQLParser.ResetQuotedConfigurationContext ctx); + /** + * Exit a parse tree produced by the {@code resetQuotedConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitResetQuotedConfiguration(SQLParser.ResetQuotedConfigurationContext ctx); + /** + * Enter a parse tree produced by the {@code resetConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void enterResetConfiguration(SQLParser.ResetConfigurationContext ctx); + /** + * Exit a parse tree produced by the {@code resetConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + */ + void exitResetConfiguration(SQLParser.ResetConfigurationContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#configKey}. + * @param ctx the parse tree + */ + void enterConfigKey(SQLParser.ConfigKeyContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#configKey}. + * @param ctx the parse tree + */ + void exitConfigKey(SQLParser.ConfigKeyContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#configValue}. + * @param ctx the parse tree + */ + void enterConfigValue(SQLParser.ConfigValueContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#configValue}. + * @param ctx the parse tree + */ + void exitConfigValue(SQLParser.ConfigValueContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#unsupportedHiveNativeCommands}. + * @param ctx the parse tree + */ + void enterUnsupportedHiveNativeCommands(SQLParser.UnsupportedHiveNativeCommandsContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#unsupportedHiveNativeCommands}. + * @param ctx the parse tree + */ + void exitUnsupportedHiveNativeCommands(SQLParser.UnsupportedHiveNativeCommandsContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#createTableHeader}. + * @param ctx the parse tree + */ + void enterCreateTableHeader(SQLParser.CreateTableHeaderContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#createTableHeader}. + * @param ctx the parse tree + */ + void exitCreateTableHeader(SQLParser.CreateTableHeaderContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#replaceTableHeader}. + * @param ctx the parse tree + */ + void enterReplaceTableHeader(SQLParser.ReplaceTableHeaderContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#replaceTableHeader}. + * @param ctx the parse tree + */ + void exitReplaceTableHeader(SQLParser.ReplaceTableHeaderContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#bucketSpec}. + * @param ctx the parse tree + */ + void enterBucketSpec(SQLParser.BucketSpecContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#bucketSpec}. + * @param ctx the parse tree + */ + void exitBucketSpec(SQLParser.BucketSpecContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#skewSpec}. + * @param ctx the parse tree + */ + void enterSkewSpec(SQLParser.SkewSpecContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#skewSpec}. + * @param ctx the parse tree + */ + void exitSkewSpec(SQLParser.SkewSpecContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#locationSpec}. + * @param ctx the parse tree + */ + void enterLocationSpec(SQLParser.LocationSpecContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#locationSpec}. + * @param ctx the parse tree + */ + void exitLocationSpec(SQLParser.LocationSpecContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#commentSpec}. + * @param ctx the parse tree + */ + void enterCommentSpec(SQLParser.CommentSpecContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#commentSpec}. + * @param ctx the parse tree + */ + void exitCommentSpec(SQLParser.CommentSpecContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#query}. + * @param ctx the parse tree + */ + void enterQuery(SQLParser.QueryContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#query}. + * @param ctx the parse tree + */ + void exitQuery(SQLParser.QueryContext ctx); + /** + * Enter a parse tree produced by the {@code insertOverwriteTable} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + */ + void enterInsertOverwriteTable(SQLParser.InsertOverwriteTableContext ctx); + /** + * Exit a parse tree produced by the {@code insertOverwriteTable} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + */ + void exitInsertOverwriteTable(SQLParser.InsertOverwriteTableContext ctx); + /** + * Enter a parse tree produced by the {@code insertIntoTable} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + */ + void enterInsertIntoTable(SQLParser.InsertIntoTableContext ctx); + /** + * Exit a parse tree produced by the {@code insertIntoTable} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + */ + void exitInsertIntoTable(SQLParser.InsertIntoTableContext ctx); + /** + * Enter a parse tree produced by the {@code insertOverwriteHiveDir} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + */ + void enterInsertOverwriteHiveDir(SQLParser.InsertOverwriteHiveDirContext ctx); + /** + * Exit a parse tree produced by the {@code insertOverwriteHiveDir} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + */ + void exitInsertOverwriteHiveDir(SQLParser.InsertOverwriteHiveDirContext ctx); + /** + * Enter a parse tree produced by the {@code insertOverwriteDir} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + */ + void enterInsertOverwriteDir(SQLParser.InsertOverwriteDirContext ctx); + /** + * Exit a parse tree produced by the {@code insertOverwriteDir} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + */ + void exitInsertOverwriteDir(SQLParser.InsertOverwriteDirContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#partitionSpecLocation}. + * @param ctx the parse tree + */ + void enterPartitionSpecLocation(SQLParser.PartitionSpecLocationContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#partitionSpecLocation}. + * @param ctx the parse tree + */ + void exitPartitionSpecLocation(SQLParser.PartitionSpecLocationContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#partitionSpec}. + * @param ctx the parse tree + */ + void enterPartitionSpec(SQLParser.PartitionSpecContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#partitionSpec}. + * @param ctx the parse tree + */ + void exitPartitionSpec(SQLParser.PartitionSpecContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#partitionVal}. + * @param ctx the parse tree + */ + void enterPartitionVal(SQLParser.PartitionValContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#partitionVal}. + * @param ctx the parse tree + */ + void exitPartitionVal(SQLParser.PartitionValContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#namespace}. + * @param ctx the parse tree + */ + void enterNamespace(SQLParser.NamespaceContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#namespace}. + * @param ctx the parse tree + */ + void exitNamespace(SQLParser.NamespaceContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#describeFuncName}. + * @param ctx the parse tree + */ + void enterDescribeFuncName(SQLParser.DescribeFuncNameContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#describeFuncName}. + * @param ctx the parse tree + */ + void exitDescribeFuncName(SQLParser.DescribeFuncNameContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#describeColName}. + * @param ctx the parse tree + */ + void enterDescribeColName(SQLParser.DescribeColNameContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#describeColName}. + * @param ctx the parse tree + */ + void exitDescribeColName(SQLParser.DescribeColNameContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#ctes}. + * @param ctx the parse tree + */ + void enterCtes(SQLParser.CtesContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#ctes}. + * @param ctx the parse tree + */ + void exitCtes(SQLParser.CtesContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#namedQuery}. + * @param ctx the parse tree + */ + void enterNamedQuery(SQLParser.NamedQueryContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#namedQuery}. + * @param ctx the parse tree + */ + void exitNamedQuery(SQLParser.NamedQueryContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#tableProvider}. + * @param ctx the parse tree + */ + void enterTableProvider(SQLParser.TableProviderContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#tableProvider}. + * @param ctx the parse tree + */ + void exitTableProvider(SQLParser.TableProviderContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#createTableClauses}. + * @param ctx the parse tree + */ + void enterCreateTableClauses(SQLParser.CreateTableClausesContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#createTableClauses}. + * @param ctx the parse tree + */ + void exitCreateTableClauses(SQLParser.CreateTableClausesContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#tablePropertyList}. + * @param ctx the parse tree + */ + void enterTablePropertyList(SQLParser.TablePropertyListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#tablePropertyList}. + * @param ctx the parse tree + */ + void exitTablePropertyList(SQLParser.TablePropertyListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#tableProperty}. + * @param ctx the parse tree + */ + void enterTableProperty(SQLParser.TablePropertyContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#tableProperty}. + * @param ctx the parse tree + */ + void exitTableProperty(SQLParser.TablePropertyContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#tablePropertyKey}. + * @param ctx the parse tree + */ + void enterTablePropertyKey(SQLParser.TablePropertyKeyContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#tablePropertyKey}. + * @param ctx the parse tree + */ + void exitTablePropertyKey(SQLParser.TablePropertyKeyContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#tablePropertyValue}. + * @param ctx the parse tree + */ + void enterTablePropertyValue(SQLParser.TablePropertyValueContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#tablePropertyValue}. + * @param ctx the parse tree + */ + void exitTablePropertyValue(SQLParser.TablePropertyValueContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#constantList}. + * @param ctx the parse tree + */ + void enterConstantList(SQLParser.ConstantListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#constantList}. + * @param ctx the parse tree + */ + void exitConstantList(SQLParser.ConstantListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#nestedConstantList}. + * @param ctx the parse tree + */ + void enterNestedConstantList(SQLParser.NestedConstantListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#nestedConstantList}. + * @param ctx the parse tree + */ + void exitNestedConstantList(SQLParser.NestedConstantListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#createFileFormat}. + * @param ctx the parse tree + */ + void enterCreateFileFormat(SQLParser.CreateFileFormatContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#createFileFormat}. + * @param ctx the parse tree + */ + void exitCreateFileFormat(SQLParser.CreateFileFormatContext ctx); + /** + * Enter a parse tree produced by the {@code tableFileFormat} + * labeled alternative in {@link SQLParser#fileFormat}. + * @param ctx the parse tree + */ + void enterTableFileFormat(SQLParser.TableFileFormatContext ctx); + /** + * Exit a parse tree produced by the {@code tableFileFormat} + * labeled alternative in {@link SQLParser#fileFormat}. + * @param ctx the parse tree + */ + void exitTableFileFormat(SQLParser.TableFileFormatContext ctx); + /** + * Enter a parse tree produced by the {@code genericFileFormat} + * labeled alternative in {@link SQLParser#fileFormat}. + * @param ctx the parse tree + */ + void enterGenericFileFormat(SQLParser.GenericFileFormatContext ctx); + /** + * Exit a parse tree produced by the {@code genericFileFormat} + * labeled alternative in {@link SQLParser#fileFormat}. + * @param ctx the parse tree + */ + void exitGenericFileFormat(SQLParser.GenericFileFormatContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#storageHandler}. + * @param ctx the parse tree + */ + void enterStorageHandler(SQLParser.StorageHandlerContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#storageHandler}. + * @param ctx the parse tree + */ + void exitStorageHandler(SQLParser.StorageHandlerContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#resource}. + * @param ctx the parse tree + */ + void enterResource(SQLParser.ResourceContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#resource}. + * @param ctx the parse tree + */ + void exitResource(SQLParser.ResourceContext ctx); + /** + * Enter a parse tree produced by the {@code singleInsertQuery} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void enterSingleInsertQuery(SQLParser.SingleInsertQueryContext ctx); + /** + * Exit a parse tree produced by the {@code singleInsertQuery} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void exitSingleInsertQuery(SQLParser.SingleInsertQueryContext ctx); + /** + * Enter a parse tree produced by the {@code multiInsertQuery} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void enterMultiInsertQuery(SQLParser.MultiInsertQueryContext ctx); + /** + * Exit a parse tree produced by the {@code multiInsertQuery} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void exitMultiInsertQuery(SQLParser.MultiInsertQueryContext ctx); + /** + * Enter a parse tree produced by the {@code deleteFromTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void enterDeleteFromTable(SQLParser.DeleteFromTableContext ctx); + /** + * Exit a parse tree produced by the {@code deleteFromTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void exitDeleteFromTable(SQLParser.DeleteFromTableContext ctx); + /** + * Enter a parse tree produced by the {@code updateTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void enterUpdateTable(SQLParser.UpdateTableContext ctx); + /** + * Exit a parse tree produced by the {@code updateTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void exitUpdateTable(SQLParser.UpdateTableContext ctx); + /** + * Enter a parse tree produced by the {@code mergeIntoTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void enterMergeIntoTable(SQLParser.MergeIntoTableContext ctx); + /** + * Exit a parse tree produced by the {@code mergeIntoTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + */ + void exitMergeIntoTable(SQLParser.MergeIntoTableContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#queryOrganization}. + * @param ctx the parse tree + */ + void enterQueryOrganization(SQLParser.QueryOrganizationContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#queryOrganization}. + * @param ctx the parse tree + */ + void exitQueryOrganization(SQLParser.QueryOrganizationContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#multiInsertQueryBody}. + * @param ctx the parse tree + */ + void enterMultiInsertQueryBody(SQLParser.MultiInsertQueryBodyContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#multiInsertQueryBody}. + * @param ctx the parse tree + */ + void exitMultiInsertQueryBody(SQLParser.MultiInsertQueryBodyContext ctx); + /** + * Enter a parse tree produced by the {@code queryTermDefault} + * labeled alternative in {@link SQLParser#queryTerm}. + * @param ctx the parse tree + */ + void enterQueryTermDefault(SQLParser.QueryTermDefaultContext ctx); + /** + * Exit a parse tree produced by the {@code queryTermDefault} + * labeled alternative in {@link SQLParser#queryTerm}. + * @param ctx the parse tree + */ + void exitQueryTermDefault(SQLParser.QueryTermDefaultContext ctx); + /** + * Enter a parse tree produced by the {@code setOperation} + * labeled alternative in {@link SQLParser#queryTerm}. + * @param ctx the parse tree + */ + void enterSetOperation(SQLParser.SetOperationContext ctx); + /** + * Exit a parse tree produced by the {@code setOperation} + * labeled alternative in {@link SQLParser#queryTerm}. + * @param ctx the parse tree + */ + void exitSetOperation(SQLParser.SetOperationContext ctx); + /** + * Enter a parse tree produced by the {@code queryPrimaryDefault} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void enterQueryPrimaryDefault(SQLParser.QueryPrimaryDefaultContext ctx); + /** + * Exit a parse tree produced by the {@code queryPrimaryDefault} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void exitQueryPrimaryDefault(SQLParser.QueryPrimaryDefaultContext ctx); + /** + * Enter a parse tree produced by the {@code fromStmt} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void enterFromStmt(SQLParser.FromStmtContext ctx); + /** + * Exit a parse tree produced by the {@code fromStmt} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void exitFromStmt(SQLParser.FromStmtContext ctx); + /** + * Enter a parse tree produced by the {@code table} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void enterTable(SQLParser.TableContext ctx); + /** + * Exit a parse tree produced by the {@code table} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void exitTable(SQLParser.TableContext ctx); + /** + * Enter a parse tree produced by the {@code inlineTableDefault1} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void enterInlineTableDefault1(SQLParser.InlineTableDefault1Context ctx); + /** + * Exit a parse tree produced by the {@code inlineTableDefault1} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void exitInlineTableDefault1(SQLParser.InlineTableDefault1Context ctx); + /** + * Enter a parse tree produced by the {@code subquery} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void enterSubquery(SQLParser.SubqueryContext ctx); + /** + * Exit a parse tree produced by the {@code subquery} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + */ + void exitSubquery(SQLParser.SubqueryContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#sortItem}. + * @param ctx the parse tree + */ + void enterSortItem(SQLParser.SortItemContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#sortItem}. + * @param ctx the parse tree + */ + void exitSortItem(SQLParser.SortItemContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#fromStatement}. + * @param ctx the parse tree + */ + void enterFromStatement(SQLParser.FromStatementContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#fromStatement}. + * @param ctx the parse tree + */ + void exitFromStatement(SQLParser.FromStatementContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#fromStatementBody}. + * @param ctx the parse tree + */ + void enterFromStatementBody(SQLParser.FromStatementBodyContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#fromStatementBody}. + * @param ctx the parse tree + */ + void exitFromStatementBody(SQLParser.FromStatementBodyContext ctx); + /** + * Enter a parse tree produced by the {@code transformQuerySpecification} + * labeled alternative in {@link SQLParser#querySpecification}. + * @param ctx the parse tree + */ + void enterTransformQuerySpecification(SQLParser.TransformQuerySpecificationContext ctx); + /** + * Exit a parse tree produced by the {@code transformQuerySpecification} + * labeled alternative in {@link SQLParser#querySpecification}. + * @param ctx the parse tree + */ + void exitTransformQuerySpecification(SQLParser.TransformQuerySpecificationContext ctx); + /** + * Enter a parse tree produced by the {@code regularQuerySpecification} + * labeled alternative in {@link SQLParser#querySpecification}. + * @param ctx the parse tree + */ + void enterRegularQuerySpecification(SQLParser.RegularQuerySpecificationContext ctx); + /** + * Exit a parse tree produced by the {@code regularQuerySpecification} + * labeled alternative in {@link SQLParser#querySpecification}. + * @param ctx the parse tree + */ + void exitRegularQuerySpecification(SQLParser.RegularQuerySpecificationContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#transformClause}. + * @param ctx the parse tree + */ + void enterTransformClause(SQLParser.TransformClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#transformClause}. + * @param ctx the parse tree + */ + void exitTransformClause(SQLParser.TransformClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#selectClause}. + * @param ctx the parse tree + */ + void enterSelectClause(SQLParser.SelectClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#selectClause}. + * @param ctx the parse tree + */ + void exitSelectClause(SQLParser.SelectClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#setClause}. + * @param ctx the parse tree + */ + void enterSetClause(SQLParser.SetClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#setClause}. + * @param ctx the parse tree + */ + void exitSetClause(SQLParser.SetClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#matchedClause}. + * @param ctx the parse tree + */ + void enterMatchedClause(SQLParser.MatchedClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#matchedClause}. + * @param ctx the parse tree + */ + void exitMatchedClause(SQLParser.MatchedClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#notMatchedClause}. + * @param ctx the parse tree + */ + void enterNotMatchedClause(SQLParser.NotMatchedClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#notMatchedClause}. + * @param ctx the parse tree + */ + void exitNotMatchedClause(SQLParser.NotMatchedClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#matchedAction}. + * @param ctx the parse tree + */ + void enterMatchedAction(SQLParser.MatchedActionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#matchedAction}. + * @param ctx the parse tree + */ + void exitMatchedAction(SQLParser.MatchedActionContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#notMatchedAction}. + * @param ctx the parse tree + */ + void enterNotMatchedAction(SQLParser.NotMatchedActionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#notMatchedAction}. + * @param ctx the parse tree + */ + void exitNotMatchedAction(SQLParser.NotMatchedActionContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#assignmentList}. + * @param ctx the parse tree + */ + void enterAssignmentList(SQLParser.AssignmentListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#assignmentList}. + * @param ctx the parse tree + */ + void exitAssignmentList(SQLParser.AssignmentListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#assignment}. + * @param ctx the parse tree + */ + void enterAssignment(SQLParser.AssignmentContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#assignment}. + * @param ctx the parse tree + */ + void exitAssignment(SQLParser.AssignmentContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#whereClause}. + * @param ctx the parse tree + */ + void enterWhereClause(SQLParser.WhereClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#whereClause}. + * @param ctx the parse tree + */ + void exitWhereClause(SQLParser.WhereClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#havingClause}. + * @param ctx the parse tree + */ + void enterHavingClause(SQLParser.HavingClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#havingClause}. + * @param ctx the parse tree + */ + void exitHavingClause(SQLParser.HavingClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#hint}. + * @param ctx the parse tree + */ + void enterHint(SQLParser.HintContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#hint}. + * @param ctx the parse tree + */ + void exitHint(SQLParser.HintContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#hintStatement}. + * @param ctx the parse tree + */ + void enterHintStatement(SQLParser.HintStatementContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#hintStatement}. + * @param ctx the parse tree + */ + void exitHintStatement(SQLParser.HintStatementContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#fromClause}. + * @param ctx the parse tree + */ + void enterFromClause(SQLParser.FromClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#fromClause}. + * @param ctx the parse tree + */ + void exitFromClause(SQLParser.FromClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#aggregationClause}. + * @param ctx the parse tree + */ + void enterAggregationClause(SQLParser.AggregationClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#aggregationClause}. + * @param ctx the parse tree + */ + void exitAggregationClause(SQLParser.AggregationClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#groupByClause}. + * @param ctx the parse tree + */ + void enterGroupByClause(SQLParser.GroupByClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#groupByClause}. + * @param ctx the parse tree + */ + void exitGroupByClause(SQLParser.GroupByClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#groupingAnalytics}. + * @param ctx the parse tree + */ + void enterGroupingAnalytics(SQLParser.GroupingAnalyticsContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#groupingAnalytics}. + * @param ctx the parse tree + */ + void exitGroupingAnalytics(SQLParser.GroupingAnalyticsContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#groupingElement}. + * @param ctx the parse tree + */ + void enterGroupingElement(SQLParser.GroupingElementContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#groupingElement}. + * @param ctx the parse tree + */ + void exitGroupingElement(SQLParser.GroupingElementContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#groupingSet}. + * @param ctx the parse tree + */ + void enterGroupingSet(SQLParser.GroupingSetContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#groupingSet}. + * @param ctx the parse tree + */ + void exitGroupingSet(SQLParser.GroupingSetContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#pivotClause}. + * @param ctx the parse tree + */ + void enterPivotClause(SQLParser.PivotClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#pivotClause}. + * @param ctx the parse tree + */ + void exitPivotClause(SQLParser.PivotClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#pivotColumn}. + * @param ctx the parse tree + */ + void enterPivotColumn(SQLParser.PivotColumnContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#pivotColumn}. + * @param ctx the parse tree + */ + void exitPivotColumn(SQLParser.PivotColumnContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#pivotValue}. + * @param ctx the parse tree + */ + void enterPivotValue(SQLParser.PivotValueContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#pivotValue}. + * @param ctx the parse tree + */ + void exitPivotValue(SQLParser.PivotValueContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#lateralView}. + * @param ctx the parse tree + */ + void enterLateralView(SQLParser.LateralViewContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#lateralView}. + * @param ctx the parse tree + */ + void exitLateralView(SQLParser.LateralViewContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#setQuantifier}. + * @param ctx the parse tree + */ + void enterSetQuantifier(SQLParser.SetQuantifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#setQuantifier}. + * @param ctx the parse tree + */ + void exitSetQuantifier(SQLParser.SetQuantifierContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#relation}. + * @param ctx the parse tree + */ + void enterRelation(SQLParser.RelationContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#relation}. + * @param ctx the parse tree + */ + void exitRelation(SQLParser.RelationContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#joinRelation}. + * @param ctx the parse tree + */ + void enterJoinRelation(SQLParser.JoinRelationContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#joinRelation}. + * @param ctx the parse tree + */ + void exitJoinRelation(SQLParser.JoinRelationContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#joinType}. + * @param ctx the parse tree + */ + void enterJoinType(SQLParser.JoinTypeContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#joinType}. + * @param ctx the parse tree + */ + void exitJoinType(SQLParser.JoinTypeContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#joinCriteria}. + * @param ctx the parse tree + */ + void enterJoinCriteria(SQLParser.JoinCriteriaContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#joinCriteria}. + * @param ctx the parse tree + */ + void exitJoinCriteria(SQLParser.JoinCriteriaContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#sample}. + * @param ctx the parse tree + */ + void enterSample(SQLParser.SampleContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#sample}. + * @param ctx the parse tree + */ + void exitSample(SQLParser.SampleContext ctx); + /** + * Enter a parse tree produced by the {@code sampleByPercentile} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + */ + void enterSampleByPercentile(SQLParser.SampleByPercentileContext ctx); + /** + * Exit a parse tree produced by the {@code sampleByPercentile} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + */ + void exitSampleByPercentile(SQLParser.SampleByPercentileContext ctx); + /** + * Enter a parse tree produced by the {@code sampleByRows} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + */ + void enterSampleByRows(SQLParser.SampleByRowsContext ctx); + /** + * Exit a parse tree produced by the {@code sampleByRows} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + */ + void exitSampleByRows(SQLParser.SampleByRowsContext ctx); + /** + * Enter a parse tree produced by the {@code sampleByBucket} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + */ + void enterSampleByBucket(SQLParser.SampleByBucketContext ctx); + /** + * Exit a parse tree produced by the {@code sampleByBucket} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + */ + void exitSampleByBucket(SQLParser.SampleByBucketContext ctx); + /** + * Enter a parse tree produced by the {@code sampleByBytes} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + */ + void enterSampleByBytes(SQLParser.SampleByBytesContext ctx); + /** + * Exit a parse tree produced by the {@code sampleByBytes} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + */ + void exitSampleByBytes(SQLParser.SampleByBytesContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#identifierList}. + * @param ctx the parse tree + */ + void enterIdentifierList(SQLParser.IdentifierListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#identifierList}. + * @param ctx the parse tree + */ + void exitIdentifierList(SQLParser.IdentifierListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#identifierSeq}. + * @param ctx the parse tree + */ + void enterIdentifierSeq(SQLParser.IdentifierSeqContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#identifierSeq}. + * @param ctx the parse tree + */ + void exitIdentifierSeq(SQLParser.IdentifierSeqContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#orderedIdentifierList}. + * @param ctx the parse tree + */ + void enterOrderedIdentifierList(SQLParser.OrderedIdentifierListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#orderedIdentifierList}. + * @param ctx the parse tree + */ + void exitOrderedIdentifierList(SQLParser.OrderedIdentifierListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#orderedIdentifier}. + * @param ctx the parse tree + */ + void enterOrderedIdentifier(SQLParser.OrderedIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#orderedIdentifier}. + * @param ctx the parse tree + */ + void exitOrderedIdentifier(SQLParser.OrderedIdentifierContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#identifierCommentList}. + * @param ctx the parse tree + */ + void enterIdentifierCommentList(SQLParser.IdentifierCommentListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#identifierCommentList}. + * @param ctx the parse tree + */ + void exitIdentifierCommentList(SQLParser.IdentifierCommentListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#identifierComment}. + * @param ctx the parse tree + */ + void enterIdentifierComment(SQLParser.IdentifierCommentContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#identifierComment}. + * @param ctx the parse tree + */ + void exitIdentifierComment(SQLParser.IdentifierCommentContext ctx); + /** + * Enter a parse tree produced by the {@code tableName} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void enterTableName(SQLParser.TableNameContext ctx); + /** + * Exit a parse tree produced by the {@code tableName} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void exitTableName(SQLParser.TableNameContext ctx); + /** + * Enter a parse tree produced by the {@code aliasedQuery} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void enterAliasedQuery(SQLParser.AliasedQueryContext ctx); + /** + * Exit a parse tree produced by the {@code aliasedQuery} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void exitAliasedQuery(SQLParser.AliasedQueryContext ctx); + /** + * Enter a parse tree produced by the {@code aliasedRelation} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void enterAliasedRelation(SQLParser.AliasedRelationContext ctx); + /** + * Exit a parse tree produced by the {@code aliasedRelation} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void exitAliasedRelation(SQLParser.AliasedRelationContext ctx); + /** + * Enter a parse tree produced by the {@code inlineTableDefault2} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void enterInlineTableDefault2(SQLParser.InlineTableDefault2Context ctx); + /** + * Exit a parse tree produced by the {@code inlineTableDefault2} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void exitInlineTableDefault2(SQLParser.InlineTableDefault2Context ctx); + /** + * Enter a parse tree produced by the {@code tableValuedFunction} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void enterTableValuedFunction(SQLParser.TableValuedFunctionContext ctx); + /** + * Exit a parse tree produced by the {@code tableValuedFunction} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + */ + void exitTableValuedFunction(SQLParser.TableValuedFunctionContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#inlineTable}. + * @param ctx the parse tree + */ + void enterInlineTable(SQLParser.InlineTableContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#inlineTable}. + * @param ctx the parse tree + */ + void exitInlineTable(SQLParser.InlineTableContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#functionTable}. + * @param ctx the parse tree + */ + void enterFunctionTable(SQLParser.FunctionTableContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#functionTable}. + * @param ctx the parse tree + */ + void exitFunctionTable(SQLParser.FunctionTableContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#tableAlias}. + * @param ctx the parse tree + */ + void enterTableAlias(SQLParser.TableAliasContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#tableAlias}. + * @param ctx the parse tree + */ + void exitTableAlias(SQLParser.TableAliasContext ctx); + /** + * Enter a parse tree produced by the {@code rowFormatSerde} + * labeled alternative in {@link SQLParser#rowFormat}. + * @param ctx the parse tree + */ + void enterRowFormatSerde(SQLParser.RowFormatSerdeContext ctx); + /** + * Exit a parse tree produced by the {@code rowFormatSerde} + * labeled alternative in {@link SQLParser#rowFormat}. + * @param ctx the parse tree + */ + void exitRowFormatSerde(SQLParser.RowFormatSerdeContext ctx); + /** + * Enter a parse tree produced by the {@code rowFormatDelimited} + * labeled alternative in {@link SQLParser#rowFormat}. + * @param ctx the parse tree + */ + void enterRowFormatDelimited(SQLParser.RowFormatDelimitedContext ctx); + /** + * Exit a parse tree produced by the {@code rowFormatDelimited} + * labeled alternative in {@link SQLParser#rowFormat}. + * @param ctx the parse tree + */ + void exitRowFormatDelimited(SQLParser.RowFormatDelimitedContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#multipartIdentifierList}. + * @param ctx the parse tree + */ + void enterMultipartIdentifierList(SQLParser.MultipartIdentifierListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#multipartIdentifierList}. + * @param ctx the parse tree + */ + void exitMultipartIdentifierList(SQLParser.MultipartIdentifierListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#multipartIdentifier}. + * @param ctx the parse tree + */ + void enterMultipartIdentifier(SQLParser.MultipartIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#multipartIdentifier}. + * @param ctx the parse tree + */ + void exitMultipartIdentifier(SQLParser.MultipartIdentifierContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#tableIdentifier}. + * @param ctx the parse tree + */ + void enterTableIdentifier(SQLParser.TableIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#tableIdentifier}. + * @param ctx the parse tree + */ + void exitTableIdentifier(SQLParser.TableIdentifierContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#functionIdentifier}. + * @param ctx the parse tree + */ + void enterFunctionIdentifier(SQLParser.FunctionIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#functionIdentifier}. + * @param ctx the parse tree + */ + void exitFunctionIdentifier(SQLParser.FunctionIdentifierContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#namedExpression}. + * @param ctx the parse tree + */ + void enterNamedExpression(SQLParser.NamedExpressionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#namedExpression}. + * @param ctx the parse tree + */ + void exitNamedExpression(SQLParser.NamedExpressionContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#namedExpressionSeq}. + * @param ctx the parse tree + */ + void enterNamedExpressionSeq(SQLParser.NamedExpressionSeqContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#namedExpressionSeq}. + * @param ctx the parse tree + */ + void exitNamedExpressionSeq(SQLParser.NamedExpressionSeqContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#partitionFieldList}. + * @param ctx the parse tree + */ + void enterPartitionFieldList(SQLParser.PartitionFieldListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#partitionFieldList}. + * @param ctx the parse tree + */ + void exitPartitionFieldList(SQLParser.PartitionFieldListContext ctx); + /** + * Enter a parse tree produced by the {@code partitionTransform} + * labeled alternative in {@link SQLParser#partitionField}. + * @param ctx the parse tree + */ + void enterPartitionTransform(SQLParser.PartitionTransformContext ctx); + /** + * Exit a parse tree produced by the {@code partitionTransform} + * labeled alternative in {@link SQLParser#partitionField}. + * @param ctx the parse tree + */ + void exitPartitionTransform(SQLParser.PartitionTransformContext ctx); + /** + * Enter a parse tree produced by the {@code partitionColumn} + * labeled alternative in {@link SQLParser#partitionField}. + * @param ctx the parse tree + */ + void enterPartitionColumn(SQLParser.PartitionColumnContext ctx); + /** + * Exit a parse tree produced by the {@code partitionColumn} + * labeled alternative in {@link SQLParser#partitionField}. + * @param ctx the parse tree + */ + void exitPartitionColumn(SQLParser.PartitionColumnContext ctx); + /** + * Enter a parse tree produced by the {@code identityTransform} + * labeled alternative in {@link SQLParser#transform}. + * @param ctx the parse tree + */ + void enterIdentityTransform(SQLParser.IdentityTransformContext ctx); + /** + * Exit a parse tree produced by the {@code identityTransform} + * labeled alternative in {@link SQLParser#transform}. + * @param ctx the parse tree + */ + void exitIdentityTransform(SQLParser.IdentityTransformContext ctx); + /** + * Enter a parse tree produced by the {@code applyTransform} + * labeled alternative in {@link SQLParser#transform}. + * @param ctx the parse tree + */ + void enterApplyTransform(SQLParser.ApplyTransformContext ctx); + /** + * Exit a parse tree produced by the {@code applyTransform} + * labeled alternative in {@link SQLParser#transform}. + * @param ctx the parse tree + */ + void exitApplyTransform(SQLParser.ApplyTransformContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#transformArgument}. + * @param ctx the parse tree + */ + void enterTransformArgument(SQLParser.TransformArgumentContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#transformArgument}. + * @param ctx the parse tree + */ + void exitTransformArgument(SQLParser.TransformArgumentContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#expression}. + * @param ctx the parse tree + */ + void enterExpression(SQLParser.ExpressionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#expression}. + * @param ctx the parse tree + */ + void exitExpression(SQLParser.ExpressionContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#expressionSeq}. + * @param ctx the parse tree + */ + void enterExpressionSeq(SQLParser.ExpressionSeqContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#expressionSeq}. + * @param ctx the parse tree + */ + void exitExpressionSeq(SQLParser.ExpressionSeqContext ctx); + /** + * Enter a parse tree produced by the {@code logicalNot} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + */ + void enterLogicalNot(SQLParser.LogicalNotContext ctx); + /** + * Exit a parse tree produced by the {@code logicalNot} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + */ + void exitLogicalNot(SQLParser.LogicalNotContext ctx); + /** + * Enter a parse tree produced by the {@code predicated} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + */ + void enterPredicated(SQLParser.PredicatedContext ctx); + /** + * Exit a parse tree produced by the {@code predicated} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + */ + void exitPredicated(SQLParser.PredicatedContext ctx); + /** + * Enter a parse tree produced by the {@code exists} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + */ + void enterExists(SQLParser.ExistsContext ctx); + /** + * Exit a parse tree produced by the {@code exists} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + */ + void exitExists(SQLParser.ExistsContext ctx); + /** + * Enter a parse tree produced by the {@code logicalBinary} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + */ + void enterLogicalBinary(SQLParser.LogicalBinaryContext ctx); + /** + * Exit a parse tree produced by the {@code logicalBinary} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + */ + void exitLogicalBinary(SQLParser.LogicalBinaryContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#predicate}. + * @param ctx the parse tree + */ + void enterPredicate(SQLParser.PredicateContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#predicate}. + * @param ctx the parse tree + */ + void exitPredicate(SQLParser.PredicateContext ctx); + /** + * Enter a parse tree produced by the {@code valueExpressionDefault} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + */ + void enterValueExpressionDefault(SQLParser.ValueExpressionDefaultContext ctx); + /** + * Exit a parse tree produced by the {@code valueExpressionDefault} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + */ + void exitValueExpressionDefault(SQLParser.ValueExpressionDefaultContext ctx); + /** + * Enter a parse tree produced by the {@code comparison} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + */ + void enterComparison(SQLParser.ComparisonContext ctx); + /** + * Exit a parse tree produced by the {@code comparison} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + */ + void exitComparison(SQLParser.ComparisonContext ctx); + /** + * Enter a parse tree produced by the {@code arithmeticBinary} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + */ + void enterArithmeticBinary(SQLParser.ArithmeticBinaryContext ctx); + /** + * Exit a parse tree produced by the {@code arithmeticBinary} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + */ + void exitArithmeticBinary(SQLParser.ArithmeticBinaryContext ctx); + /** + * Enter a parse tree produced by the {@code arithmeticUnary} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + */ + void enterArithmeticUnary(SQLParser.ArithmeticUnaryContext ctx); + /** + * Exit a parse tree produced by the {@code arithmeticUnary} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + */ + void exitArithmeticUnary(SQLParser.ArithmeticUnaryContext ctx); + /** + * Enter a parse tree produced by the {@code struct} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterStruct(SQLParser.StructContext ctx); + /** + * Exit a parse tree produced by the {@code struct} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitStruct(SQLParser.StructContext ctx); + /** + * Enter a parse tree produced by the {@code dereference} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterDereference(SQLParser.DereferenceContext ctx); + /** + * Exit a parse tree produced by the {@code dereference} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitDereference(SQLParser.DereferenceContext ctx); + /** + * Enter a parse tree produced by the {@code simpleCase} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterSimpleCase(SQLParser.SimpleCaseContext ctx); + /** + * Exit a parse tree produced by the {@code simpleCase} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitSimpleCase(SQLParser.SimpleCaseContext ctx); + /** + * Enter a parse tree produced by the {@code currentLike} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterCurrentLike(SQLParser.CurrentLikeContext ctx); + /** + * Exit a parse tree produced by the {@code currentLike} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitCurrentLike(SQLParser.CurrentLikeContext ctx); + /** + * Enter a parse tree produced by the {@code columnReference} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterColumnReference(SQLParser.ColumnReferenceContext ctx); + /** + * Exit a parse tree produced by the {@code columnReference} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitColumnReference(SQLParser.ColumnReferenceContext ctx); + /** + * Enter a parse tree produced by the {@code rowConstructor} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterRowConstructor(SQLParser.RowConstructorContext ctx); + /** + * Exit a parse tree produced by the {@code rowConstructor} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitRowConstructor(SQLParser.RowConstructorContext ctx); + /** + * Enter a parse tree produced by the {@code last} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterLast(SQLParser.LastContext ctx); + /** + * Exit a parse tree produced by the {@code last} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitLast(SQLParser.LastContext ctx); + /** + * Enter a parse tree produced by the {@code star} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterStar(SQLParser.StarContext ctx); + /** + * Exit a parse tree produced by the {@code star} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitStar(SQLParser.StarContext ctx); + /** + * Enter a parse tree produced by the {@code overlay} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterOverlay(SQLParser.OverlayContext ctx); + /** + * Exit a parse tree produced by the {@code overlay} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitOverlay(SQLParser.OverlayContext ctx); + /** + * Enter a parse tree produced by the {@code subscript} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterSubscript(SQLParser.SubscriptContext ctx); + /** + * Exit a parse tree produced by the {@code subscript} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitSubscript(SQLParser.SubscriptContext ctx); + /** + * Enter a parse tree produced by the {@code subqueryExpression} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterSubqueryExpression(SQLParser.SubqueryExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code subqueryExpression} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitSubqueryExpression(SQLParser.SubqueryExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code substring} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterSubstring(SQLParser.SubstringContext ctx); + /** + * Exit a parse tree produced by the {@code substring} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitSubstring(SQLParser.SubstringContext ctx); + /** + * Enter a parse tree produced by the {@code cast} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterCast(SQLParser.CastContext ctx); + /** + * Exit a parse tree produced by the {@code cast} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitCast(SQLParser.CastContext ctx); + /** + * Enter a parse tree produced by the {@code constantDefault} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterConstantDefault(SQLParser.ConstantDefaultContext ctx); + /** + * Exit a parse tree produced by the {@code constantDefault} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitConstantDefault(SQLParser.ConstantDefaultContext ctx); + /** + * Enter a parse tree produced by the {@code lambda} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterLambda(SQLParser.LambdaContext ctx); + /** + * Exit a parse tree produced by the {@code lambda} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitLambda(SQLParser.LambdaContext ctx); + /** + * Enter a parse tree produced by the {@code parenthesizedExpression} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterParenthesizedExpression(SQLParser.ParenthesizedExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code parenthesizedExpression} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitParenthesizedExpression(SQLParser.ParenthesizedExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code extract} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterExtract(SQLParser.ExtractContext ctx); + /** + * Exit a parse tree produced by the {@code extract} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitExtract(SQLParser.ExtractContext ctx); + /** + * Enter a parse tree produced by the {@code trim} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterTrim(SQLParser.TrimContext ctx); + /** + * Exit a parse tree produced by the {@code trim} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitTrim(SQLParser.TrimContext ctx); + /** + * Enter a parse tree produced by the {@code functionCall} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterFunctionCall(SQLParser.FunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code functionCall} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitFunctionCall(SQLParser.FunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code searchedCase} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterSearchedCase(SQLParser.SearchedCaseContext ctx); + /** + * Exit a parse tree produced by the {@code searchedCase} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitSearchedCase(SQLParser.SearchedCaseContext ctx); + /** + * Enter a parse tree produced by the {@code position} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterPosition(SQLParser.PositionContext ctx); + /** + * Exit a parse tree produced by the {@code position} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitPosition(SQLParser.PositionContext ctx); + /** + * Enter a parse tree produced by the {@code first} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void enterFirst(SQLParser.FirstContext ctx); + /** + * Exit a parse tree produced by the {@code first} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + */ + void exitFirst(SQLParser.FirstContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#limitExpression}. + * @param ctx the parse tree + */ + void enterLimitExpression(SQLParser.LimitExpressionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#limitExpression}. + * @param ctx the parse tree + */ + void exitLimitExpression(SQLParser.LimitExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code nullLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void enterNullLiteral(SQLParser.NullLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code nullLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void exitNullLiteral(SQLParser.NullLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code intervalLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void enterIntervalLiteral(SQLParser.IntervalLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code intervalLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void exitIntervalLiteral(SQLParser.IntervalLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code typeConstructor} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void enterTypeConstructor(SQLParser.TypeConstructorContext ctx); + /** + * Exit a parse tree produced by the {@code typeConstructor} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void exitTypeConstructor(SQLParser.TypeConstructorContext ctx); + /** + * Enter a parse tree produced by the {@code numericLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void enterNumericLiteral(SQLParser.NumericLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code numericLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void exitNumericLiteral(SQLParser.NumericLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code booleanLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void enterBooleanLiteral(SQLParser.BooleanLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code booleanLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void exitBooleanLiteral(SQLParser.BooleanLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code stringLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void enterStringLiteral(SQLParser.StringLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code stringLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + */ + void exitStringLiteral(SQLParser.StringLiteralContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#comparisonOperator}. + * @param ctx the parse tree + */ + void enterComparisonOperator(SQLParser.ComparisonOperatorContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#comparisonOperator}. + * @param ctx the parse tree + */ + void exitComparisonOperator(SQLParser.ComparisonOperatorContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#arithmeticOperator}. + * @param ctx the parse tree + */ + void enterArithmeticOperator(SQLParser.ArithmeticOperatorContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#arithmeticOperator}. + * @param ctx the parse tree + */ + void exitArithmeticOperator(SQLParser.ArithmeticOperatorContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#predicateOperator}. + * @param ctx the parse tree + */ + void enterPredicateOperator(SQLParser.PredicateOperatorContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#predicateOperator}. + * @param ctx the parse tree + */ + void exitPredicateOperator(SQLParser.PredicateOperatorContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#booleanValue}. + * @param ctx the parse tree + */ + void enterBooleanValue(SQLParser.BooleanValueContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#booleanValue}. + * @param ctx the parse tree + */ + void exitBooleanValue(SQLParser.BooleanValueContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#interval}. + * @param ctx the parse tree + */ + void enterInterval(SQLParser.IntervalContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#interval}. + * @param ctx the parse tree + */ + void exitInterval(SQLParser.IntervalContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#errorCapturingMultiUnitsInterval}. + * @param ctx the parse tree + */ + void enterErrorCapturingMultiUnitsInterval(SQLParser.ErrorCapturingMultiUnitsIntervalContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#errorCapturingMultiUnitsInterval}. + * @param ctx the parse tree + */ + void exitErrorCapturingMultiUnitsInterval(SQLParser.ErrorCapturingMultiUnitsIntervalContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#multiUnitsInterval}. + * @param ctx the parse tree + */ + void enterMultiUnitsInterval(SQLParser.MultiUnitsIntervalContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#multiUnitsInterval}. + * @param ctx the parse tree + */ + void exitMultiUnitsInterval(SQLParser.MultiUnitsIntervalContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#errorCapturingUnitToUnitInterval}. + * @param ctx the parse tree + */ + void enterErrorCapturingUnitToUnitInterval(SQLParser.ErrorCapturingUnitToUnitIntervalContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#errorCapturingUnitToUnitInterval}. + * @param ctx the parse tree + */ + void exitErrorCapturingUnitToUnitInterval(SQLParser.ErrorCapturingUnitToUnitIntervalContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#unitToUnitInterval}. + * @param ctx the parse tree + */ + void enterUnitToUnitInterval(SQLParser.UnitToUnitIntervalContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#unitToUnitInterval}. + * @param ctx the parse tree + */ + void exitUnitToUnitInterval(SQLParser.UnitToUnitIntervalContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#intervalValue}. + * @param ctx the parse tree + */ + void enterIntervalValue(SQLParser.IntervalValueContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#intervalValue}. + * @param ctx the parse tree + */ + void exitIntervalValue(SQLParser.IntervalValueContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#colPosition}. + * @param ctx the parse tree + */ + void enterColPosition(SQLParser.ColPositionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#colPosition}. + * @param ctx the parse tree + */ + void exitColPosition(SQLParser.ColPositionContext ctx); + /** + * Enter a parse tree produced by the {@code complexDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + */ + void enterComplexDataType(SQLParser.ComplexDataTypeContext ctx); + /** + * Exit a parse tree produced by the {@code complexDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + */ + void exitComplexDataType(SQLParser.ComplexDataTypeContext ctx); + /** + * Enter a parse tree produced by the {@code yearMonthIntervalDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + */ + void enterYearMonthIntervalDataType(SQLParser.YearMonthIntervalDataTypeContext ctx); + /** + * Exit a parse tree produced by the {@code yearMonthIntervalDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + */ + void exitYearMonthIntervalDataType(SQLParser.YearMonthIntervalDataTypeContext ctx); + /** + * Enter a parse tree produced by the {@code dayTimeIntervalDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + */ + void enterDayTimeIntervalDataType(SQLParser.DayTimeIntervalDataTypeContext ctx); + /** + * Exit a parse tree produced by the {@code dayTimeIntervalDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + */ + void exitDayTimeIntervalDataType(SQLParser.DayTimeIntervalDataTypeContext ctx); + /** + * Enter a parse tree produced by the {@code primitiveDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + */ + void enterPrimitiveDataType(SQLParser.PrimitiveDataTypeContext ctx); + /** + * Exit a parse tree produced by the {@code primitiveDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + */ + void exitPrimitiveDataType(SQLParser.PrimitiveDataTypeContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#qualifiedColTypeWithPositionList}. + * @param ctx the parse tree + */ + void enterQualifiedColTypeWithPositionList(SQLParser.QualifiedColTypeWithPositionListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#qualifiedColTypeWithPositionList}. + * @param ctx the parse tree + */ + void exitQualifiedColTypeWithPositionList(SQLParser.QualifiedColTypeWithPositionListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#qualifiedColTypeWithPosition}. + * @param ctx the parse tree + */ + void enterQualifiedColTypeWithPosition(SQLParser.QualifiedColTypeWithPositionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#qualifiedColTypeWithPosition}. + * @param ctx the parse tree + */ + void exitQualifiedColTypeWithPosition(SQLParser.QualifiedColTypeWithPositionContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#colTypeList}. + * @param ctx the parse tree + */ + void enterColTypeList(SQLParser.ColTypeListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#colTypeList}. + * @param ctx the parse tree + */ + void exitColTypeList(SQLParser.ColTypeListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#colType}. + * @param ctx the parse tree + */ + void enterColType(SQLParser.ColTypeContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#colType}. + * @param ctx the parse tree + */ + void exitColType(SQLParser.ColTypeContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#complexColTypeList}. + * @param ctx the parse tree + */ + void enterComplexColTypeList(SQLParser.ComplexColTypeListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#complexColTypeList}. + * @param ctx the parse tree + */ + void exitComplexColTypeList(SQLParser.ComplexColTypeListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#complexColType}. + * @param ctx the parse tree + */ + void enterComplexColType(SQLParser.ComplexColTypeContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#complexColType}. + * @param ctx the parse tree + */ + void exitComplexColType(SQLParser.ComplexColTypeContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#whenClause}. + * @param ctx the parse tree + */ + void enterWhenClause(SQLParser.WhenClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#whenClause}. + * @param ctx the parse tree + */ + void exitWhenClause(SQLParser.WhenClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#windowClause}. + * @param ctx the parse tree + */ + void enterWindowClause(SQLParser.WindowClauseContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#windowClause}. + * @param ctx the parse tree + */ + void exitWindowClause(SQLParser.WindowClauseContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#namedWindow}. + * @param ctx the parse tree + */ + void enterNamedWindow(SQLParser.NamedWindowContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#namedWindow}. + * @param ctx the parse tree + */ + void exitNamedWindow(SQLParser.NamedWindowContext ctx); + /** + * Enter a parse tree produced by the {@code windowRef} + * labeled alternative in {@link SQLParser#windowSpec}. + * @param ctx the parse tree + */ + void enterWindowRef(SQLParser.WindowRefContext ctx); + /** + * Exit a parse tree produced by the {@code windowRef} + * labeled alternative in {@link SQLParser#windowSpec}. + * @param ctx the parse tree + */ + void exitWindowRef(SQLParser.WindowRefContext ctx); + /** + * Enter a parse tree produced by the {@code windowDef} + * labeled alternative in {@link SQLParser#windowSpec}. + * @param ctx the parse tree + */ + void enterWindowDef(SQLParser.WindowDefContext ctx); + /** + * Exit a parse tree produced by the {@code windowDef} + * labeled alternative in {@link SQLParser#windowSpec}. + * @param ctx the parse tree + */ + void exitWindowDef(SQLParser.WindowDefContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#windowFrame}. + * @param ctx the parse tree + */ + void enterWindowFrame(SQLParser.WindowFrameContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#windowFrame}. + * @param ctx the parse tree + */ + void exitWindowFrame(SQLParser.WindowFrameContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#frameBound}. + * @param ctx the parse tree + */ + void enterFrameBound(SQLParser.FrameBoundContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#frameBound}. + * @param ctx the parse tree + */ + void exitFrameBound(SQLParser.FrameBoundContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#qualifiedNameList}. + * @param ctx the parse tree + */ + void enterQualifiedNameList(SQLParser.QualifiedNameListContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#qualifiedNameList}. + * @param ctx the parse tree + */ + void exitQualifiedNameList(SQLParser.QualifiedNameListContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#functionName}. + * @param ctx the parse tree + */ + void enterFunctionName(SQLParser.FunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#functionName}. + * @param ctx the parse tree + */ + void exitFunctionName(SQLParser.FunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#qualifiedName}. + * @param ctx the parse tree + */ + void enterQualifiedName(SQLParser.QualifiedNameContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#qualifiedName}. + * @param ctx the parse tree + */ + void exitQualifiedName(SQLParser.QualifiedNameContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#errorCapturingIdentifier}. + * @param ctx the parse tree + */ + void enterErrorCapturingIdentifier(SQLParser.ErrorCapturingIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#errorCapturingIdentifier}. + * @param ctx the parse tree + */ + void exitErrorCapturingIdentifier(SQLParser.ErrorCapturingIdentifierContext ctx); + /** + * Enter a parse tree produced by the {@code errorIdent} + * labeled alternative in {@link SQLParser#errorCapturingIdentifierExtra}. + * @param ctx the parse tree + */ + void enterErrorIdent(SQLParser.ErrorIdentContext ctx); + /** + * Exit a parse tree produced by the {@code errorIdent} + * labeled alternative in {@link SQLParser#errorCapturingIdentifierExtra}. + * @param ctx the parse tree + */ + void exitErrorIdent(SQLParser.ErrorIdentContext ctx); + /** + * Enter a parse tree produced by the {@code realIdent} + * labeled alternative in {@link SQLParser#errorCapturingIdentifierExtra}. + * @param ctx the parse tree + */ + void enterRealIdent(SQLParser.RealIdentContext ctx); + /** + * Exit a parse tree produced by the {@code realIdent} + * labeled alternative in {@link SQLParser#errorCapturingIdentifierExtra}. + * @param ctx the parse tree + */ + void exitRealIdent(SQLParser.RealIdentContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#identifier}. + * @param ctx the parse tree + */ + void enterIdentifier(SQLParser.IdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#identifier}. + * @param ctx the parse tree + */ + void exitIdentifier(SQLParser.IdentifierContext ctx); + /** + * Enter a parse tree produced by the {@code unquotedIdentifier} + * labeled alternative in {@link SQLParser#strictIdentifier}. + * @param ctx the parse tree + */ + void enterUnquotedIdentifier(SQLParser.UnquotedIdentifierContext ctx); + /** + * Exit a parse tree produced by the {@code unquotedIdentifier} + * labeled alternative in {@link SQLParser#strictIdentifier}. + * @param ctx the parse tree + */ + void exitUnquotedIdentifier(SQLParser.UnquotedIdentifierContext ctx); + /** + * Enter a parse tree produced by the {@code quotedIdentifierAlternative} + * labeled alternative in {@link SQLParser#strictIdentifier}. + * @param ctx the parse tree + */ + void enterQuotedIdentifierAlternative(SQLParser.QuotedIdentifierAlternativeContext ctx); + /** + * Exit a parse tree produced by the {@code quotedIdentifierAlternative} + * labeled alternative in {@link SQLParser#strictIdentifier}. + * @param ctx the parse tree + */ + void exitQuotedIdentifierAlternative(SQLParser.QuotedIdentifierAlternativeContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#quotedIdentifier}. + * @param ctx the parse tree + */ + void enterQuotedIdentifier(SQLParser.QuotedIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#quotedIdentifier}. + * @param ctx the parse tree + */ + void exitQuotedIdentifier(SQLParser.QuotedIdentifierContext ctx); + /** + * Enter a parse tree produced by the {@code exponentLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterExponentLiteral(SQLParser.ExponentLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code exponentLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitExponentLiteral(SQLParser.ExponentLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code decimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterDecimalLiteral(SQLParser.DecimalLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code decimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitDecimalLiteral(SQLParser.DecimalLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code legacyDecimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterLegacyDecimalLiteral(SQLParser.LegacyDecimalLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code legacyDecimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitLegacyDecimalLiteral(SQLParser.LegacyDecimalLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code integerLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterIntegerLiteral(SQLParser.IntegerLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code integerLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitIntegerLiteral(SQLParser.IntegerLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code bigIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterBigIntLiteral(SQLParser.BigIntLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code bigIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitBigIntLiteral(SQLParser.BigIntLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code smallIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterSmallIntLiteral(SQLParser.SmallIntLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code smallIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitSmallIntLiteral(SQLParser.SmallIntLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code tinyIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterTinyIntLiteral(SQLParser.TinyIntLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code tinyIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitTinyIntLiteral(SQLParser.TinyIntLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code doubleLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterDoubleLiteral(SQLParser.DoubleLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code doubleLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitDoubleLiteral(SQLParser.DoubleLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code floatLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterFloatLiteral(SQLParser.FloatLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code floatLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitFloatLiteral(SQLParser.FloatLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code bigDecimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void enterBigDecimalLiteral(SQLParser.BigDecimalLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code bigDecimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + */ + void exitBigDecimalLiteral(SQLParser.BigDecimalLiteralContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#alterColumnAction}. + * @param ctx the parse tree + */ + void enterAlterColumnAction(SQLParser.AlterColumnActionContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#alterColumnAction}. + * @param ctx the parse tree + */ + void exitAlterColumnAction(SQLParser.AlterColumnActionContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#ansiNonReserved}. + * @param ctx the parse tree + */ + void enterAnsiNonReserved(SQLParser.AnsiNonReservedContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#ansiNonReserved}. + * @param ctx the parse tree + */ + void exitAnsiNonReserved(SQLParser.AnsiNonReservedContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#strictNonReserved}. + * @param ctx the parse tree + */ + void enterStrictNonReserved(SQLParser.StrictNonReservedContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#strictNonReserved}. + * @param ctx the parse tree + */ + void exitStrictNonReserved(SQLParser.StrictNonReservedContext ctx); + /** + * Enter a parse tree produced by {@link SQLParser#nonReserved}. + * @param ctx the parse tree + */ + void enterNonReserved(SQLParser.NonReservedContext ctx); + /** + * Exit a parse tree produced by {@link SQLParser#nonReserved}. + * @param ctx the parse tree + */ + void exitNonReserved(SQLParser.NonReservedContext ctx); +} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQLParser.java b/mypages/src/main/java/io/leego/mypages/sql/SQLParser.java new file mode 100644 index 0000000..a649fa6 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQLParser.java @@ -0,0 +1,22587 @@ +package io.leego.mypages.sql; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class SQLParser extends Parser { + static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, ADD=8, AFTER=9, + ALL=10, ALTER=11, ANALYZE=12, AND=13, ANTI=14, ANY=15, ARCHIVE=16, ARRAY=17, + AS=18, ASC=19, AT=20, AUTHORIZATION=21, BETWEEN=22, BOTH=23, BUCKET=24, + BUCKETS=25, BY=26, CACHE=27, CASCADE=28, CASE=29, CAST=30, CHANGE=31, + CHECK=32, CLEAR=33, CLUSTER=34, CLUSTERED=35, CODEGEN=36, COLLATE=37, + COLLECTION=38, COLUMN=39, COLUMNS=40, COMMENT=41, COMMIT=42, COMPACT=43, + COMPACTIONS=44, COMPUTE=45, CONCATENATE=46, CONSTRAINT=47, COST=48, CREATE=49, + CROSS=50, CUBE=51, CURRENT=52, CURRENT_DATE=53, CURRENT_TIME=54, CURRENT_TIMESTAMP=55, + CURRENT_USER=56, DAY=57, DATA=58, DATABASE=59, DATABASES=60, DBPROPERTIES=61, + DEFINED=62, DELETE=63, DELIMITED=64, DESC=65, DESCRIBE=66, DFS=67, DIRECTORIES=68, + DIRECTORY=69, DISTINCT=70, DISTRIBUTE=71, DIV=72, DROP=73, ELSE=74, END=75, + ESCAPE=76, ESCAPED=77, EXCEPT=78, EXCHANGE=79, EXISTS=80, EXPLAIN=81, + EXPORT=82, EXTENDED=83, EXTERNAL=84, EXTRACT=85, FALSE=86, FETCH=87, FIELDS=88, + FILTER=89, FILEFORMAT=90, FIRST=91, FOLLOWING=92, FOR=93, FOREIGN=94, + FORMAT=95, FORMATTED=96, FROM=97, FULL=98, FUNCTION=99, FUNCTIONS=100, + GLOBAL=101, GRANT=102, GROUP=103, GROUPING=104, HAVING=105, HOUR=106, + IF=107, IGNORE=108, IMPORT=109, IN=110, INDEX=111, INDEXES=112, INNER=113, + INPATH=114, INPUTFORMAT=115, INSERT=116, INTERSECT=117, INTERVAL=118, + INTO=119, IS=120, ITEMS=121, JOIN=122, KEYS=123, LAST=124, LATERAL=125, + LAZY=126, LEADING=127, LEFT=128, LIKE=129, LIMIT=130, LINES=131, LIST=132, + LOAD=133, LOCAL=134, LOCATION=135, LOCK=136, LOCKS=137, LOGICAL=138, MACRO=139, + MAP=140, MATCHED=141, MERGE=142, MINUTE=143, MONTH=144, MSCK=145, NAMESPACE=146, + NAMESPACES=147, NATURAL=148, NO=149, NOT=150, NULL=151, NULLS=152, OF=153, + OFFSET=154, ON=155, ONLY=156, OPTION=157, OPTIONS=158, OR=159, ORDER=160, + OUT=161, OUTER=162, OUTPUTFORMAT=163, OVER=164, OVERLAPS=165, OVERLAY=166, + OVERWRITE=167, PARTITION=168, PARTITIONED=169, PARTITIONS=170, PERCENTLIT=171, + PIVOT=172, PLACING=173, POSITION=174, PRECEDING=175, PRIMARY=176, PRINCIPALS=177, + PROPERTIES=178, PURGE=179, QUERY=180, RANGE=181, RECORDREADER=182, RECORDWRITER=183, + RECOVER=184, REDUCE=185, REFERENCES=186, REFRESH=187, RENAME=188, REPAIR=189, + REPLACE=190, RESET=191, RESPECT=192, RESTRICT=193, REVOKE=194, RIGHT=195, + RLIKE=196, ROLE=197, ROLES=198, ROLLBACK=199, ROLLUP=200, ROW=201, ROWS=202, + SECOND=203, SCHEMA=204, SELECT=205, SEMI=206, SEPARATED=207, SERDE=208, + SERDEPROPERTIES=209, SESSION_USER=210, SET=211, SETMINUS=212, SETS=213, + SHOW=214, SKEWED=215, SOME=216, SORT=217, SORTED=218, START=219, STATISTICS=220, + STORED=221, STRATIFY=222, STRUCT=223, SUBSTR=224, SUBSTRING=225, SYNC=226, + TABLE=227, TABLES=228, TABLESAMPLE=229, TBLPROPERTIES=230, TEMPORARY=231, + TERMINATED=232, THEN=233, TIME=234, TO=235, TOUCH=236, TRAILING=237, TRANSACTION=238, + TRANSACTIONS=239, TRANSFORM=240, TRIM=241, TRUE=242, TRUNCATE=243, TRY_CAST=244, + TYPE=245, UNARCHIVE=246, UNBOUNDED=247, UNCACHE=248, UNION=249, UNIQUE=250, + UNKNOWN=251, UNLOCK=252, UNSET=253, UPDATE=254, USE=255, USER=256, USING=257, + VALUES=258, VIEW=259, VIEWS=260, WHEN=261, WHERE=262, WINDOW=263, WITH=264, + YEAR=265, ZONE=266, EQ=267, NSEQ=268, NEQ=269, NEQJ=270, LT=271, LTE=272, + GT=273, GTE=274, PLUS=275, MINUS=276, ASTERISK=277, SLASH=278, PERCENT=279, + TILDE=280, AMPERSAND=281, PIPE=282, CONCAT_PIPE=283, HAT=284, UNDERSCORE=285, + EXCLAMATION=286, POINT=287, COMMA=288, COLON=289, SEMICOLON=290, STRING=291, + BIGINT_LITERAL=292, SMALLINT_LITERAL=293, TINYINT_LITERAL=294, INTEGER_VALUE=295, + EXPONENT_VALUE=296, DECIMAL_VALUE=297, FLOAT_LITERAL=298, DOUBLE_LITERAL=299, + BIGDECIMAL_LITERAL=300, IDENTIFIER=301, BACKQUOTED_IDENTIFIER=302, SIMPLE_COMMENT=303, + BRACKETED_COMMENT=304, WS=305, UNRECOGNIZED=306; + public static final int + RULE_singleStatement = 0, RULE_singleExpression = 1, RULE_singleTableIdentifier = 2, + RULE_singleMultipartIdentifier = 3, RULE_singleFunctionIdentifier = 4, + RULE_singleDataType = 5, RULE_singleTableSchema = 6, RULE_statement = 7, + RULE_configKey = 8, RULE_configValue = 9, RULE_unsupportedHiveNativeCommands = 10, + RULE_createTableHeader = 11, RULE_replaceTableHeader = 12, RULE_bucketSpec = 13, + RULE_skewSpec = 14, RULE_locationSpec = 15, RULE_commentSpec = 16, RULE_query = 17, + RULE_insertInto = 18, RULE_partitionSpecLocation = 19, RULE_partitionSpec = 20, + RULE_partitionVal = 21, RULE_namespace = 22, RULE_describeFuncName = 23, + RULE_describeColName = 24, RULE_ctes = 25, RULE_namedQuery = 26, RULE_tableProvider = 27, + RULE_createTableClauses = 28, RULE_tablePropertyList = 29, RULE_tableProperty = 30, + RULE_tablePropertyKey = 31, RULE_tablePropertyValue = 32, RULE_constantList = 33, + RULE_nestedConstantList = 34, RULE_createFileFormat = 35, RULE_fileFormat = 36, + RULE_storageHandler = 37, RULE_resource = 38, RULE_dmlStatementNoWith = 39, + RULE_queryOrganization = 40, RULE_multiInsertQueryBody = 41, RULE_queryTerm = 42, + RULE_queryPrimary = 43, RULE_sortItem = 44, RULE_fromStatement = 45, RULE_fromStatementBody = 46, + RULE_querySpecification = 47, RULE_transformClause = 48, RULE_selectClause = 49, + RULE_setClause = 50, RULE_matchedClause = 51, RULE_notMatchedClause = 52, + RULE_matchedAction = 53, RULE_notMatchedAction = 54, RULE_assignmentList = 55, + RULE_assignment = 56, RULE_whereClause = 57, RULE_havingClause = 58, RULE_hint = 59, + RULE_hintStatement = 60, RULE_fromClause = 61, RULE_aggregationClause = 62, + RULE_groupByClause = 63, RULE_groupingAnalytics = 64, RULE_groupingElement = 65, + RULE_groupingSet = 66, RULE_pivotClause = 67, RULE_pivotColumn = 68, RULE_pivotValue = 69, + RULE_lateralView = 70, RULE_setQuantifier = 71, RULE_relation = 72, RULE_joinRelation = 73, + RULE_joinType = 74, RULE_joinCriteria = 75, RULE_sample = 76, RULE_sampleMethod = 77, + RULE_identifierList = 78, RULE_identifierSeq = 79, RULE_orderedIdentifierList = 80, + RULE_orderedIdentifier = 81, RULE_identifierCommentList = 82, RULE_identifierComment = 83, + RULE_relationPrimary = 84, RULE_inlineTable = 85, RULE_functionTable = 86, + RULE_tableAlias = 87, RULE_rowFormat = 88, RULE_multipartIdentifierList = 89, + RULE_multipartIdentifier = 90, RULE_tableIdentifier = 91, RULE_functionIdentifier = 92, + RULE_namedExpression = 93, RULE_namedExpressionSeq = 94, RULE_partitionFieldList = 95, + RULE_partitionField = 96, RULE_transform = 97, RULE_transformArgument = 98, + RULE_expression = 99, RULE_expressionSeq = 100, RULE_booleanExpression = 101, + RULE_predicate = 102, RULE_valueExpression = 103, RULE_primaryExpression = 104, + RULE_limitExpression = 105, RULE_constant = 106, RULE_comparisonOperator = 107, + RULE_arithmeticOperator = 108, RULE_predicateOperator = 109, RULE_booleanValue = 110, + RULE_interval = 111, RULE_errorCapturingMultiUnitsInterval = 112, RULE_multiUnitsInterval = 113, + RULE_errorCapturingUnitToUnitInterval = 114, RULE_unitToUnitInterval = 115, + RULE_intervalValue = 116, RULE_colPosition = 117, RULE_dataType = 118, + RULE_qualifiedColTypeWithPositionList = 119, RULE_qualifiedColTypeWithPosition = 120, + RULE_colTypeList = 121, RULE_colType = 122, RULE_complexColTypeList = 123, + RULE_complexColType = 124, RULE_whenClause = 125, RULE_windowClause = 126, + RULE_namedWindow = 127, RULE_windowSpec = 128, RULE_windowFrame = 129, + RULE_frameBound = 130, RULE_qualifiedNameList = 131, RULE_functionName = 132, + RULE_qualifiedName = 133, RULE_errorCapturingIdentifier = 134, RULE_errorCapturingIdentifierExtra = 135, + RULE_identifier = 136, RULE_strictIdentifier = 137, RULE_quotedIdentifier = 138, + RULE_number = 139, RULE_alterColumnAction = 140, RULE_ansiNonReserved = 141, + RULE_strictNonReserved = 142, RULE_nonReserved = 143; + private static String[] makeRuleNames() { + return new String[] { + "singleStatement", "singleExpression", "singleTableIdentifier", "singleMultipartIdentifier", + "singleFunctionIdentifier", "singleDataType", "singleTableSchema", "statement", + "configKey", "configValue", "unsupportedHiveNativeCommands", "createTableHeader", + "replaceTableHeader", "bucketSpec", "skewSpec", "locationSpec", "commentSpec", + "query", "insertInto", "partitionSpecLocation", "partitionSpec", "partitionVal", + "namespace", "describeFuncName", "describeColName", "ctes", "namedQuery", + "tableProvider", "createTableClauses", "tablePropertyList", "tableProperty", + "tablePropertyKey", "tablePropertyValue", "constantList", "nestedConstantList", + "createFileFormat", "fileFormat", "storageHandler", "resource", "dmlStatementNoWith", + "queryOrganization", "multiInsertQueryBody", "queryTerm", "queryPrimary", + "sortItem", "fromStatement", "fromStatementBody", "querySpecification", + "transformClause", "selectClause", "setClause", "matchedClause", "notMatchedClause", + "matchedAction", "notMatchedAction", "assignmentList", "assignment", + "whereClause", "havingClause", "hint", "hintStatement", "fromClause", + "aggregationClause", "groupByClause", "groupingAnalytics", "groupingElement", + "groupingSet", "pivotClause", "pivotColumn", "pivotValue", "lateralView", + "setQuantifier", "relation", "joinRelation", "joinType", "joinCriteria", + "sample", "sampleMethod", "identifierList", "identifierSeq", "orderedIdentifierList", + "orderedIdentifier", "identifierCommentList", "identifierComment", "relationPrimary", + "inlineTable", "functionTable", "tableAlias", "rowFormat", "multipartIdentifierList", + "multipartIdentifier", "tableIdentifier", "functionIdentifier", "namedExpression", + "namedExpressionSeq", "partitionFieldList", "partitionField", "transform", + "transformArgument", "expression", "expressionSeq", "booleanExpression", + "predicate", "valueExpression", "primaryExpression", "limitExpression", + "constant", "comparisonOperator", "arithmeticOperator", "predicateOperator", + "booleanValue", "interval", "errorCapturingMultiUnitsInterval", "multiUnitsInterval", + "errorCapturingUnitToUnitInterval", "unitToUnitInterval", "intervalValue", + "colPosition", "dataType", "qualifiedColTypeWithPositionList", "qualifiedColTypeWithPosition", + "colTypeList", "colType", "complexColTypeList", "complexColType", "whenClause", + "windowClause", "namedWindow", "windowSpec", "windowFrame", "frameBound", + "qualifiedNameList", "functionName", "qualifiedName", "errorCapturingIdentifier", + "errorCapturingIdentifierExtra", "identifier", "strictIdentifier", "quotedIdentifier", + "number", "alterColumnAction", "ansiNonReserved", "strictNonReserved", + "nonReserved" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'('", "')'", "'/*+'", "'*/'", "'->'", "'['", "']'", null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, "'<=>'", "'<>'", "'!='", "'<'", null, + "'>'", null, "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", "'&'", "'|'", + "'||'", "'^'", "'_'", "'!'", "'.'", "','", "':'", "';'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, null, null, null, null, null, null, null, "ADD", "AFTER", "ALL", + "ALTER", "ANALYZE", "AND", "ANTI", "ANY", "ARCHIVE", "ARRAY", "AS", "ASC", + "AT", "AUTHORIZATION", "BETWEEN", "BOTH", "BUCKET", "BUCKETS", "BY", + "CACHE", "CASCADE", "CASE", "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", + "CLUSTERED", "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", + "COMMENT", "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", "CONCATENATE", + "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", "CURRENT_DATE", + "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "DAY", "DATA", "DATABASE", + "DATABASES", "DBPROPERTIES", "DEFINED", "DELETE", "DELIMITED", "DESC", + "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", "DISTINCT", "DISTRIBUTE", + "DIV", "DROP", "ELSE", "END", "ESCAPE", "ESCAPED", "EXCEPT", "EXCHANGE", + "EXISTS", "EXPLAIN", "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", "FALSE", + "FETCH", "FIELDS", "FILTER", "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", + "FOREIGN", "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", "FUNCTIONS", + "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", "IF", "IGNORE", + "IMPORT", "IN", "INDEX", "INDEXES", "INNER", "INPATH", "INPUTFORMAT", + "INSERT", "INTERSECT", "INTERVAL", "INTO", "IS", "ITEMS", "JOIN", "KEYS", + "LAST", "LATERAL", "LAZY", "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", + "LIST", "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", "MACRO", + "MAP", "MATCHED", "MERGE", "MINUTE", "MONTH", "MSCK", "NAMESPACE", "NAMESPACES", + "NATURAL", "NO", "NOT", "NULL", "NULLS", "OF", "OFFSET", "ON", "ONLY", + "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", "OUTPUTFORMAT", "OVER", + "OVERLAPS", "OVERLAY", "OVERWRITE", "PARTITION", "PARTITIONED", "PARTITIONS", + "PERCENTLIT", "PIVOT", "PLACING", "POSITION", "PRECEDING", "PRIMARY", + "PRINCIPALS", "PROPERTIES", "PURGE", "QUERY", "RANGE", "RECORDREADER", + "RECORDWRITER", "RECOVER", "REDUCE", "REFERENCES", "REFRESH", "RENAME", + "REPAIR", "REPLACE", "RESET", "RESPECT", "RESTRICT", "REVOKE", "RIGHT", + "RLIKE", "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", "SECOND", + "SCHEMA", "SELECT", "SEMI", "SEPARATED", "SERDE", "SERDEPROPERTIES", + "SESSION_USER", "SET", "SETMINUS", "SETS", "SHOW", "SKEWED", "SOME", + "SORT", "SORTED", "START", "STATISTICS", "STORED", "STRATIFY", "STRUCT", + "SUBSTR", "SUBSTRING", "SYNC", "TABLE", "TABLES", "TABLESAMPLE", "TBLPROPERTIES", + "TEMPORARY", "TERMINATED", "THEN", "TIME", "TO", "TOUCH", "TRAILING", + "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", "TRUE", "TRUNCATE", + "TRY_CAST", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", "UNION", "UNIQUE", + "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", "USE", "USER", "USING", "VALUES", + "VIEW", "VIEWS", "WHEN", "WHERE", "WINDOW", "WITH", "YEAR", "ZONE", "EQ", + "NSEQ", "NEQ", "NEQJ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", "HAT", + "UNDERSCORE", "EXCLAMATION", "POINT", "COMMA", "COLON", "SEMICOLON", + "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", "TINYINT_LITERAL", "INTEGER_VALUE", + "EXPONENT_VALUE", "DECIMAL_VALUE", "FLOAT_LITERAL", "DOUBLE_LITERAL", + "BIGDECIMAL_LITERAL", "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", + "BRACKETED_COMMENT", "WS", "UNRECOGNIZED" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "SQL.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + + /** + * When false, INTERSECT is given the greater precedence over the other set + * operations (UNION, EXCEPT and MINUS) as per the SQL standard. + */ + public boolean legacy_setops_precedence_enabled = false; + + /** + * When false, a literal with an exponent would be converted into + * double type rather than decimal type. + */ + public boolean legacy_exponent_literal_as_decimal_enabled = false; + + /** + * When true, the behavior of keywords follows ANSI SQL standard. + */ + public boolean SQL_standard_keyword_behavior = false; + + public SQLParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + public static class SingleStatementContext extends ParserRuleContext { + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public TerminalNode EOF() { return getToken(SQLParser.EOF, 0); } + public List SEMICOLON() { return getTokens(SQLParser.SEMICOLON); } + public TerminalNode SEMICOLON(int i) { + return getToken(SQLParser.SEMICOLON, i); + } + public SingleStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSingleStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSingleStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSingleStatement(this); + else return visitor.visitChildren(this); + } + } + + public final SingleStatementContext singleStatement() throws RecognitionException { + SingleStatementContext _localctx = new SingleStatementContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_singleStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(288); + statement(); + setState(292); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==SEMICOLON) { + { + { + setState(289); + match(SEMICOLON); + } + } + setState(294); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(295); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SingleExpressionContext extends ParserRuleContext { + public NamedExpressionContext namedExpression() { + return getRuleContext(NamedExpressionContext.class,0); + } + public TerminalNode EOF() { return getToken(SQLParser.EOF, 0); } + public SingleExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSingleExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSingleExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSingleExpression(this); + else return visitor.visitChildren(this); + } + } + + public final SingleExpressionContext singleExpression() throws RecognitionException { + SingleExpressionContext _localctx = new SingleExpressionContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_singleExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(297); + namedExpression(); + setState(298); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SingleTableIdentifierContext extends ParserRuleContext { + public TableIdentifierContext tableIdentifier() { + return getRuleContext(TableIdentifierContext.class,0); + } + public TerminalNode EOF() { return getToken(SQLParser.EOF, 0); } + public SingleTableIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleTableIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSingleTableIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSingleTableIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSingleTableIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final SingleTableIdentifierContext singleTableIdentifier() throws RecognitionException { + SingleTableIdentifierContext _localctx = new SingleTableIdentifierContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_singleTableIdentifier); + try { + enterOuterAlt(_localctx, 1); + { + setState(300); + tableIdentifier(); + setState(301); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SingleMultipartIdentifierContext extends ParserRuleContext { + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode EOF() { return getToken(SQLParser.EOF, 0); } + public SingleMultipartIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleMultipartIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSingleMultipartIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSingleMultipartIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSingleMultipartIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final SingleMultipartIdentifierContext singleMultipartIdentifier() throws RecognitionException { + SingleMultipartIdentifierContext _localctx = new SingleMultipartIdentifierContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_singleMultipartIdentifier); + try { + enterOuterAlt(_localctx, 1); + { + setState(303); + multipartIdentifier(); + setState(304); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SingleFunctionIdentifierContext extends ParserRuleContext { + public FunctionIdentifierContext functionIdentifier() { + return getRuleContext(FunctionIdentifierContext.class,0); + } + public TerminalNode EOF() { return getToken(SQLParser.EOF, 0); } + public SingleFunctionIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleFunctionIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSingleFunctionIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSingleFunctionIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSingleFunctionIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final SingleFunctionIdentifierContext singleFunctionIdentifier() throws RecognitionException { + SingleFunctionIdentifierContext _localctx = new SingleFunctionIdentifierContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_singleFunctionIdentifier); + try { + enterOuterAlt(_localctx, 1); + { + setState(306); + functionIdentifier(); + setState(307); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SingleDataTypeContext extends ParserRuleContext { + public DataTypeContext dataType() { + return getRuleContext(DataTypeContext.class,0); + } + public TerminalNode EOF() { return getToken(SQLParser.EOF, 0); } + public SingleDataTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleDataType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSingleDataType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSingleDataType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSingleDataType(this); + else return visitor.visitChildren(this); + } + } + + public final SingleDataTypeContext singleDataType() throws RecognitionException { + SingleDataTypeContext _localctx = new SingleDataTypeContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_singleDataType); + try { + enterOuterAlt(_localctx, 1); + { + setState(309); + dataType(); + setState(310); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SingleTableSchemaContext extends ParserRuleContext { + public ColTypeListContext colTypeList() { + return getRuleContext(ColTypeListContext.class,0); + } + public TerminalNode EOF() { return getToken(SQLParser.EOF, 0); } + public SingleTableSchemaContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleTableSchema; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSingleTableSchema(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSingleTableSchema(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSingleTableSchema(this); + else return visitor.visitChildren(this); + } + } + + public final SingleTableSchemaContext singleTableSchema() throws RecognitionException { + SingleTableSchemaContext _localctx = new SingleTableSchemaContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_singleTableSchema); + try { + enterOuterAlt(_localctx, 1); + { + setState(312); + colTypeList(); + setState(313); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class StatementContext extends ParserRuleContext { + public StatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statement; } + + public StatementContext() { } + public void copyFrom(StatementContext ctx) { + super.copyFrom(ctx); + } + } + public static class ExplainContext extends StatementContext { + public TerminalNode EXPLAIN() { return getToken(SQLParser.EXPLAIN, 0); } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public TerminalNode LOGICAL() { return getToken(SQLParser.LOGICAL, 0); } + public TerminalNode FORMATTED() { return getToken(SQLParser.FORMATTED, 0); } + public TerminalNode EXTENDED() { return getToken(SQLParser.EXTENDED, 0); } + public TerminalNode CODEGEN() { return getToken(SQLParser.CODEGEN, 0); } + public TerminalNode COST() { return getToken(SQLParser.COST, 0); } + public ExplainContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterExplain(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitExplain(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitExplain(this); + else return visitor.visitChildren(this); + } + } + public static class ResetConfigurationContext extends StatementContext { + public TerminalNode RESET() { return getToken(SQLParser.RESET, 0); } + public ResetConfigurationContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterResetConfiguration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitResetConfiguration(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitResetConfiguration(this); + else return visitor.visitChildren(this); + } + } + public static class AlterViewQueryContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public AlterViewQueryContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAlterViewQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAlterViewQuery(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAlterViewQuery(this); + else return visitor.visitChildren(this); + } + } + public static class UseContext extends StatementContext { + public TerminalNode USE() { return getToken(SQLParser.USE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode NAMESPACE() { return getToken(SQLParser.NAMESPACE, 0); } + public UseContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterUse(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitUse(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitUse(this); + else return visitor.visitChildren(this); + } + } + public static class DropNamespaceContext extends StatementContext { + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public TerminalNode RESTRICT() { return getToken(SQLParser.RESTRICT, 0); } + public TerminalNode CASCADE() { return getToken(SQLParser.CASCADE, 0); } + public DropNamespaceContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDropNamespace(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDropNamespace(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDropNamespace(this); + else return visitor.visitChildren(this); + } + } + public static class CreateTempViewUsingContext extends StatementContext { + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode TEMPORARY() { return getToken(SQLParser.TEMPORARY, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public TableIdentifierContext tableIdentifier() { + return getRuleContext(TableIdentifierContext.class,0); + } + public TableProviderContext tableProvider() { + return getRuleContext(TableProviderContext.class,0); + } + public TerminalNode OR() { return getToken(SQLParser.OR, 0); } + public TerminalNode REPLACE() { return getToken(SQLParser.REPLACE, 0); } + public TerminalNode GLOBAL() { return getToken(SQLParser.GLOBAL, 0); } + public ColTypeListContext colTypeList() { + return getRuleContext(ColTypeListContext.class,0); + } + public TerminalNode OPTIONS() { return getToken(SQLParser.OPTIONS, 0); } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public CreateTempViewUsingContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateTempViewUsing(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateTempViewUsing(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateTempViewUsing(this); + else return visitor.visitChildren(this); + } + } + public static class RenameTableContext extends StatementContext { + public MultipartIdentifierContext from; + public MultipartIdentifierContext to; + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode RENAME() { return getToken(SQLParser.RENAME, 0); } + public TerminalNode TO() { return getToken(SQLParser.TO, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public List multipartIdentifier() { + return getRuleContexts(MultipartIdentifierContext.class); + } + public MultipartIdentifierContext multipartIdentifier(int i) { + return getRuleContext(MultipartIdentifierContext.class,i); + } + public RenameTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRenameTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRenameTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRenameTable(this); + else return visitor.visitChildren(this); + } + } + public static class FailNativeCommandContext extends StatementContext { + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode ROLE() { return getToken(SQLParser.ROLE, 0); } + public UnsupportedHiveNativeCommandsContext unsupportedHiveNativeCommands() { + return getRuleContext(UnsupportedHiveNativeCommandsContext.class,0); + } + public FailNativeCommandContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFailNativeCommand(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFailNativeCommand(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFailNativeCommand(this); + else return visitor.visitChildren(this); + } + } + public static class ClearCacheContext extends StatementContext { + public TerminalNode CLEAR() { return getToken(SQLParser.CLEAR, 0); } + public TerminalNode CACHE() { return getToken(SQLParser.CACHE, 0); } + public ClearCacheContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterClearCache(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitClearCache(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitClearCache(this); + else return visitor.visitChildren(this); + } + } + public static class DropViewContext extends StatementContext { + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public DropViewContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDropView(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDropView(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDropView(this); + else return visitor.visitChildren(this); + } + } + public static class ShowTablesContext extends StatementContext { + public Token pattern; + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode TABLES() { return getToken(SQLParser.TABLES, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public ShowTablesContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowTables(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowTables(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowTables(this); + else return visitor.visitChildren(this); + } + } + public static class RecoverPartitionsContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode RECOVER() { return getToken(SQLParser.RECOVER, 0); } + public TerminalNode PARTITIONS() { return getToken(SQLParser.PARTITIONS, 0); } + public RecoverPartitionsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRecoverPartitions(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRecoverPartitions(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRecoverPartitions(this); + else return visitor.visitChildren(this); + } + } + public static class ShowCurrentNamespaceContext extends StatementContext { + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode CURRENT() { return getToken(SQLParser.CURRENT, 0); } + public TerminalNode NAMESPACE() { return getToken(SQLParser.NAMESPACE, 0); } + public ShowCurrentNamespaceContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowCurrentNamespace(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowCurrentNamespace(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowCurrentNamespace(this); + else return visitor.visitChildren(this); + } + } + public static class RenameTablePartitionContext extends StatementContext { + public PartitionSpecContext from; + public PartitionSpecContext to; + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode RENAME() { return getToken(SQLParser.RENAME, 0); } + public TerminalNode TO() { return getToken(SQLParser.TO, 0); } + public List partitionSpec() { + return getRuleContexts(PartitionSpecContext.class); + } + public PartitionSpecContext partitionSpec(int i) { + return getRuleContext(PartitionSpecContext.class,i); + } + public RenameTablePartitionContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRenameTablePartition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRenameTablePartition(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRenameTablePartition(this); + else return visitor.visitChildren(this); + } + } + public static class RepairTableContext extends StatementContext { + public Token option; + public TerminalNode MSCK() { return getToken(SQLParser.MSCK, 0); } + public TerminalNode REPAIR() { return getToken(SQLParser.REPAIR, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode PARTITIONS() { return getToken(SQLParser.PARTITIONS, 0); } + public TerminalNode ADD() { return getToken(SQLParser.ADD, 0); } + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public TerminalNode SYNC() { return getToken(SQLParser.SYNC, 0); } + public RepairTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRepairTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRepairTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRepairTable(this); + else return visitor.visitChildren(this); + } + } + public static class RefreshResourceContext extends StatementContext { + public TerminalNode REFRESH() { return getToken(SQLParser.REFRESH, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public RefreshResourceContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRefreshResource(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRefreshResource(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRefreshResource(this); + else return visitor.visitChildren(this); + } + } + public static class ShowCreateTableContext extends StatementContext { + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public TerminalNode SERDE() { return getToken(SQLParser.SERDE, 0); } + public ShowCreateTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowCreateTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowCreateTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowCreateTable(this); + else return visitor.visitChildren(this); + } + } + public static class ShowNamespacesContext extends StatementContext { + public Token pattern; + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode DATABASES() { return getToken(SQLParser.DATABASES, 0); } + public TerminalNode NAMESPACES() { return getToken(SQLParser.NAMESPACES, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public ShowNamespacesContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowNamespaces(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowNamespaces(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowNamespaces(this); + else return visitor.visitChildren(this); + } + } + public static class ShowColumnsContext extends StatementContext { + public MultipartIdentifierContext table; + public MultipartIdentifierContext ns; + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode COLUMNS() { return getToken(SQLParser.COLUMNS, 0); } + public List FROM() { return getTokens(SQLParser.FROM); } + public TerminalNode FROM(int i) { + return getToken(SQLParser.FROM, i); + } + public List IN() { return getTokens(SQLParser.IN); } + public TerminalNode IN(int i) { + return getToken(SQLParser.IN, i); + } + public List multipartIdentifier() { + return getRuleContexts(MultipartIdentifierContext.class); + } + public MultipartIdentifierContext multipartIdentifier(int i) { + return getRuleContext(MultipartIdentifierContext.class,i); + } + public ShowColumnsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowColumns(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowColumns(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowColumns(this); + else return visitor.visitChildren(this); + } + } + public static class ReplaceTableContext extends StatementContext { + public ReplaceTableHeaderContext replaceTableHeader() { + return getRuleContext(ReplaceTableHeaderContext.class,0); + } + public CreateTableClausesContext createTableClauses() { + return getRuleContext(CreateTableClausesContext.class,0); + } + public ColTypeListContext colTypeList() { + return getRuleContext(ColTypeListContext.class,0); + } + public TableProviderContext tableProvider() { + return getRuleContext(TableProviderContext.class,0); + } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public ReplaceTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterReplaceTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitReplaceTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitReplaceTable(this); + else return visitor.visitChildren(this); + } + } + public static class AnalyzeTablesContext extends StatementContext { + public TerminalNode ANALYZE() { return getToken(SQLParser.ANALYZE, 0); } + public TerminalNode TABLES() { return getToken(SQLParser.TABLES, 0); } + public TerminalNode COMPUTE() { return getToken(SQLParser.COMPUTE, 0); } + public TerminalNode STATISTICS() { return getToken(SQLParser.STATISTICS, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public AnalyzeTablesContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAnalyzeTables(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAnalyzeTables(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAnalyzeTables(this); + else return visitor.visitChildren(this); + } + } + public static class AddTablePartitionContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode ADD() { return getToken(SQLParser.ADD, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public List partitionSpecLocation() { + return getRuleContexts(PartitionSpecLocationContext.class); + } + public PartitionSpecLocationContext partitionSpecLocation(int i) { + return getRuleContext(PartitionSpecLocationContext.class,i); + } + public AddTablePartitionContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAddTablePartition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAddTablePartition(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAddTablePartition(this); + else return visitor.visitChildren(this); + } + } + public static class SetNamespaceLocationContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public LocationSpecContext locationSpec() { + return getRuleContext(LocationSpecContext.class,0); + } + public SetNamespaceLocationContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetNamespaceLocation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetNamespaceLocation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetNamespaceLocation(this); + else return visitor.visitChildren(this); + } + } + public static class RefreshTableContext extends StatementContext { + public TerminalNode REFRESH() { return getToken(SQLParser.REFRESH, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public RefreshTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRefreshTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRefreshTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRefreshTable(this); + else return visitor.visitChildren(this); + } + } + public static class SetNamespacePropertiesContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public TerminalNode DBPROPERTIES() { return getToken(SQLParser.DBPROPERTIES, 0); } + public TerminalNode PROPERTIES() { return getToken(SQLParser.PROPERTIES, 0); } + public SetNamespacePropertiesContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetNamespaceProperties(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetNamespaceProperties(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetNamespaceProperties(this); + else return visitor.visitChildren(this); + } + } + public static class ManageResourceContext extends StatementContext { + public Token op; + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ADD() { return getToken(SQLParser.ADD, 0); } + public TerminalNode LIST() { return getToken(SQLParser.LIST, 0); } + public ManageResourceContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterManageResource(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitManageResource(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitManageResource(this); + else return visitor.visitChildren(this); + } + } + public static class SetQuotedConfigurationContext extends StatementContext { + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public ConfigKeyContext configKey() { + return getRuleContext(ConfigKeyContext.class,0); + } + public TerminalNode EQ() { return getToken(SQLParser.EQ, 0); } + public ConfigValueContext configValue() { + return getRuleContext(ConfigValueContext.class,0); + } + public SetQuotedConfigurationContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetQuotedConfiguration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetQuotedConfiguration(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetQuotedConfiguration(this); + else return visitor.visitChildren(this); + } + } + public static class AnalyzeContext extends StatementContext { + public TerminalNode ANALYZE() { return getToken(SQLParser.ANALYZE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode COMPUTE() { return getToken(SQLParser.COMPUTE, 0); } + public TerminalNode STATISTICS() { return getToken(SQLParser.STATISTICS, 0); } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode FOR() { return getToken(SQLParser.FOR, 0); } + public TerminalNode COLUMNS() { return getToken(SQLParser.COLUMNS, 0); } + public IdentifierSeqContext identifierSeq() { + return getRuleContext(IdentifierSeqContext.class,0); + } + public TerminalNode ALL() { return getToken(SQLParser.ALL, 0); } + public AnalyzeContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAnalyze(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAnalyze(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAnalyze(this); + else return visitor.visitChildren(this); + } + } + public static class CreateFunctionContext extends StatementContext { + public Token className; + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode FUNCTION() { return getToken(SQLParser.FUNCTION, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode OR() { return getToken(SQLParser.OR, 0); } + public TerminalNode REPLACE() { return getToken(SQLParser.REPLACE, 0); } + public TerminalNode TEMPORARY() { return getToken(SQLParser.TEMPORARY, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public TerminalNode USING() { return getToken(SQLParser.USING, 0); } + public List resource() { + return getRuleContexts(ResourceContext.class); + } + public ResourceContext resource(int i) { + return getRuleContext(ResourceContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public CreateFunctionContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateFunction(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateFunction(this); + else return visitor.visitChildren(this); + } + } + public static class HiveReplaceColumnsContext extends StatementContext { + public MultipartIdentifierContext table; + public QualifiedColTypeWithPositionListContext columns; + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode REPLACE() { return getToken(SQLParser.REPLACE, 0); } + public TerminalNode COLUMNS() { return getToken(SQLParser.COLUMNS, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public QualifiedColTypeWithPositionListContext qualifiedColTypeWithPositionList() { + return getRuleContext(QualifiedColTypeWithPositionListContext.class,0); + } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public HiveReplaceColumnsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterHiveReplaceColumns(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitHiveReplaceColumns(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitHiveReplaceColumns(this); + else return visitor.visitChildren(this); + } + } + public static class CommentNamespaceContext extends StatementContext { + public Token comment; + public TerminalNode COMMENT() { return getToken(SQLParser.COMMENT, 0); } + public TerminalNode ON() { return getToken(SQLParser.ON, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode IS() { return getToken(SQLParser.IS, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public CommentNamespaceContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCommentNamespace(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCommentNamespace(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCommentNamespace(this); + else return visitor.visitChildren(this); + } + } + public static class ResetQuotedConfigurationContext extends StatementContext { + public TerminalNode RESET() { return getToken(SQLParser.RESET, 0); } + public ConfigKeyContext configKey() { + return getRuleContext(ConfigKeyContext.class,0); + } + public ResetQuotedConfigurationContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterResetQuotedConfiguration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitResetQuotedConfiguration(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitResetQuotedConfiguration(this); + else return visitor.visitChildren(this); + } + } + public static class CreateTableContext extends StatementContext { + public CreateTableHeaderContext createTableHeader() { + return getRuleContext(CreateTableHeaderContext.class,0); + } + public CreateTableClausesContext createTableClauses() { + return getRuleContext(CreateTableClausesContext.class,0); + } + public ColTypeListContext colTypeList() { + return getRuleContext(ColTypeListContext.class,0); + } + public TableProviderContext tableProvider() { + return getRuleContext(TableProviderContext.class,0); + } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public CreateTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateTable(this); + else return visitor.visitChildren(this); + } + } + public static class DmlStatementContext extends StatementContext { + public DmlStatementNoWithContext dmlStatementNoWith() { + return getRuleContext(DmlStatementNoWithContext.class,0); + } + public CtesContext ctes() { + return getRuleContext(CtesContext.class,0); + } + public DmlStatementContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDmlStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDmlStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDmlStatement(this); + else return visitor.visitChildren(this); + } + } + public static class CreateTableLikeContext extends StatementContext { + public TableIdentifierContext target; + public TableIdentifierContext source; + public TablePropertyListContext tableProps; + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public List tableIdentifier() { + return getRuleContexts(TableIdentifierContext.class); + } + public TableIdentifierContext tableIdentifier(int i) { + return getRuleContext(TableIdentifierContext.class,i); + } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public List tableProvider() { + return getRuleContexts(TableProviderContext.class); + } + public TableProviderContext tableProvider(int i) { + return getRuleContext(TableProviderContext.class,i); + } + public List rowFormat() { + return getRuleContexts(RowFormatContext.class); + } + public RowFormatContext rowFormat(int i) { + return getRuleContext(RowFormatContext.class,i); + } + public List createFileFormat() { + return getRuleContexts(CreateFileFormatContext.class); + } + public CreateFileFormatContext createFileFormat(int i) { + return getRuleContext(CreateFileFormatContext.class,i); + } + public List locationSpec() { + return getRuleContexts(LocationSpecContext.class); + } + public LocationSpecContext locationSpec(int i) { + return getRuleContext(LocationSpecContext.class,i); + } + public List TBLPROPERTIES() { return getTokens(SQLParser.TBLPROPERTIES); } + public TerminalNode TBLPROPERTIES(int i) { + return getToken(SQLParser.TBLPROPERTIES, i); + } + public List tablePropertyList() { + return getRuleContexts(TablePropertyListContext.class); + } + public TablePropertyListContext tablePropertyList(int i) { + return getRuleContext(TablePropertyListContext.class,i); + } + public CreateTableLikeContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateTableLike(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateTableLike(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateTableLike(this); + else return visitor.visitChildren(this); + } + } + public static class UncacheTableContext extends StatementContext { + public TerminalNode UNCACHE() { return getToken(SQLParser.UNCACHE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public UncacheTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterUncacheTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitUncacheTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitUncacheTable(this); + else return visitor.visitChildren(this); + } + } + public static class DropFunctionContext extends StatementContext { + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public TerminalNode FUNCTION() { return getToken(SQLParser.FUNCTION, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode TEMPORARY() { return getToken(SQLParser.TEMPORARY, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public DropFunctionContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDropFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDropFunction(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDropFunction(this); + else return visitor.visitChildren(this); + } + } + public static class DescribeRelationContext extends StatementContext { + public Token option; + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode DESC() { return getToken(SQLParser.DESC, 0); } + public TerminalNode DESCRIBE() { return getToken(SQLParser.DESCRIBE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public DescribeColNameContext describeColName() { + return getRuleContext(DescribeColNameContext.class,0); + } + public TerminalNode EXTENDED() { return getToken(SQLParser.EXTENDED, 0); } + public TerminalNode FORMATTED() { return getToken(SQLParser.FORMATTED, 0); } + public DescribeRelationContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDescribeRelation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDescribeRelation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDescribeRelation(this); + else return visitor.visitChildren(this); + } + } + public static class LoadDataContext extends StatementContext { + public Token path; + public TerminalNode LOAD() { return getToken(SQLParser.LOAD, 0); } + public TerminalNode DATA() { return getToken(SQLParser.DATA, 0); } + public TerminalNode INPATH() { return getToken(SQLParser.INPATH, 0); } + public TerminalNode INTO() { return getToken(SQLParser.INTO, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode LOCAL() { return getToken(SQLParser.LOCAL, 0); } + public TerminalNode OVERWRITE() { return getToken(SQLParser.OVERWRITE, 0); } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public LoadDataContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLoadData(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLoadData(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLoadData(this); + else return visitor.visitChildren(this); + } + } + public static class ShowPartitionsContext extends StatementContext { + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode PARTITIONS() { return getToken(SQLParser.PARTITIONS, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public ShowPartitionsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowPartitions(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowPartitions(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowPartitions(this); + else return visitor.visitChildren(this); + } + } + public static class DescribeFunctionContext extends StatementContext { + public TerminalNode FUNCTION() { return getToken(SQLParser.FUNCTION, 0); } + public DescribeFuncNameContext describeFuncName() { + return getRuleContext(DescribeFuncNameContext.class,0); + } + public TerminalNode DESC() { return getToken(SQLParser.DESC, 0); } + public TerminalNode DESCRIBE() { return getToken(SQLParser.DESCRIBE, 0); } + public TerminalNode EXTENDED() { return getToken(SQLParser.EXTENDED, 0); } + public DescribeFunctionContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDescribeFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDescribeFunction(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDescribeFunction(this); + else return visitor.visitChildren(this); + } + } + public static class RenameTableColumnContext extends StatementContext { + public MultipartIdentifierContext table; + public MultipartIdentifierContext from; + public ErrorCapturingIdentifierContext to; + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode RENAME() { return getToken(SQLParser.RENAME, 0); } + public TerminalNode COLUMN() { return getToken(SQLParser.COLUMN, 0); } + public TerminalNode TO() { return getToken(SQLParser.TO, 0); } + public List multipartIdentifier() { + return getRuleContexts(MultipartIdentifierContext.class); + } + public MultipartIdentifierContext multipartIdentifier(int i) { + return getRuleContext(MultipartIdentifierContext.class,i); + } + public ErrorCapturingIdentifierContext errorCapturingIdentifier() { + return getRuleContext(ErrorCapturingIdentifierContext.class,0); + } + public RenameTableColumnContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRenameTableColumn(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRenameTableColumn(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRenameTableColumn(this); + else return visitor.visitChildren(this); + } + } + public static class StatementDefaultContext extends StatementContext { + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public StatementDefaultContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterStatementDefault(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitStatementDefault(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitStatementDefault(this); + else return visitor.visitChildren(this); + } + } + public static class HiveChangeColumnContext extends StatementContext { + public MultipartIdentifierContext table; + public MultipartIdentifierContext colName; + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode CHANGE() { return getToken(SQLParser.CHANGE, 0); } + public ColTypeContext colType() { + return getRuleContext(ColTypeContext.class,0); + } + public List multipartIdentifier() { + return getRuleContexts(MultipartIdentifierContext.class); + } + public MultipartIdentifierContext multipartIdentifier(int i) { + return getRuleContext(MultipartIdentifierContext.class,i); + } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public TerminalNode COLUMN() { return getToken(SQLParser.COLUMN, 0); } + public ColPositionContext colPosition() { + return getRuleContext(ColPositionContext.class,0); + } + public HiveChangeColumnContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterHiveChangeColumn(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitHiveChangeColumn(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitHiveChangeColumn(this); + else return visitor.visitChildren(this); + } + } + public static class SetTimeZoneContext extends StatementContext { + public Token timezone; + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode TIME() { return getToken(SQLParser.TIME, 0); } + public TerminalNode ZONE() { return getToken(SQLParser.ZONE, 0); } + public IntervalContext interval() { + return getRuleContext(IntervalContext.class,0); + } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode LOCAL() { return getToken(SQLParser.LOCAL, 0); } + public SetTimeZoneContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetTimeZone(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetTimeZone(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetTimeZone(this); + else return visitor.visitChildren(this); + } + } + public static class DescribeQueryContext extends StatementContext { + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode DESC() { return getToken(SQLParser.DESC, 0); } + public TerminalNode DESCRIBE() { return getToken(SQLParser.DESCRIBE, 0); } + public TerminalNode QUERY() { return getToken(SQLParser.QUERY, 0); } + public DescribeQueryContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDescribeQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDescribeQuery(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDescribeQuery(this); + else return visitor.visitChildren(this); + } + } + public static class TruncateTableContext extends StatementContext { + public TerminalNode TRUNCATE() { return getToken(SQLParser.TRUNCATE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public TruncateTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTruncateTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTruncateTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTruncateTable(this); + else return visitor.visitChildren(this); + } + } + public static class SetTableSerDeContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode SERDE() { return getToken(SQLParser.SERDE, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public TerminalNode WITH() { return getToken(SQLParser.WITH, 0); } + public TerminalNode SERDEPROPERTIES() { return getToken(SQLParser.SERDEPROPERTIES, 0); } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public SetTableSerDeContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetTableSerDe(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetTableSerDe(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetTableSerDe(this); + else return visitor.visitChildren(this); + } + } + public static class CreateViewContext extends StatementContext { + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode OR() { return getToken(SQLParser.OR, 0); } + public TerminalNode REPLACE() { return getToken(SQLParser.REPLACE, 0); } + public TerminalNode TEMPORARY() { return getToken(SQLParser.TEMPORARY, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public IdentifierCommentListContext identifierCommentList() { + return getRuleContext(IdentifierCommentListContext.class,0); + } + public List commentSpec() { + return getRuleContexts(CommentSpecContext.class); + } + public CommentSpecContext commentSpec(int i) { + return getRuleContext(CommentSpecContext.class,i); + } + public List PARTITIONED() { return getTokens(SQLParser.PARTITIONED); } + public TerminalNode PARTITIONED(int i) { + return getToken(SQLParser.PARTITIONED, i); + } + public List ON() { return getTokens(SQLParser.ON); } + public TerminalNode ON(int i) { + return getToken(SQLParser.ON, i); + } + public List identifierList() { + return getRuleContexts(IdentifierListContext.class); + } + public IdentifierListContext identifierList(int i) { + return getRuleContext(IdentifierListContext.class,i); + } + public List TBLPROPERTIES() { return getTokens(SQLParser.TBLPROPERTIES); } + public TerminalNode TBLPROPERTIES(int i) { + return getToken(SQLParser.TBLPROPERTIES, i); + } + public List tablePropertyList() { + return getRuleContexts(TablePropertyListContext.class); + } + public TablePropertyListContext tablePropertyList(int i) { + return getRuleContext(TablePropertyListContext.class,i); + } + public TerminalNode GLOBAL() { return getToken(SQLParser.GLOBAL, 0); } + public CreateViewContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateView(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateView(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateView(this); + else return visitor.visitChildren(this); + } + } + public static class DropTablePartitionsContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public List partitionSpec() { + return getRuleContexts(PartitionSpecContext.class); + } + public PartitionSpecContext partitionSpec(int i) { + return getRuleContext(PartitionSpecContext.class,i); + } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public TerminalNode PURGE() { return getToken(SQLParser.PURGE, 0); } + public DropTablePartitionsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDropTablePartitions(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDropTablePartitions(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDropTablePartitions(this); + else return visitor.visitChildren(this); + } + } + public static class SetConfigurationContext extends StatementContext { + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public SetConfigurationContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetConfiguration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetConfiguration(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetConfiguration(this); + else return visitor.visitChildren(this); + } + } + public static class DropTableContext extends StatementContext { + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public TerminalNode PURGE() { return getToken(SQLParser.PURGE, 0); } + public DropTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDropTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDropTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDropTable(this); + else return visitor.visitChildren(this); + } + } + public static class ShowTableExtendedContext extends StatementContext { + public MultipartIdentifierContext ns; + public Token pattern; + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode EXTENDED() { return getToken(SQLParser.EXTENDED, 0); } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public ShowTableExtendedContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowTableExtended(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowTableExtended(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowTableExtended(this); + else return visitor.visitChildren(this); + } + } + public static class DescribeNamespaceContext extends StatementContext { + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode DESC() { return getToken(SQLParser.DESC, 0); } + public TerminalNode DESCRIBE() { return getToken(SQLParser.DESCRIBE, 0); } + public TerminalNode EXTENDED() { return getToken(SQLParser.EXTENDED, 0); } + public DescribeNamespaceContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDescribeNamespace(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDescribeNamespace(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDescribeNamespace(this); + else return visitor.visitChildren(this); + } + } + public static class AlterTableAlterColumnContext extends StatementContext { + public MultipartIdentifierContext table; + public MultipartIdentifierContext column; + public List ALTER() { return getTokens(SQLParser.ALTER); } + public TerminalNode ALTER(int i) { + return getToken(SQLParser.ALTER, i); + } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public List multipartIdentifier() { + return getRuleContexts(MultipartIdentifierContext.class); + } + public MultipartIdentifierContext multipartIdentifier(int i) { + return getRuleContext(MultipartIdentifierContext.class,i); + } + public TerminalNode CHANGE() { return getToken(SQLParser.CHANGE, 0); } + public TerminalNode COLUMN() { return getToken(SQLParser.COLUMN, 0); } + public AlterColumnActionContext alterColumnAction() { + return getRuleContext(AlterColumnActionContext.class,0); + } + public AlterTableAlterColumnContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAlterTableAlterColumn(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAlterTableAlterColumn(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAlterTableAlterColumn(this); + else return visitor.visitChildren(this); + } + } + public static class RefreshFunctionContext extends StatementContext { + public TerminalNode REFRESH() { return getToken(SQLParser.REFRESH, 0); } + public TerminalNode FUNCTION() { return getToken(SQLParser.FUNCTION, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public RefreshFunctionContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRefreshFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRefreshFunction(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRefreshFunction(this); + else return visitor.visitChildren(this); + } + } + public static class CommentTableContext extends StatementContext { + public Token comment; + public TerminalNode COMMENT() { return getToken(SQLParser.COMMENT, 0); } + public TerminalNode ON() { return getToken(SQLParser.ON, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode IS() { return getToken(SQLParser.IS, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public CommentTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCommentTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCommentTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCommentTable(this); + else return visitor.visitChildren(this); + } + } + public static class CreateNamespaceContext extends StatementContext { + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public NamespaceContext namespace() { + return getRuleContext(NamespaceContext.class,0); + } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public List commentSpec() { + return getRuleContexts(CommentSpecContext.class); + } + public CommentSpecContext commentSpec(int i) { + return getRuleContext(CommentSpecContext.class,i); + } + public List locationSpec() { + return getRuleContexts(LocationSpecContext.class); + } + public LocationSpecContext locationSpec(int i) { + return getRuleContext(LocationSpecContext.class,i); + } + public List WITH() { return getTokens(SQLParser.WITH); } + public TerminalNode WITH(int i) { + return getToken(SQLParser.WITH, i); + } + public List tablePropertyList() { + return getRuleContexts(TablePropertyListContext.class); + } + public TablePropertyListContext tablePropertyList(int i) { + return getRuleContext(TablePropertyListContext.class,i); + } + public List DBPROPERTIES() { return getTokens(SQLParser.DBPROPERTIES); } + public TerminalNode DBPROPERTIES(int i) { + return getToken(SQLParser.DBPROPERTIES, i); + } + public List PROPERTIES() { return getTokens(SQLParser.PROPERTIES); } + public TerminalNode PROPERTIES(int i) { + return getToken(SQLParser.PROPERTIES, i); + } + public CreateNamespaceContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateNamespace(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateNamespace(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateNamespace(this); + else return visitor.visitChildren(this); + } + } + public static class ShowTblPropertiesContext extends StatementContext { + public MultipartIdentifierContext table; + public TablePropertyKeyContext key; + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode TBLPROPERTIES() { return getToken(SQLParser.TBLPROPERTIES, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TablePropertyKeyContext tablePropertyKey() { + return getRuleContext(TablePropertyKeyContext.class,0); + } + public ShowTblPropertiesContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowTblProperties(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowTblProperties(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowTblProperties(this); + else return visitor.visitChildren(this); + } + } + public static class UnsetTablePropertiesContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode UNSET() { return getToken(SQLParser.UNSET, 0); } + public TerminalNode TBLPROPERTIES() { return getToken(SQLParser.TBLPROPERTIES, 0); } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public UnsetTablePropertiesContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterUnsetTableProperties(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitUnsetTableProperties(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitUnsetTableProperties(this); + else return visitor.visitChildren(this); + } + } + public static class SetTableLocationContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public LocationSpecContext locationSpec() { + return getRuleContext(LocationSpecContext.class,0); + } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public SetTableLocationContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetTableLocation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetTableLocation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetTableLocation(this); + else return visitor.visitChildren(this); + } + } + public static class DropTableColumnsContext extends StatementContext { + public MultipartIdentifierListContext columns; + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public TerminalNode COLUMN() { return getToken(SQLParser.COLUMN, 0); } + public TerminalNode COLUMNS() { return getToken(SQLParser.COLUMNS, 0); } + public MultipartIdentifierListContext multipartIdentifierList() { + return getRuleContext(MultipartIdentifierListContext.class,0); + } + public DropTableColumnsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDropTableColumns(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDropTableColumns(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDropTableColumns(this); + else return visitor.visitChildren(this); + } + } + public static class ShowViewsContext extends StatementContext { + public Token pattern; + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode VIEWS() { return getToken(SQLParser.VIEWS, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public ShowViewsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowViews(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowViews(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowViews(this); + else return visitor.visitChildren(this); + } + } + public static class ShowFunctionsContext extends StatementContext { + public Token pattern; + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode FUNCTIONS() { return getToken(SQLParser.FUNCTIONS, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public ShowFunctionsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterShowFunctions(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitShowFunctions(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitShowFunctions(this); + else return visitor.visitChildren(this); + } + } + public static class CacheTableContext extends StatementContext { + public TablePropertyListContext options; + public TerminalNode CACHE() { return getToken(SQLParser.CACHE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode LAZY() { return getToken(SQLParser.LAZY, 0); } + public TerminalNode OPTIONS() { return getToken(SQLParser.OPTIONS, 0); } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public CacheTableContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCacheTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCacheTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCacheTable(this); + else return visitor.visitChildren(this); + } + } + public static class AddTableColumnsContext extends StatementContext { + public QualifiedColTypeWithPositionListContext columns; + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode ADD() { return getToken(SQLParser.ADD, 0); } + public TerminalNode COLUMN() { return getToken(SQLParser.COLUMN, 0); } + public TerminalNode COLUMNS() { return getToken(SQLParser.COLUMNS, 0); } + public QualifiedColTypeWithPositionListContext qualifiedColTypeWithPositionList() { + return getRuleContext(QualifiedColTypeWithPositionListContext.class,0); + } + public AddTableColumnsContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAddTableColumns(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAddTableColumns(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAddTableColumns(this); + else return visitor.visitChildren(this); + } + } + public static class SetTablePropertiesContext extends StatementContext { + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode TBLPROPERTIES() { return getToken(SQLParser.TBLPROPERTIES, 0); } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public SetTablePropertiesContext(StatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetTableProperties(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetTableProperties(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetTableProperties(this); + else return visitor.visitChildren(this); + } + } + + public final StatementContext statement() throws RecognitionException { + StatementContext _localctx = new StatementContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_statement); + int _la; + try { + int _alt; + setState(1052); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { + case 1: + _localctx = new StatementDefaultContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(315); + query(); + } + break; + case 2: + _localctx = new DmlStatementContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(317); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WITH) { + { + setState(316); + ctes(); + } + } + + setState(319); + dmlStatementNoWith(); + } + break; + case 3: + _localctx = new UseContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(320); + match(USE); + setState(322); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { + case 1: + { + setState(321); + match(NAMESPACE); + } + break; + } + setState(324); + multipartIdentifier(); + } + break; + case 4: + _localctx = new CreateNamespaceContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(325); + match(CREATE); + setState(326); + namespace(); + setState(330); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { + case 1: + { + setState(327); + match(IF); + setState(328); + match(NOT); + setState(329); + match(EXISTS); + } + break; + } + setState(332); + multipartIdentifier(); + setState(340); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMENT || _la==LOCATION || _la==WITH) { + { + setState(338); + _errHandler.sync(this); + switch (_input.LA(1)) { + case COMMENT: + { + setState(333); + commentSpec(); + } + break; + case LOCATION: + { + setState(334); + locationSpec(); + } + break; + case WITH: + { + { + setState(335); + match(WITH); + setState(336); + _la = _input.LA(1); + if ( !(_la==DBPROPERTIES || _la==PROPERTIES) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(337); + tablePropertyList(); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + setState(342); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + case 5: + _localctx = new SetNamespacePropertiesContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(343); + match(ALTER); + setState(344); + namespace(); + setState(345); + multipartIdentifier(); + setState(346); + match(SET); + setState(347); + _la = _input.LA(1); + if ( !(_la==DBPROPERTIES || _la==PROPERTIES) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(348); + tablePropertyList(); + } + break; + case 6: + _localctx = new SetNamespaceLocationContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(350); + match(ALTER); + setState(351); + namespace(); + setState(352); + multipartIdentifier(); + setState(353); + match(SET); + setState(354); + locationSpec(); + } + break; + case 7: + _localctx = new DropNamespaceContext(_localctx); + enterOuterAlt(_localctx, 7); + { + setState(356); + match(DROP); + setState(357); + namespace(); + setState(360); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + case 1: + { + setState(358); + match(IF); + setState(359); + match(EXISTS); + } + break; + } + setState(362); + multipartIdentifier(); + setState(364); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==CASCADE || _la==RESTRICT) { + { + setState(363); + _la = _input.LA(1); + if ( !(_la==CASCADE || _la==RESTRICT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + } + break; + case 8: + _localctx = new ShowNamespacesContext(_localctx); + enterOuterAlt(_localctx, 8); + { + setState(366); + match(SHOW); + setState(367); + _la = _input.LA(1); + if ( !(_la==DATABASES || _la==NAMESPACES) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(370); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FROM || _la==IN) { + { + setState(368); + _la = _input.LA(1); + if ( !(_la==FROM || _la==IN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(369); + multipartIdentifier(); + } + } + + setState(376); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LIKE || _la==STRING) { + { + setState(373); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LIKE) { + { + setState(372); + match(LIKE); + } + } + + setState(375); + ((ShowNamespacesContext)_localctx).pattern = match(STRING); + } + } + + } + break; + case 9: + _localctx = new CreateTableContext(_localctx); + enterOuterAlt(_localctx, 9); + { + setState(378); + createTableHeader(); + setState(383); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + case 1: + { + setState(379); + match(T__0); + setState(380); + colTypeList(); + setState(381); + match(T__1); + } + break; + } + setState(386); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==USING) { + { + setState(385); + tableProvider(); + } + } + + setState(388); + createTableClauses(); + setState(393); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__0 || _la==AS || _la==FROM || _la==MAP || ((((_la - 185)) & ~0x3f) == 0 && ((1L << (_la - 185)) & ((1L << (REDUCE - 185)) | (1L << (SELECT - 185)) | (1L << (TABLE - 185)))) != 0) || _la==VALUES || _la==WITH) { + { + setState(390); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(389); + match(AS); + } + } + + setState(392); + query(); + } + } + + } + break; + case 10: + _localctx = new CreateTableLikeContext(_localctx); + enterOuterAlt(_localctx, 10); + { + setState(395); + match(CREATE); + setState(396); + match(TABLE); + setState(400); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { + case 1: + { + setState(397); + match(IF); + setState(398); + match(NOT); + setState(399); + match(EXISTS); + } + break; + } + setState(402); + ((CreateTableLikeContext)_localctx).target = tableIdentifier(); + setState(403); + match(LIKE); + setState(404); + ((CreateTableLikeContext)_localctx).source = tableIdentifier(); + setState(413); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==LOCATION || ((((_la - 201)) & ~0x3f) == 0 && ((1L << (_la - 201)) & ((1L << (ROW - 201)) | (1L << (STORED - 201)) | (1L << (TBLPROPERTIES - 201)) | (1L << (USING - 201)))) != 0)) { + { + setState(411); + _errHandler.sync(this); + switch (_input.LA(1)) { + case USING: + { + setState(405); + tableProvider(); + } + break; + case ROW: + { + setState(406); + rowFormat(); + } + break; + case STORED: + { + setState(407); + createFileFormat(); + } + break; + case LOCATION: + { + setState(408); + locationSpec(); + } + break; + case TBLPROPERTIES: + { + { + setState(409); + match(TBLPROPERTIES); + setState(410); + ((CreateTableLikeContext)_localctx).tableProps = tablePropertyList(); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + setState(415); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + case 11: + _localctx = new ReplaceTableContext(_localctx); + enterOuterAlt(_localctx, 11); + { + setState(416); + replaceTableHeader(); + setState(421); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { + case 1: + { + setState(417); + match(T__0); + setState(418); + colTypeList(); + setState(419); + match(T__1); + } + break; + } + setState(424); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==USING) { + { + setState(423); + tableProvider(); + } + } + + setState(426); + createTableClauses(); + setState(431); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__0 || _la==AS || _la==FROM || _la==MAP || ((((_la - 185)) & ~0x3f) == 0 && ((1L << (_la - 185)) & ((1L << (REDUCE - 185)) | (1L << (SELECT - 185)) | (1L << (TABLE - 185)))) != 0) || _la==VALUES || _la==WITH) { + { + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(427); + match(AS); + } + } + + setState(430); + query(); + } + } + + } + break; + case 12: + _localctx = new AnalyzeContext(_localctx); + enterOuterAlt(_localctx, 12); + { + setState(433); + match(ANALYZE); + setState(434); + match(TABLE); + setState(435); + multipartIdentifier(); + setState(437); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(436); + partitionSpec(); + } + } + + setState(439); + match(COMPUTE); + setState(440); + match(STATISTICS); + setState(448); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + case 1: + { + setState(441); + identifier(); + } + break; + case 2: + { + setState(442); + match(FOR); + setState(443); + match(COLUMNS); + setState(444); + identifierSeq(); + } + break; + case 3: + { + setState(445); + match(FOR); + setState(446); + match(ALL); + setState(447); + match(COLUMNS); + } + break; + } + } + break; + case 13: + _localctx = new AnalyzeTablesContext(_localctx); + enterOuterAlt(_localctx, 13); + { + setState(450); + match(ANALYZE); + setState(451); + match(TABLES); + setState(454); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FROM || _la==IN) { + { + setState(452); + _la = _input.LA(1); + if ( !(_la==FROM || _la==IN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(453); + multipartIdentifier(); + } + } + + setState(456); + match(COMPUTE); + setState(457); + match(STATISTICS); + setState(459); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { + case 1: + { + setState(458); + identifier(); + } + break; + } + } + break; + case 14: + _localctx = new AddTableColumnsContext(_localctx); + enterOuterAlt(_localctx, 14); + { + setState(461); + match(ALTER); + setState(462); + match(TABLE); + setState(463); + multipartIdentifier(); + setState(464); + match(ADD); + setState(465); + _la = _input.LA(1); + if ( !(_la==COLUMN || _la==COLUMNS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(466); + ((AddTableColumnsContext)_localctx).columns = qualifiedColTypeWithPositionList(); + } + break; + case 15: + _localctx = new AddTableColumnsContext(_localctx); + enterOuterAlt(_localctx, 15); + { + setState(468); + match(ALTER); + setState(469); + match(TABLE); + setState(470); + multipartIdentifier(); + setState(471); + match(ADD); + setState(472); + _la = _input.LA(1); + if ( !(_la==COLUMN || _la==COLUMNS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(473); + match(T__0); + setState(474); + ((AddTableColumnsContext)_localctx).columns = qualifiedColTypeWithPositionList(); + setState(475); + match(T__1); + } + break; + case 16: + _localctx = new RenameTableColumnContext(_localctx); + enterOuterAlt(_localctx, 16); + { + setState(477); + match(ALTER); + setState(478); + match(TABLE); + setState(479); + ((RenameTableColumnContext)_localctx).table = multipartIdentifier(); + setState(480); + match(RENAME); + setState(481); + match(COLUMN); + setState(482); + ((RenameTableColumnContext)_localctx).from = multipartIdentifier(); + setState(483); + match(TO); + setState(484); + ((RenameTableColumnContext)_localctx).to = errorCapturingIdentifier(); + } + break; + case 17: + _localctx = new DropTableColumnsContext(_localctx); + enterOuterAlt(_localctx, 17); + { + setState(486); + match(ALTER); + setState(487); + match(TABLE); + setState(488); + multipartIdentifier(); + setState(489); + match(DROP); + setState(490); + _la = _input.LA(1); + if ( !(_la==COLUMN || _la==COLUMNS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(491); + match(T__0); + setState(492); + ((DropTableColumnsContext)_localctx).columns = multipartIdentifierList(); + setState(493); + match(T__1); + } + break; + case 18: + _localctx = new DropTableColumnsContext(_localctx); + enterOuterAlt(_localctx, 18); + { + setState(495); + match(ALTER); + setState(496); + match(TABLE); + setState(497); + multipartIdentifier(); + setState(498); + match(DROP); + setState(499); + _la = _input.LA(1); + if ( !(_la==COLUMN || _la==COLUMNS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(500); + ((DropTableColumnsContext)_localctx).columns = multipartIdentifierList(); + } + break; + case 19: + _localctx = new RenameTableContext(_localctx); + enterOuterAlt(_localctx, 19); + { + setState(502); + match(ALTER); + setState(503); + _la = _input.LA(1); + if ( !(_la==TABLE || _la==VIEW) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(504); + ((RenameTableContext)_localctx).from = multipartIdentifier(); + setState(505); + match(RENAME); + setState(506); + match(TO); + setState(507); + ((RenameTableContext)_localctx).to = multipartIdentifier(); + } + break; + case 20: + _localctx = new SetTablePropertiesContext(_localctx); + enterOuterAlt(_localctx, 20); + { + setState(509); + match(ALTER); + setState(510); + _la = _input.LA(1); + if ( !(_la==TABLE || _la==VIEW) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(511); + multipartIdentifier(); + setState(512); + match(SET); + setState(513); + match(TBLPROPERTIES); + setState(514); + tablePropertyList(); + } + break; + case 21: + _localctx = new UnsetTablePropertiesContext(_localctx); + enterOuterAlt(_localctx, 21); + { + setState(516); + match(ALTER); + setState(517); + _la = _input.LA(1); + if ( !(_la==TABLE || _la==VIEW) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(518); + multipartIdentifier(); + setState(519); + match(UNSET); + setState(520); + match(TBLPROPERTIES); + setState(523); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IF) { + { + setState(521); + match(IF); + setState(522); + match(EXISTS); + } + } + + setState(525); + tablePropertyList(); + } + break; + case 22: + _localctx = new AlterTableAlterColumnContext(_localctx); + enterOuterAlt(_localctx, 22); + { + setState(527); + match(ALTER); + setState(528); + match(TABLE); + setState(529); + ((AlterTableAlterColumnContext)_localctx).table = multipartIdentifier(); + setState(530); + _la = _input.LA(1); + if ( !(_la==ALTER || _la==CHANGE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(532); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { + case 1: + { + setState(531); + match(COLUMN); + } + break; + } + setState(534); + ((AlterTableAlterColumnContext)_localctx).column = multipartIdentifier(); + setState(536); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AFTER || _la==COMMENT || _la==DROP || _la==FIRST || _la==SET || _la==TYPE) { + { + setState(535); + alterColumnAction(); + } + } + + } + break; + case 23: + _localctx = new HiveChangeColumnContext(_localctx); + enterOuterAlt(_localctx, 23); + { + setState(538); + match(ALTER); + setState(539); + match(TABLE); + setState(540); + ((HiveChangeColumnContext)_localctx).table = multipartIdentifier(); + setState(542); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(541); + partitionSpec(); + } + } + + setState(544); + match(CHANGE); + setState(546); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { + case 1: + { + setState(545); + match(COLUMN); + } + break; + } + setState(548); + ((HiveChangeColumnContext)_localctx).colName = multipartIdentifier(); + setState(549); + colType(); + setState(551); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AFTER || _la==FIRST) { + { + setState(550); + colPosition(); + } + } + + } + break; + case 24: + _localctx = new HiveReplaceColumnsContext(_localctx); + enterOuterAlt(_localctx, 24); + { + setState(553); + match(ALTER); + setState(554); + match(TABLE); + setState(555); + ((HiveReplaceColumnsContext)_localctx).table = multipartIdentifier(); + setState(557); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(556); + partitionSpec(); + } + } + + setState(559); + match(REPLACE); + setState(560); + match(COLUMNS); + setState(561); + match(T__0); + setState(562); + ((HiveReplaceColumnsContext)_localctx).columns = qualifiedColTypeWithPositionList(); + setState(563); + match(T__1); + } + break; + case 25: + _localctx = new SetTableSerDeContext(_localctx); + enterOuterAlt(_localctx, 25); + { + setState(565); + match(ALTER); + setState(566); + match(TABLE); + setState(567); + multipartIdentifier(); + setState(569); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(568); + partitionSpec(); + } + } + + setState(571); + match(SET); + setState(572); + match(SERDE); + setState(573); + match(STRING); + setState(577); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WITH) { + { + setState(574); + match(WITH); + setState(575); + match(SERDEPROPERTIES); + setState(576); + tablePropertyList(); + } + } + + } + break; + case 26: + _localctx = new SetTableSerDeContext(_localctx); + enterOuterAlt(_localctx, 26); + { + setState(579); + match(ALTER); + setState(580); + match(TABLE); + setState(581); + multipartIdentifier(); + setState(583); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(582); + partitionSpec(); + } + } + + setState(585); + match(SET); + setState(586); + match(SERDEPROPERTIES); + setState(587); + tablePropertyList(); + } + break; + case 27: + _localctx = new AddTablePartitionContext(_localctx); + enterOuterAlt(_localctx, 27); + { + setState(589); + match(ALTER); + setState(590); + _la = _input.LA(1); + if ( !(_la==TABLE || _la==VIEW) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(591); + multipartIdentifier(); + setState(592); + match(ADD); + setState(596); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IF) { + { + setState(593); + match(IF); + setState(594); + match(NOT); + setState(595); + match(EXISTS); + } + } + + setState(599); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(598); + partitionSpecLocation(); + } + } + setState(601); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==PARTITION ); + } + break; + case 28: + _localctx = new RenameTablePartitionContext(_localctx); + enterOuterAlt(_localctx, 28); + { + setState(603); + match(ALTER); + setState(604); + match(TABLE); + setState(605); + multipartIdentifier(); + setState(606); + ((RenameTablePartitionContext)_localctx).from = partitionSpec(); + setState(607); + match(RENAME); + setState(608); + match(TO); + setState(609); + ((RenameTablePartitionContext)_localctx).to = partitionSpec(); + } + break; + case 29: + _localctx = new DropTablePartitionsContext(_localctx); + enterOuterAlt(_localctx, 29); + { + setState(611); + match(ALTER); + setState(612); + _la = _input.LA(1); + if ( !(_la==TABLE || _la==VIEW) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(613); + multipartIdentifier(); + setState(614); + match(DROP); + setState(617); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IF) { + { + setState(615); + match(IF); + setState(616); + match(EXISTS); + } + } + + setState(619); + partitionSpec(); + setState(624); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(620); + match(COMMA); + setState(621); + partitionSpec(); + } + } + setState(626); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(628); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PURGE) { + { + setState(627); + match(PURGE); + } + } + + } + break; + case 30: + _localctx = new SetTableLocationContext(_localctx); + enterOuterAlt(_localctx, 30); + { + setState(630); + match(ALTER); + setState(631); + match(TABLE); + setState(632); + multipartIdentifier(); + setState(634); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(633); + partitionSpec(); + } + } + + setState(636); + match(SET); + setState(637); + locationSpec(); + } + break; + case 31: + _localctx = new RecoverPartitionsContext(_localctx); + enterOuterAlt(_localctx, 31); + { + setState(639); + match(ALTER); + setState(640); + match(TABLE); + setState(641); + multipartIdentifier(); + setState(642); + match(RECOVER); + setState(643); + match(PARTITIONS); + } + break; + case 32: + _localctx = new DropTableContext(_localctx); + enterOuterAlt(_localctx, 32); + { + setState(645); + match(DROP); + setState(646); + match(TABLE); + setState(649); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: + { + setState(647); + match(IF); + setState(648); + match(EXISTS); + } + break; + } + setState(651); + multipartIdentifier(); + setState(653); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PURGE) { + { + setState(652); + match(PURGE); + } + } + + } + break; + case 33: + _localctx = new DropViewContext(_localctx); + enterOuterAlt(_localctx, 33); + { + setState(655); + match(DROP); + setState(656); + match(VIEW); + setState(659); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + case 1: + { + setState(657); + match(IF); + setState(658); + match(EXISTS); + } + break; + } + setState(661); + multipartIdentifier(); + } + break; + case 34: + _localctx = new CreateViewContext(_localctx); + enterOuterAlt(_localctx, 34); + { + setState(662); + match(CREATE); + setState(665); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OR) { + { + setState(663); + match(OR); + setState(664); + match(REPLACE); + } + } + + setState(671); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==GLOBAL || _la==TEMPORARY) { + { + setState(668); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==GLOBAL) { + { + setState(667); + match(GLOBAL); + } + } + + setState(670); + match(TEMPORARY); + } + } + + setState(673); + match(VIEW); + setState(677); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + case 1: + { + setState(674); + match(IF); + setState(675); + match(NOT); + setState(676); + match(EXISTS); + } + break; + } + setState(679); + multipartIdentifier(); + setState(681); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__0) { + { + setState(680); + identifierCommentList(); + } + } + + setState(691); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMENT || _la==PARTITIONED || _la==TBLPROPERTIES) { + { + setState(689); + _errHandler.sync(this); + switch (_input.LA(1)) { + case COMMENT: + { + setState(683); + commentSpec(); + } + break; + case PARTITIONED: + { + { + setState(684); + match(PARTITIONED); + setState(685); + match(ON); + setState(686); + identifierList(); + } + } + break; + case TBLPROPERTIES: + { + { + setState(687); + match(TBLPROPERTIES); + setState(688); + tablePropertyList(); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + setState(693); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(694); + match(AS); + setState(695); + query(); + } + break; + case 35: + _localctx = new CreateTempViewUsingContext(_localctx); + enterOuterAlt(_localctx, 35); + { + setState(697); + match(CREATE); + setState(700); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OR) { + { + setState(698); + match(OR); + setState(699); + match(REPLACE); + } + } + + setState(703); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==GLOBAL) { + { + setState(702); + match(GLOBAL); + } + } + + setState(705); + match(TEMPORARY); + setState(706); + match(VIEW); + setState(707); + tableIdentifier(); + setState(712); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__0) { + { + setState(708); + match(T__0); + setState(709); + colTypeList(); + setState(710); + match(T__1); + } + } + + setState(714); + tableProvider(); + setState(717); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPTIONS) { + { + setState(715); + match(OPTIONS); + setState(716); + tablePropertyList(); + } + } + + } + break; + case 36: + _localctx = new AlterViewQueryContext(_localctx); + enterOuterAlt(_localctx, 36); + { + setState(719); + match(ALTER); + setState(720); + match(VIEW); + setState(721); + multipartIdentifier(); + setState(723); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(722); + match(AS); + } + } + + setState(725); + query(); + } + break; + case 37: + _localctx = new CreateFunctionContext(_localctx); + enterOuterAlt(_localctx, 37); + { + setState(727); + match(CREATE); + setState(730); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OR) { + { + setState(728); + match(OR); + setState(729); + match(REPLACE); + } + } + + setState(733); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==TEMPORARY) { + { + setState(732); + match(TEMPORARY); + } + } + + setState(735); + match(FUNCTION); + setState(739); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + case 1: + { + setState(736); + match(IF); + setState(737); + match(NOT); + setState(738); + match(EXISTS); + } + break; + } + setState(741); + multipartIdentifier(); + setState(742); + match(AS); + setState(743); + ((CreateFunctionContext)_localctx).className = match(STRING); + setState(753); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==USING) { + { + setState(744); + match(USING); + setState(745); + resource(); + setState(750); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(746); + match(COMMA); + setState(747); + resource(); + } + } + setState(752); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + } + break; + case 38: + _localctx = new DropFunctionContext(_localctx); + enterOuterAlt(_localctx, 38); + { + setState(755); + match(DROP); + setState(757); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==TEMPORARY) { + { + setState(756); + match(TEMPORARY); + } + } + + setState(759); + match(FUNCTION); + setState(762); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + case 1: + { + setState(760); + match(IF); + setState(761); + match(EXISTS); + } + break; + } + setState(764); + multipartIdentifier(); + } + break; + case 39: + _localctx = new ExplainContext(_localctx); + enterOuterAlt(_localctx, 39); + { + setState(765); + match(EXPLAIN); + setState(767); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==CODEGEN || _la==COST || ((((_la - 83)) & ~0x3f) == 0 && ((1L << (_la - 83)) & ((1L << (EXTENDED - 83)) | (1L << (FORMATTED - 83)) | (1L << (LOGICAL - 83)))) != 0)) { + { + setState(766); + _la = _input.LA(1); + if ( !(_la==CODEGEN || _la==COST || ((((_la - 83)) & ~0x3f) == 0 && ((1L << (_la - 83)) & ((1L << (EXTENDED - 83)) | (1L << (FORMATTED - 83)) | (1L << (LOGICAL - 83)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + setState(769); + statement(); + } + break; + case 40: + _localctx = new ShowTablesContext(_localctx); + enterOuterAlt(_localctx, 40); + { + setState(770); + match(SHOW); + setState(771); + match(TABLES); + setState(774); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FROM || _la==IN) { + { + setState(772); + _la = _input.LA(1); + if ( !(_la==FROM || _la==IN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(773); + multipartIdentifier(); + } + } + + setState(780); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LIKE || _la==STRING) { + { + setState(777); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LIKE) { + { + setState(776); + match(LIKE); + } + } + + setState(779); + ((ShowTablesContext)_localctx).pattern = match(STRING); + } + } + + } + break; + case 41: + _localctx = new ShowTableExtendedContext(_localctx); + enterOuterAlt(_localctx, 41); + { + setState(782); + match(SHOW); + setState(783); + match(TABLE); + setState(784); + match(EXTENDED); + setState(787); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FROM || _la==IN) { + { + setState(785); + _la = _input.LA(1); + if ( !(_la==FROM || _la==IN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(786); + ((ShowTableExtendedContext)_localctx).ns = multipartIdentifier(); + } + } + + setState(789); + match(LIKE); + setState(790); + ((ShowTableExtendedContext)_localctx).pattern = match(STRING); + setState(792); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(791); + partitionSpec(); + } + } + + } + break; + case 42: + _localctx = new ShowTblPropertiesContext(_localctx); + enterOuterAlt(_localctx, 42); + { + setState(794); + match(SHOW); + setState(795); + match(TBLPROPERTIES); + setState(796); + ((ShowTblPropertiesContext)_localctx).table = multipartIdentifier(); + setState(801); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__0) { + { + setState(797); + match(T__0); + setState(798); + ((ShowTblPropertiesContext)_localctx).key = tablePropertyKey(); + setState(799); + match(T__1); + } + } + + } + break; + case 43: + _localctx = new ShowColumnsContext(_localctx); + enterOuterAlt(_localctx, 43); + { + setState(803); + match(SHOW); + setState(804); + match(COLUMNS); + setState(805); + _la = _input.LA(1); + if ( !(_la==FROM || _la==IN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(806); + ((ShowColumnsContext)_localctx).table = multipartIdentifier(); + setState(809); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FROM || _la==IN) { + { + setState(807); + _la = _input.LA(1); + if ( !(_la==FROM || _la==IN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(808); + ((ShowColumnsContext)_localctx).ns = multipartIdentifier(); + } + } + + } + break; + case 44: + _localctx = new ShowViewsContext(_localctx); + enterOuterAlt(_localctx, 44); + { + setState(811); + match(SHOW); + setState(812); + match(VIEWS); + setState(815); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FROM || _la==IN) { + { + setState(813); + _la = _input.LA(1); + if ( !(_la==FROM || _la==IN) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(814); + multipartIdentifier(); + } + } + + setState(821); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LIKE || _la==STRING) { + { + setState(818); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LIKE) { + { + setState(817); + match(LIKE); + } + } + + setState(820); + ((ShowViewsContext)_localctx).pattern = match(STRING); + } + } + + } + break; + case 45: + _localctx = new ShowPartitionsContext(_localctx); + enterOuterAlt(_localctx, 45); + { + setState(823); + match(SHOW); + setState(824); + match(PARTITIONS); + setState(825); + multipartIdentifier(); + setState(827); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(826); + partitionSpec(); + } + } + + } + break; + case 46: + _localctx = new ShowFunctionsContext(_localctx); + enterOuterAlt(_localctx, 46); + { + setState(829); + match(SHOW); + setState(831); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + case 1: + { + setState(830); + identifier(); + } + break; + } + setState(833); + match(FUNCTIONS); + setState(841); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + case 1: + { + setState(835); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + case 1: + { + setState(834); + match(LIKE); + } + break; + } + setState(839); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + case 1: + { + setState(837); + multipartIdentifier(); + } + break; + case 2: + { + setState(838); + ((ShowFunctionsContext)_localctx).pattern = match(STRING); + } + break; + } + } + break; + } + } + break; + case 47: + _localctx = new ShowCreateTableContext(_localctx); + enterOuterAlt(_localctx, 47); + { + setState(843); + match(SHOW); + setState(844); + match(CREATE); + setState(845); + match(TABLE); + setState(846); + multipartIdentifier(); + setState(849); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(847); + match(AS); + setState(848); + match(SERDE); + } + } + + } + break; + case 48: + _localctx = new ShowCurrentNamespaceContext(_localctx); + enterOuterAlt(_localctx, 48); + { + setState(851); + match(SHOW); + setState(852); + match(CURRENT); + setState(853); + match(NAMESPACE); + } + break; + case 49: + _localctx = new DescribeFunctionContext(_localctx); + enterOuterAlt(_localctx, 49); + { + setState(854); + _la = _input.LA(1); + if ( !(_la==DESC || _la==DESCRIBE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(855); + match(FUNCTION); + setState(857); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { + case 1: + { + setState(856); + match(EXTENDED); + } + break; + } + setState(859); + describeFuncName(); + } + break; + case 50: + _localctx = new DescribeNamespaceContext(_localctx); + enterOuterAlt(_localctx, 50); + { + setState(860); + _la = _input.LA(1); + if ( !(_la==DESC || _la==DESCRIBE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(861); + namespace(); + setState(863); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { + case 1: + { + setState(862); + match(EXTENDED); + } + break; + } + setState(865); + multipartIdentifier(); + } + break; + case 51: + _localctx = new DescribeRelationContext(_localctx); + enterOuterAlt(_localctx, 51); + { + setState(867); + _la = _input.LA(1); + if ( !(_la==DESC || _la==DESCRIBE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(869); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + case 1: + { + setState(868); + match(TABLE); + } + break; + } + setState(872); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + case 1: + { + setState(871); + ((DescribeRelationContext)_localctx).option = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==EXTENDED || _la==FORMATTED) ) { + ((DescribeRelationContext)_localctx).option = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + setState(874); + multipartIdentifier(); + setState(876); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + case 1: + { + setState(875); + partitionSpec(); + } + break; + } + setState(879); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + case 1: + { + setState(878); + describeColName(); + } + break; + } + } + break; + case 52: + _localctx = new DescribeQueryContext(_localctx); + enterOuterAlt(_localctx, 52); + { + setState(881); + _la = _input.LA(1); + if ( !(_la==DESC || _la==DESCRIBE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(883); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==QUERY) { + { + setState(882); + match(QUERY); + } + } + + setState(885); + query(); + } + break; + case 53: + _localctx = new CommentNamespaceContext(_localctx); + enterOuterAlt(_localctx, 53); + { + setState(886); + match(COMMENT); + setState(887); + match(ON); + setState(888); + namespace(); + setState(889); + multipartIdentifier(); + setState(890); + match(IS); + setState(891); + ((CommentNamespaceContext)_localctx).comment = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==NULL || _la==STRING) ) { + ((CommentNamespaceContext)_localctx).comment = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 54: + _localctx = new CommentTableContext(_localctx); + enterOuterAlt(_localctx, 54); + { + setState(893); + match(COMMENT); + setState(894); + match(ON); + setState(895); + match(TABLE); + setState(896); + multipartIdentifier(); + setState(897); + match(IS); + setState(898); + ((CommentTableContext)_localctx).comment = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==NULL || _la==STRING) ) { + ((CommentTableContext)_localctx).comment = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 55: + _localctx = new RefreshTableContext(_localctx); + enterOuterAlt(_localctx, 55); + { + setState(900); + match(REFRESH); + setState(901); + match(TABLE); + setState(902); + multipartIdentifier(); + } + break; + case 56: + _localctx = new RefreshFunctionContext(_localctx); + enterOuterAlt(_localctx, 56); + { + setState(903); + match(REFRESH); + setState(904); + match(FUNCTION); + setState(905); + multipartIdentifier(); + } + break; + case 57: + _localctx = new RefreshResourceContext(_localctx); + enterOuterAlt(_localctx, 57); + { + setState(906); + match(REFRESH); + setState(914); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + case 1: + { + setState(907); + match(STRING); + } + break; + case 2: + { + setState(911); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(908); + matchWildcard(); + } + } + } + setState(913); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + } + } + break; + } + } + break; + case 58: + _localctx = new CacheTableContext(_localctx); + enterOuterAlt(_localctx, 58); + { + setState(916); + match(CACHE); + setState(918); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LAZY) { + { + setState(917); + match(LAZY); + } + } + + setState(920); + match(TABLE); + setState(921); + multipartIdentifier(); + setState(924); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPTIONS) { + { + setState(922); + match(OPTIONS); + setState(923); + ((CacheTableContext)_localctx).options = tablePropertyList(); + } + } + + setState(930); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__0 || _la==AS || _la==FROM || _la==MAP || ((((_la - 185)) & ~0x3f) == 0 && ((1L << (_la - 185)) & ((1L << (REDUCE - 185)) | (1L << (SELECT - 185)) | (1L << (TABLE - 185)))) != 0) || _la==VALUES || _la==WITH) { + { + setState(927); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(926); + match(AS); + } + } + + setState(929); + query(); + } + } + + } + break; + case 59: + _localctx = new UncacheTableContext(_localctx); + enterOuterAlt(_localctx, 59); + { + setState(932); + match(UNCACHE); + setState(933); + match(TABLE); + setState(936); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { + case 1: + { + setState(934); + match(IF); + setState(935); + match(EXISTS); + } + break; + } + setState(938); + multipartIdentifier(); + } + break; + case 60: + _localctx = new ClearCacheContext(_localctx); + enterOuterAlt(_localctx, 60); + { + setState(939); + match(CLEAR); + setState(940); + match(CACHE); + } + break; + case 61: + _localctx = new LoadDataContext(_localctx); + enterOuterAlt(_localctx, 61); + { + setState(941); + match(LOAD); + setState(942); + match(DATA); + setState(944); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LOCAL) { + { + setState(943); + match(LOCAL); + } + } + + setState(946); + match(INPATH); + setState(947); + ((LoadDataContext)_localctx).path = match(STRING); + setState(949); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OVERWRITE) { + { + setState(948); + match(OVERWRITE); + } + } + + setState(951); + match(INTO); + setState(952); + match(TABLE); + setState(953); + multipartIdentifier(); + setState(955); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(954); + partitionSpec(); + } + } + + } + break; + case 62: + _localctx = new TruncateTableContext(_localctx); + enterOuterAlt(_localctx, 62); + { + setState(957); + match(TRUNCATE); + setState(958); + match(TABLE); + setState(959); + multipartIdentifier(); + setState(961); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(960); + partitionSpec(); + } + } + + } + break; + case 63: + _localctx = new RepairTableContext(_localctx); + enterOuterAlt(_localctx, 63); + { + setState(963); + match(MSCK); + setState(964); + match(REPAIR); + setState(965); + match(TABLE); + setState(966); + multipartIdentifier(); + setState(969); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ADD || _la==DROP || _la==SYNC) { + { + setState(967); + ((RepairTableContext)_localctx).option = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ADD || _la==DROP || _la==SYNC) ) { + ((RepairTableContext)_localctx).option = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(968); + match(PARTITIONS); + } + } + + } + break; + case 64: + _localctx = new ManageResourceContext(_localctx); + enterOuterAlt(_localctx, 64); + { + setState(971); + ((ManageResourceContext)_localctx).op = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ADD || _la==LIST) ) { + ((ManageResourceContext)_localctx).op = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(972); + identifier(); + setState(976); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,100,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(973); + matchWildcard(); + } + } + } + setState(978); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,100,_ctx); + } + } + break; + case 65: + _localctx = new FailNativeCommandContext(_localctx); + enterOuterAlt(_localctx, 65); + { + setState(979); + match(SET); + setState(980); + match(ROLE); + setState(984); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,101,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(981); + matchWildcard(); + } + } + } + setState(986); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,101,_ctx); + } + } + break; + case 66: + _localctx = new SetTimeZoneContext(_localctx); + enterOuterAlt(_localctx, 66); + { + setState(987); + match(SET); + setState(988); + match(TIME); + setState(989); + match(ZONE); + setState(990); + interval(); + } + break; + case 67: + _localctx = new SetTimeZoneContext(_localctx); + enterOuterAlt(_localctx, 67); + { + setState(991); + match(SET); + setState(992); + match(TIME); + setState(993); + match(ZONE); + setState(994); + ((SetTimeZoneContext)_localctx).timezone = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==LOCAL || _la==STRING) ) { + ((SetTimeZoneContext)_localctx).timezone = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 68: + _localctx = new SetTimeZoneContext(_localctx); + enterOuterAlt(_localctx, 68); + { + setState(995); + match(SET); + setState(996); + match(TIME); + setState(997); + match(ZONE); + setState(1001); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,102,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(998); + matchWildcard(); + } + } + } + setState(1003); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,102,_ctx); + } + } + break; + case 69: + _localctx = new SetQuotedConfigurationContext(_localctx); + enterOuterAlt(_localctx, 69); + { + setState(1004); + match(SET); + setState(1005); + configKey(); + setState(1006); + match(EQ); + setState(1007); + configValue(); + } + break; + case 70: + _localctx = new SetQuotedConfigurationContext(_localctx); + enterOuterAlt(_localctx, 70); + { + setState(1009); + match(SET); + setState(1010); + configKey(); + setState(1018); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EQ) { + { + setState(1011); + match(EQ); + setState(1015); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,103,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(1012); + matchWildcard(); + } + } + } + setState(1017); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,103,_ctx); + } + } + } + + } + break; + case 71: + _localctx = new SetQuotedConfigurationContext(_localctx); + enterOuterAlt(_localctx, 71); + { + setState(1020); + match(SET); + setState(1024); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,105,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(1021); + matchWildcard(); + } + } + } + setState(1026); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,105,_ctx); + } + setState(1027); + match(EQ); + setState(1028); + configValue(); + } + break; + case 72: + _localctx = new SetConfigurationContext(_localctx); + enterOuterAlt(_localctx, 72); + { + setState(1029); + match(SET); + setState(1033); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,106,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(1030); + matchWildcard(); + } + } + } + setState(1035); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,106,_ctx); + } + } + break; + case 73: + _localctx = new ResetQuotedConfigurationContext(_localctx); + enterOuterAlt(_localctx, 73); + { + setState(1036); + match(RESET); + setState(1037); + configKey(); + } + break; + case 74: + _localctx = new ResetConfigurationContext(_localctx); + enterOuterAlt(_localctx, 74); + { + setState(1038); + match(RESET); + setState(1042); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,107,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(1039); + matchWildcard(); + } + } + } + setState(1044); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,107,_ctx); + } + } + break; + case 75: + _localctx = new FailNativeCommandContext(_localctx); + enterOuterAlt(_localctx, 75); + { + setState(1045); + unsupportedHiveNativeCommands(); + setState(1049); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,108,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + { + setState(1046); + matchWildcard(); + } + } + } + setState(1051); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,108,_ctx); + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ConfigKeyContext extends ParserRuleContext { + public QuotedIdentifierContext quotedIdentifier() { + return getRuleContext(QuotedIdentifierContext.class,0); + } + public ConfigKeyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_configKey; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterConfigKey(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitConfigKey(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitConfigKey(this); + else return visitor.visitChildren(this); + } + } + + public final ConfigKeyContext configKey() throws RecognitionException { + ConfigKeyContext _localctx = new ConfigKeyContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_configKey); + try { + enterOuterAlt(_localctx, 1); + { + setState(1054); + quotedIdentifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ConfigValueContext extends ParserRuleContext { + public QuotedIdentifierContext quotedIdentifier() { + return getRuleContext(QuotedIdentifierContext.class,0); + } + public ConfigValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_configValue; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterConfigValue(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitConfigValue(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitConfigValue(this); + else return visitor.visitChildren(this); + } + } + + public final ConfigValueContext configValue() throws RecognitionException { + ConfigValueContext _localctx = new ConfigValueContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_configValue); + try { + enterOuterAlt(_localctx, 1); + { + setState(1056); + quotedIdentifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class UnsupportedHiveNativeCommandsContext extends ParserRuleContext { + public Token kw1; + public Token kw2; + public Token kw3; + public Token kw4; + public Token kw5; + public Token kw6; + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode ROLE() { return getToken(SQLParser.ROLE, 0); } + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public TerminalNode GRANT() { return getToken(SQLParser.GRANT, 0); } + public TerminalNode REVOKE() { return getToken(SQLParser.REVOKE, 0); } + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode PRINCIPALS() { return getToken(SQLParser.PRINCIPALS, 0); } + public TerminalNode ROLES() { return getToken(SQLParser.ROLES, 0); } + public TerminalNode CURRENT() { return getToken(SQLParser.CURRENT, 0); } + public TerminalNode EXPORT() { return getToken(SQLParser.EXPORT, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode IMPORT() { return getToken(SQLParser.IMPORT, 0); } + public TerminalNode COMPACTIONS() { return getToken(SQLParser.COMPACTIONS, 0); } + public TerminalNode TRANSACTIONS() { return getToken(SQLParser.TRANSACTIONS, 0); } + public TerminalNode INDEXES() { return getToken(SQLParser.INDEXES, 0); } + public TerminalNode LOCKS() { return getToken(SQLParser.LOCKS, 0); } + public TerminalNode INDEX() { return getToken(SQLParser.INDEX, 0); } + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode LOCK() { return getToken(SQLParser.LOCK, 0); } + public TerminalNode DATABASE() { return getToken(SQLParser.DATABASE, 0); } + public TerminalNode UNLOCK() { return getToken(SQLParser.UNLOCK, 0); } + public TerminalNode TEMPORARY() { return getToken(SQLParser.TEMPORARY, 0); } + public TerminalNode MACRO() { return getToken(SQLParser.MACRO, 0); } + public TableIdentifierContext tableIdentifier() { + return getRuleContext(TableIdentifierContext.class,0); + } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode CLUSTERED() { return getToken(SQLParser.CLUSTERED, 0); } + public TerminalNode BY() { return getToken(SQLParser.BY, 0); } + public TerminalNode SORTED() { return getToken(SQLParser.SORTED, 0); } + public TerminalNode SKEWED() { return getToken(SQLParser.SKEWED, 0); } + public TerminalNode STORED() { return getToken(SQLParser.STORED, 0); } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public TerminalNode DIRECTORIES() { return getToken(SQLParser.DIRECTORIES, 0); } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode LOCATION() { return getToken(SQLParser.LOCATION, 0); } + public TerminalNode EXCHANGE() { return getToken(SQLParser.EXCHANGE, 0); } + public TerminalNode PARTITION() { return getToken(SQLParser.PARTITION, 0); } + public TerminalNode ARCHIVE() { return getToken(SQLParser.ARCHIVE, 0); } + public TerminalNode UNARCHIVE() { return getToken(SQLParser.UNARCHIVE, 0); } + public TerminalNode TOUCH() { return getToken(SQLParser.TOUCH, 0); } + public TerminalNode COMPACT() { return getToken(SQLParser.COMPACT, 0); } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public TerminalNode CONCATENATE() { return getToken(SQLParser.CONCATENATE, 0); } + public TerminalNode FILEFORMAT() { return getToken(SQLParser.FILEFORMAT, 0); } + public TerminalNode REPLACE() { return getToken(SQLParser.REPLACE, 0); } + public TerminalNode COLUMNS() { return getToken(SQLParser.COLUMNS, 0); } + public TerminalNode START() { return getToken(SQLParser.START, 0); } + public TerminalNode TRANSACTION() { return getToken(SQLParser.TRANSACTION, 0); } + public TerminalNode COMMIT() { return getToken(SQLParser.COMMIT, 0); } + public TerminalNode ROLLBACK() { return getToken(SQLParser.ROLLBACK, 0); } + public TerminalNode DFS() { return getToken(SQLParser.DFS, 0); } + public UnsupportedHiveNativeCommandsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_unsupportedHiveNativeCommands; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterUnsupportedHiveNativeCommands(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitUnsupportedHiveNativeCommands(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitUnsupportedHiveNativeCommands(this); + else return visitor.visitChildren(this); + } + } + + public final UnsupportedHiveNativeCommandsContext unsupportedHiveNativeCommands() throws RecognitionException { + UnsupportedHiveNativeCommandsContext _localctx = new UnsupportedHiveNativeCommandsContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_unsupportedHiveNativeCommands); + int _la; + try { + setState(1226); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1058); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(CREATE); + setState(1059); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(ROLE); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1060); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(DROP); + setState(1061); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(ROLE); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1062); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(GRANT); + setState(1064); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { + case 1: + { + setState(1063); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(ROLE); + } + break; + } + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(1066); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(REVOKE); + setState(1068); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { + case 1: + { + setState(1067); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(ROLE); + } + break; + } + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(1070); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1071); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(GRANT); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(1072); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1073); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(ROLE); + setState(1075); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + case 1: + { + setState(1074); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(GRANT); + } + break; + } + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(1077); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1078); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(PRINCIPALS); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(1079); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1080); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(ROLES); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(1081); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1082); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(CURRENT); + setState(1083); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(ROLES); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(1084); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(EXPORT); + setState(1085); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(1086); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(IMPORT); + setState(1087); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(1088); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1089); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(COMPACTIONS); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(1090); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1091); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(CREATE); + setState(1092); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(TABLE); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(1093); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1094); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TRANSACTIONS); + } + break; + case 15: + enterOuterAlt(_localctx, 15); + { + setState(1095); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1096); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(INDEXES); + } + break; + case 16: + enterOuterAlt(_localctx, 16); + { + setState(1097); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(SHOW); + setState(1098); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(LOCKS); + } + break; + case 17: + enterOuterAlt(_localctx, 17); + { + setState(1099); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(CREATE); + setState(1100); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(INDEX); + } + break; + case 18: + enterOuterAlt(_localctx, 18); + { + setState(1101); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(DROP); + setState(1102); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(INDEX); + } + break; + case 19: + enterOuterAlt(_localctx, 19); + { + setState(1103); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1104); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(INDEX); + } + break; + case 20: + enterOuterAlt(_localctx, 20); + { + setState(1105); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(LOCK); + setState(1106); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + } + break; + case 21: + enterOuterAlt(_localctx, 21); + { + setState(1107); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(LOCK); + setState(1108); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(DATABASE); + } + break; + case 22: + enterOuterAlt(_localctx, 22); + { + setState(1109); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(UNLOCK); + setState(1110); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + } + break; + case 23: + enterOuterAlt(_localctx, 23); + { + setState(1111); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(UNLOCK); + setState(1112); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(DATABASE); + } + break; + case 24: + enterOuterAlt(_localctx, 24); + { + setState(1113); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(CREATE); + setState(1114); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TEMPORARY); + setState(1115); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(MACRO); + } + break; + case 25: + enterOuterAlt(_localctx, 25); + { + setState(1116); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(DROP); + setState(1117); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TEMPORARY); + setState(1118); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(MACRO); + } + break; + case 26: + enterOuterAlt(_localctx, 26); + { + setState(1119); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1120); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1121); + tableIdentifier(); + setState(1122); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(NOT); + setState(1123); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(CLUSTERED); + } + break; + case 27: + enterOuterAlt(_localctx, 27); + { + setState(1125); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1126); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1127); + tableIdentifier(); + setState(1128); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(CLUSTERED); + setState(1129); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(BY); + } + break; + case 28: + enterOuterAlt(_localctx, 28); + { + setState(1131); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1132); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1133); + tableIdentifier(); + setState(1134); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(NOT); + setState(1135); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(SORTED); + } + break; + case 29: + enterOuterAlt(_localctx, 29); + { + setState(1137); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1138); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1139); + tableIdentifier(); + setState(1140); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(SKEWED); + setState(1141); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(BY); + } + break; + case 30: + enterOuterAlt(_localctx, 30); + { + setState(1143); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1144); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1145); + tableIdentifier(); + setState(1146); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(NOT); + setState(1147); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(SKEWED); + } + break; + case 31: + enterOuterAlt(_localctx, 31); + { + setState(1149); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1150); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1151); + tableIdentifier(); + setState(1152); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(NOT); + setState(1153); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(STORED); + setState(1154); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw5 = match(AS); + setState(1155); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw6 = match(DIRECTORIES); + } + break; + case 32: + enterOuterAlt(_localctx, 32); + { + setState(1157); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1158); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1159); + tableIdentifier(); + setState(1160); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(SET); + setState(1161); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(SKEWED); + setState(1162); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw5 = match(LOCATION); + } + break; + case 33: + enterOuterAlt(_localctx, 33); + { + setState(1164); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1165); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1166); + tableIdentifier(); + setState(1167); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(EXCHANGE); + setState(1168); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(PARTITION); + } + break; + case 34: + enterOuterAlt(_localctx, 34); + { + setState(1170); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1171); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1172); + tableIdentifier(); + setState(1173); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(ARCHIVE); + setState(1174); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(PARTITION); + } + break; + case 35: + enterOuterAlt(_localctx, 35); + { + setState(1176); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1177); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1178); + tableIdentifier(); + setState(1179); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(UNARCHIVE); + setState(1180); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(PARTITION); + } + break; + case 36: + enterOuterAlt(_localctx, 36); + { + setState(1182); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1183); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1184); + tableIdentifier(); + setState(1185); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(TOUCH); + } + break; + case 37: + enterOuterAlt(_localctx, 37); + { + setState(1187); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1188); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1189); + tableIdentifier(); + setState(1191); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(1190); + partitionSpec(); + } + } + + setState(1193); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(COMPACT); + } + break; + case 38: + enterOuterAlt(_localctx, 38); + { + setState(1195); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1196); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1197); + tableIdentifier(); + setState(1199); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(1198); + partitionSpec(); + } + } + + setState(1201); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(CONCATENATE); + } + break; + case 39: + enterOuterAlt(_localctx, 39); + { + setState(1203); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1204); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1205); + tableIdentifier(); + setState(1207); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(1206); + partitionSpec(); + } + } + + setState(1209); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(SET); + setState(1210); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(FILEFORMAT); + } + break; + case 40: + enterOuterAlt(_localctx, 40); + { + setState(1212); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ALTER); + setState(1213); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TABLE); + setState(1214); + tableIdentifier(); + setState(1216); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(1215); + partitionSpec(); + } + } + + setState(1218); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw3 = match(REPLACE); + setState(1219); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw4 = match(COLUMNS); + } + break; + case 41: + enterOuterAlt(_localctx, 41); + { + setState(1221); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(START); + setState(1222); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw2 = match(TRANSACTION); + } + break; + case 42: + enterOuterAlt(_localctx, 42); + { + setState(1223); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(COMMIT); + } + break; + case 43: + enterOuterAlt(_localctx, 43); + { + setState(1224); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(ROLLBACK); + } + break; + case 44: + enterOuterAlt(_localctx, 44); + { + setState(1225); + ((UnsupportedHiveNativeCommandsContext)_localctx).kw1 = match(DFS); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class CreateTableHeaderContext extends ParserRuleContext { + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode TEMPORARY() { return getToken(SQLParser.TEMPORARY, 0); } + public TerminalNode EXTERNAL() { return getToken(SQLParser.EXTERNAL, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public CreateTableHeaderContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_createTableHeader; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateTableHeader(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateTableHeader(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateTableHeader(this); + else return visitor.visitChildren(this); + } + } + + public final CreateTableHeaderContext createTableHeader() throws RecognitionException { + CreateTableHeaderContext _localctx = new CreateTableHeaderContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_createTableHeader); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1228); + match(CREATE); + setState(1230); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==TEMPORARY) { + { + setState(1229); + match(TEMPORARY); + } + } + + setState(1233); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EXTERNAL) { + { + setState(1232); + match(EXTERNAL); + } + } + + setState(1235); + match(TABLE); + setState(1239); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { + case 1: + { + setState(1236); + match(IF); + setState(1237); + match(NOT); + setState(1238); + match(EXISTS); + } + break; + } + setState(1241); + multipartIdentifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ReplaceTableHeaderContext extends ParserRuleContext { + public TerminalNode REPLACE() { return getToken(SQLParser.REPLACE, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode OR() { return getToken(SQLParser.OR, 0); } + public ReplaceTableHeaderContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_replaceTableHeader; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterReplaceTableHeader(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitReplaceTableHeader(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitReplaceTableHeader(this); + else return visitor.visitChildren(this); + } + } + + public final ReplaceTableHeaderContext replaceTableHeader() throws RecognitionException { + ReplaceTableHeaderContext _localctx = new ReplaceTableHeaderContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_replaceTableHeader); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1245); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==CREATE) { + { + setState(1243); + match(CREATE); + setState(1244); + match(OR); + } + } + + setState(1247); + match(REPLACE); + setState(1248); + match(TABLE); + setState(1249); + multipartIdentifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BucketSpecContext extends ParserRuleContext { + public TerminalNode CLUSTERED() { return getToken(SQLParser.CLUSTERED, 0); } + public List BY() { return getTokens(SQLParser.BY); } + public TerminalNode BY(int i) { + return getToken(SQLParser.BY, i); + } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public TerminalNode INTO() { return getToken(SQLParser.INTO, 0); } + public TerminalNode INTEGER_VALUE() { return getToken(SQLParser.INTEGER_VALUE, 0); } + public TerminalNode BUCKETS() { return getToken(SQLParser.BUCKETS, 0); } + public TerminalNode SORTED() { return getToken(SQLParser.SORTED, 0); } + public OrderedIdentifierListContext orderedIdentifierList() { + return getRuleContext(OrderedIdentifierListContext.class,0); + } + public BucketSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bucketSpec; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterBucketSpec(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitBucketSpec(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitBucketSpec(this); + else return visitor.visitChildren(this); + } + } + + public final BucketSpecContext bucketSpec() throws RecognitionException { + BucketSpecContext _localctx = new BucketSpecContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_bucketSpec); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1251); + match(CLUSTERED); + setState(1252); + match(BY); + setState(1253); + identifierList(); + setState(1257); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SORTED) { + { + setState(1254); + match(SORTED); + setState(1255); + match(BY); + setState(1256); + orderedIdentifierList(); + } + } + + setState(1259); + match(INTO); + setState(1260); + match(INTEGER_VALUE); + setState(1261); + match(BUCKETS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SkewSpecContext extends ParserRuleContext { + public TerminalNode SKEWED() { return getToken(SQLParser.SKEWED, 0); } + public TerminalNode BY() { return getToken(SQLParser.BY, 0); } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public TerminalNode ON() { return getToken(SQLParser.ON, 0); } + public ConstantListContext constantList() { + return getRuleContext(ConstantListContext.class,0); + } + public NestedConstantListContext nestedConstantList() { + return getRuleContext(NestedConstantListContext.class,0); + } + public TerminalNode STORED() { return getToken(SQLParser.STORED, 0); } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public TerminalNode DIRECTORIES() { return getToken(SQLParser.DIRECTORIES, 0); } + public SkewSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_skewSpec; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSkewSpec(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSkewSpec(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSkewSpec(this); + else return visitor.visitChildren(this); + } + } + + public final SkewSpecContext skewSpec() throws RecognitionException { + SkewSpecContext _localctx = new SkewSpecContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_skewSpec); + try { + enterOuterAlt(_localctx, 1); + { + setState(1263); + match(SKEWED); + setState(1264); + match(BY); + setState(1265); + identifierList(); + setState(1266); + match(ON); + setState(1269); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,123,_ctx) ) { + case 1: + { + setState(1267); + constantList(); + } + break; + case 2: + { + setState(1268); + nestedConstantList(); + } + break; + } + setState(1274); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + case 1: + { + setState(1271); + match(STORED); + setState(1272); + match(AS); + setState(1273); + match(DIRECTORIES); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class LocationSpecContext extends ParserRuleContext { + public TerminalNode LOCATION() { return getToken(SQLParser.LOCATION, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public LocationSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_locationSpec; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLocationSpec(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLocationSpec(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLocationSpec(this); + else return visitor.visitChildren(this); + } + } + + public final LocationSpecContext locationSpec() throws RecognitionException { + LocationSpecContext _localctx = new LocationSpecContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_locationSpec); + try { + enterOuterAlt(_localctx, 1); + { + setState(1276); + match(LOCATION); + setState(1277); + match(STRING); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class CommentSpecContext extends ParserRuleContext { + public TerminalNode COMMENT() { return getToken(SQLParser.COMMENT, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public CommentSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_commentSpec; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCommentSpec(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCommentSpec(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCommentSpec(this); + else return visitor.visitChildren(this); + } + } + + public final CommentSpecContext commentSpec() throws RecognitionException { + CommentSpecContext _localctx = new CommentSpecContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_commentSpec); + try { + enterOuterAlt(_localctx, 1); + { + setState(1279); + match(COMMENT); + setState(1280); + match(STRING); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QueryContext extends ParserRuleContext { + public QueryTermContext queryTerm() { + return getRuleContext(QueryTermContext.class,0); + } + public QueryOrganizationContext queryOrganization() { + return getRuleContext(QueryOrganizationContext.class,0); + } + public CtesContext ctes() { + return getRuleContext(CtesContext.class,0); + } + public QueryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_query; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQuery(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQuery(this); + else return visitor.visitChildren(this); + } + } + + public final QueryContext query() throws RecognitionException { + QueryContext _localctx = new QueryContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_query); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1283); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WITH) { + { + setState(1282); + ctes(); + } + } + + setState(1285); + queryTerm(0); + setState(1286); + queryOrganization(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class InsertIntoContext extends ParserRuleContext { + public InsertIntoContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_insertInto; } + + public InsertIntoContext() { } + public void copyFrom(InsertIntoContext ctx) { + super.copyFrom(ctx); + } + } + public static class InsertOverwriteHiveDirContext extends InsertIntoContext { + public Token path; + public TerminalNode INSERT() { return getToken(SQLParser.INSERT, 0); } + public TerminalNode OVERWRITE() { return getToken(SQLParser.OVERWRITE, 0); } + public TerminalNode DIRECTORY() { return getToken(SQLParser.DIRECTORY, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode LOCAL() { return getToken(SQLParser.LOCAL, 0); } + public RowFormatContext rowFormat() { + return getRuleContext(RowFormatContext.class,0); + } + public CreateFileFormatContext createFileFormat() { + return getRuleContext(CreateFileFormatContext.class,0); + } + public InsertOverwriteHiveDirContext(InsertIntoContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterInsertOverwriteHiveDir(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitInsertOverwriteHiveDir(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitInsertOverwriteHiveDir(this); + else return visitor.visitChildren(this); + } + } + public static class InsertOverwriteDirContext extends InsertIntoContext { + public Token path; + public TablePropertyListContext options; + public TerminalNode INSERT() { return getToken(SQLParser.INSERT, 0); } + public TerminalNode OVERWRITE() { return getToken(SQLParser.OVERWRITE, 0); } + public TerminalNode DIRECTORY() { return getToken(SQLParser.DIRECTORY, 0); } + public TableProviderContext tableProvider() { + return getRuleContext(TableProviderContext.class,0); + } + public TerminalNode LOCAL() { return getToken(SQLParser.LOCAL, 0); } + public TerminalNode OPTIONS() { return getToken(SQLParser.OPTIONS, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public InsertOverwriteDirContext(InsertIntoContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterInsertOverwriteDir(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitInsertOverwriteDir(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitInsertOverwriteDir(this); + else return visitor.visitChildren(this); + } + } + public static class InsertOverwriteTableContext extends InsertIntoContext { + public TerminalNode INSERT() { return getToken(SQLParser.INSERT, 0); } + public TerminalNode OVERWRITE() { return getToken(SQLParser.OVERWRITE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public InsertOverwriteTableContext(InsertIntoContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterInsertOverwriteTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitInsertOverwriteTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitInsertOverwriteTable(this); + else return visitor.visitChildren(this); + } + } + public static class InsertIntoTableContext extends InsertIntoContext { + public TerminalNode INSERT() { return getToken(SQLParser.INSERT, 0); } + public TerminalNode INTO() { return getToken(SQLParser.INTO, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public InsertIntoTableContext(InsertIntoContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterInsertIntoTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitInsertIntoTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitInsertIntoTable(this); + else return visitor.visitChildren(this); + } + } + + public final InsertIntoContext insertInto() throws RecognitionException { + InsertIntoContext _localctx = new InsertIntoContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_insertInto); + int _la; + try { + setState(1349); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { + case 1: + _localctx = new InsertOverwriteTableContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(1288); + match(INSERT); + setState(1289); + match(OVERWRITE); + setState(1291); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + case 1: + { + setState(1290); + match(TABLE); + } + break; + } + setState(1293); + multipartIdentifier(); + setState(1300); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(1294); + partitionSpec(); + setState(1298); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IF) { + { + setState(1295); + match(IF); + setState(1296); + match(NOT); + setState(1297); + match(EXISTS); + } + } + + } + } + + setState(1303); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + case 1: + { + setState(1302); + identifierList(); + } + break; + } + } + break; + case 2: + _localctx = new InsertIntoTableContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(1305); + match(INSERT); + setState(1306); + match(INTO); + setState(1308); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + case 1: + { + setState(1307); + match(TABLE); + } + break; + } + setState(1310); + multipartIdentifier(); + setState(1312); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(1311); + partitionSpec(); + } + } + + setState(1317); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IF) { + { + setState(1314); + match(IF); + setState(1315); + match(NOT); + setState(1316); + match(EXISTS); + } + } + + setState(1320); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + case 1: + { + setState(1319); + identifierList(); + } + break; + } + } + break; + case 3: + _localctx = new InsertOverwriteHiveDirContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(1322); + match(INSERT); + setState(1323); + match(OVERWRITE); + setState(1325); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LOCAL) { + { + setState(1324); + match(LOCAL); + } + } + + setState(1327); + match(DIRECTORY); + setState(1328); + ((InsertOverwriteHiveDirContext)_localctx).path = match(STRING); + setState(1330); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ROW) { + { + setState(1329); + rowFormat(); + } + } + + setState(1333); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==STORED) { + { + setState(1332); + createFileFormat(); + } + } + + } + break; + case 4: + _localctx = new InsertOverwriteDirContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(1335); + match(INSERT); + setState(1336); + match(OVERWRITE); + setState(1338); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LOCAL) { + { + setState(1337); + match(LOCAL); + } + } + + setState(1340); + match(DIRECTORY); + setState(1342); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==STRING) { + { + setState(1341); + ((InsertOverwriteDirContext)_localctx).path = match(STRING); + } + } + + setState(1344); + tableProvider(); + setState(1347); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPTIONS) { + { + setState(1345); + match(OPTIONS); + setState(1346); + ((InsertOverwriteDirContext)_localctx).options = tablePropertyList(); + } + } + + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PartitionSpecLocationContext extends ParserRuleContext { + public PartitionSpecContext partitionSpec() { + return getRuleContext(PartitionSpecContext.class,0); + } + public LocationSpecContext locationSpec() { + return getRuleContext(LocationSpecContext.class,0); + } + public PartitionSpecLocationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_partitionSpecLocation; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPartitionSpecLocation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPartitionSpecLocation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPartitionSpecLocation(this); + else return visitor.visitChildren(this); + } + } + + public final PartitionSpecLocationContext partitionSpecLocation() throws RecognitionException { + PartitionSpecLocationContext _localctx = new PartitionSpecLocationContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_partitionSpecLocation); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1351); + partitionSpec(); + setState(1353); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LOCATION) { + { + setState(1352); + locationSpec(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PartitionSpecContext extends ParserRuleContext { + public TerminalNode PARTITION() { return getToken(SQLParser.PARTITION, 0); } + public List partitionVal() { + return getRuleContexts(PartitionValContext.class); + } + public PartitionValContext partitionVal(int i) { + return getRuleContext(PartitionValContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public PartitionSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_partitionSpec; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPartitionSpec(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPartitionSpec(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPartitionSpec(this); + else return visitor.visitChildren(this); + } + } + + public final PartitionSpecContext partitionSpec() throws RecognitionException { + PartitionSpecContext _localctx = new PartitionSpecContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_partitionSpec); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1355); + match(PARTITION); + setState(1356); + match(T__0); + setState(1357); + partitionVal(); + setState(1362); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1358); + match(COMMA); + setState(1359); + partitionVal(); + } + } + setState(1364); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1365); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PartitionValContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode EQ() { return getToken(SQLParser.EQ, 0); } + public ConstantContext constant() { + return getRuleContext(ConstantContext.class,0); + } + public PartitionValContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_partitionVal; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPartitionVal(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPartitionVal(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPartitionVal(this); + else return visitor.visitChildren(this); + } + } + + public final PartitionValContext partitionVal() throws RecognitionException { + PartitionValContext _localctx = new PartitionValContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_partitionVal); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1367); + identifier(); + setState(1370); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EQ) { + { + setState(1368); + match(EQ); + setState(1369); + constant(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NamespaceContext extends ParserRuleContext { + public TerminalNode NAMESPACE() { return getToken(SQLParser.NAMESPACE, 0); } + public TerminalNode DATABASE() { return getToken(SQLParser.DATABASE, 0); } + public TerminalNode SCHEMA() { return getToken(SQLParser.SCHEMA, 0); } + public NamespaceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespace; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNamespace(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNamespace(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNamespace(this); + else return visitor.visitChildren(this); + } + } + + public final NamespaceContext namespace() throws RecognitionException { + NamespaceContext _localctx = new NamespaceContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_namespace); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1372); + _la = _input.LA(1); + if ( !(_la==DATABASE || _la==NAMESPACE || _la==SCHEMA) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DescribeFuncNameContext extends ParserRuleContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public ComparisonOperatorContext comparisonOperator() { + return getRuleContext(ComparisonOperatorContext.class,0); + } + public ArithmeticOperatorContext arithmeticOperator() { + return getRuleContext(ArithmeticOperatorContext.class,0); + } + public PredicateOperatorContext predicateOperator() { + return getRuleContext(PredicateOperatorContext.class,0); + } + public DescribeFuncNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_describeFuncName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDescribeFuncName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDescribeFuncName(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDescribeFuncName(this); + else return visitor.visitChildren(this); + } + } + + public final DescribeFuncNameContext describeFuncName() throws RecognitionException { + DescribeFuncNameContext _localctx = new DescribeFuncNameContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_describeFuncName); + try { + setState(1379); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1374); + qualifiedName(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1375); + match(STRING); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1376); + comparisonOperator(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(1377); + arithmeticOperator(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(1378); + predicateOperator(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DescribeColNameContext extends ParserRuleContext { + public IdentifierContext identifier; + public List nameParts = new ArrayList(); + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public List POINT() { return getTokens(SQLParser.POINT); } + public TerminalNode POINT(int i) { + return getToken(SQLParser.POINT, i); + } + public DescribeColNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_describeColName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDescribeColName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDescribeColName(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDescribeColName(this); + else return visitor.visitChildren(this); + } + } + + public final DescribeColNameContext describeColName() throws RecognitionException { + DescribeColNameContext _localctx = new DescribeColNameContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_describeColName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1381); + ((DescribeColNameContext)_localctx).identifier = identifier(); + ((DescribeColNameContext)_localctx).nameParts.add(((DescribeColNameContext)_localctx).identifier); + setState(1386); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==POINT) { + { + { + setState(1382); + match(POINT); + setState(1383); + ((DescribeColNameContext)_localctx).identifier = identifier(); + ((DescribeColNameContext)_localctx).nameParts.add(((DescribeColNameContext)_localctx).identifier); + } + } + setState(1388); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class CtesContext extends ParserRuleContext { + public TerminalNode WITH() { return getToken(SQLParser.WITH, 0); } + public List namedQuery() { + return getRuleContexts(NamedQueryContext.class); + } + public NamedQueryContext namedQuery(int i) { + return getRuleContext(NamedQueryContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public CtesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ctes; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCtes(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCtes(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCtes(this); + else return visitor.visitChildren(this); + } + } + + public final CtesContext ctes() throws RecognitionException { + CtesContext _localctx = new CtesContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_ctes); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1389); + match(WITH); + setState(1390); + namedQuery(); + setState(1395); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1391); + match(COMMA); + setState(1392); + namedQuery(); + } + } + setState(1397); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NamedQueryContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext name; + public IdentifierListContext columnAliases; + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public ErrorCapturingIdentifierContext errorCapturingIdentifier() { + return getRuleContext(ErrorCapturingIdentifierContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public NamedQueryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namedQuery; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNamedQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNamedQuery(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNamedQuery(this); + else return visitor.visitChildren(this); + } + } + + public final NamedQueryContext namedQuery() throws RecognitionException { + NamedQueryContext _localctx = new NamedQueryContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_namedQuery); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1398); + ((NamedQueryContext)_localctx).name = errorCapturingIdentifier(); + setState(1400); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + case 1: + { + setState(1399); + ((NamedQueryContext)_localctx).columnAliases = identifierList(); + } + break; + } + setState(1403); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(1402); + match(AS); + } + } + + setState(1405); + match(T__0); + setState(1406); + query(); + setState(1407); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TableProviderContext extends ParserRuleContext { + public TerminalNode USING() { return getToken(SQLParser.USING, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TableProviderContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tableProvider; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTableProvider(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTableProvider(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTableProvider(this); + else return visitor.visitChildren(this); + } + } + + public final TableProviderContext tableProvider() throws RecognitionException { + TableProviderContext _localctx = new TableProviderContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_tableProvider); + try { + enterOuterAlt(_localctx, 1); + { + setState(1409); + match(USING); + setState(1410); + multipartIdentifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class CreateTableClausesContext extends ParserRuleContext { + public TablePropertyListContext options; + public PartitionFieldListContext partitioning; + public TablePropertyListContext tableProps; + public List skewSpec() { + return getRuleContexts(SkewSpecContext.class); + } + public SkewSpecContext skewSpec(int i) { + return getRuleContext(SkewSpecContext.class,i); + } + public List bucketSpec() { + return getRuleContexts(BucketSpecContext.class); + } + public BucketSpecContext bucketSpec(int i) { + return getRuleContext(BucketSpecContext.class,i); + } + public List rowFormat() { + return getRuleContexts(RowFormatContext.class); + } + public RowFormatContext rowFormat(int i) { + return getRuleContext(RowFormatContext.class,i); + } + public List createFileFormat() { + return getRuleContexts(CreateFileFormatContext.class); + } + public CreateFileFormatContext createFileFormat(int i) { + return getRuleContext(CreateFileFormatContext.class,i); + } + public List locationSpec() { + return getRuleContexts(LocationSpecContext.class); + } + public LocationSpecContext locationSpec(int i) { + return getRuleContext(LocationSpecContext.class,i); + } + public List commentSpec() { + return getRuleContexts(CommentSpecContext.class); + } + public CommentSpecContext commentSpec(int i) { + return getRuleContext(CommentSpecContext.class,i); + } + public List OPTIONS() { return getTokens(SQLParser.OPTIONS); } + public TerminalNode OPTIONS(int i) { + return getToken(SQLParser.OPTIONS, i); + } + public List PARTITIONED() { return getTokens(SQLParser.PARTITIONED); } + public TerminalNode PARTITIONED(int i) { + return getToken(SQLParser.PARTITIONED, i); + } + public List BY() { return getTokens(SQLParser.BY); } + public TerminalNode BY(int i) { + return getToken(SQLParser.BY, i); + } + public List TBLPROPERTIES() { return getTokens(SQLParser.TBLPROPERTIES); } + public TerminalNode TBLPROPERTIES(int i) { + return getToken(SQLParser.TBLPROPERTIES, i); + } + public List tablePropertyList() { + return getRuleContexts(TablePropertyListContext.class); + } + public TablePropertyListContext tablePropertyList(int i) { + return getRuleContext(TablePropertyListContext.class,i); + } + public List partitionFieldList() { + return getRuleContexts(PartitionFieldListContext.class); + } + public PartitionFieldListContext partitionFieldList(int i) { + return getRuleContext(PartitionFieldListContext.class,i); + } + public CreateTableClausesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_createTableClauses; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateTableClauses(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateTableClauses(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateTableClauses(this); + else return visitor.visitChildren(this); + } + } + + public final CreateTableClausesContext createTableClauses() throws RecognitionException { + CreateTableClausesContext _localctx = new CreateTableClausesContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_createTableClauses); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1427); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==CLUSTERED || _la==COMMENT || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & ((1L << (LOCATION - 135)) | (1L << (OPTIONS - 135)) | (1L << (PARTITIONED - 135)))) != 0) || ((((_la - 201)) & ~0x3f) == 0 && ((1L << (_la - 201)) & ((1L << (ROW - 201)) | (1L << (SKEWED - 201)) | (1L << (STORED - 201)) | (1L << (TBLPROPERTIES - 201)))) != 0)) { + { + setState(1425); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPTIONS: + { + { + setState(1412); + match(OPTIONS); + setState(1413); + ((CreateTableClausesContext)_localctx).options = tablePropertyList(); + } + } + break; + case PARTITIONED: + { + { + setState(1414); + match(PARTITIONED); + setState(1415); + match(BY); + setState(1416); + ((CreateTableClausesContext)_localctx).partitioning = partitionFieldList(); + } + } + break; + case SKEWED: + { + setState(1417); + skewSpec(); + } + break; + case CLUSTERED: + { + setState(1418); + bucketSpec(); + } + break; + case ROW: + { + setState(1419); + rowFormat(); + } + break; + case STORED: + { + setState(1420); + createFileFormat(); + } + break; + case LOCATION: + { + setState(1421); + locationSpec(); + } + break; + case COMMENT: + { + setState(1422); + commentSpec(); + } + break; + case TBLPROPERTIES: + { + { + setState(1423); + match(TBLPROPERTIES); + setState(1424); + ((CreateTableClausesContext)_localctx).tableProps = tablePropertyList(); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + setState(1429); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TablePropertyListContext extends ParserRuleContext { + public List tableProperty() { + return getRuleContexts(TablePropertyContext.class); + } + public TablePropertyContext tableProperty(int i) { + return getRuleContext(TablePropertyContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public TablePropertyListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tablePropertyList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTablePropertyList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTablePropertyList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTablePropertyList(this); + else return visitor.visitChildren(this); + } + } + + public final TablePropertyListContext tablePropertyList() throws RecognitionException { + TablePropertyListContext _localctx = new TablePropertyListContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_tablePropertyList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1430); + match(T__0); + setState(1431); + tableProperty(); + setState(1436); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1432); + match(COMMA); + setState(1433); + tableProperty(); + } + } + setState(1438); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1439); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TablePropertyContext extends ParserRuleContext { + public TablePropertyKeyContext key; + public TablePropertyValueContext value; + public TablePropertyKeyContext tablePropertyKey() { + return getRuleContext(TablePropertyKeyContext.class,0); + } + public TablePropertyValueContext tablePropertyValue() { + return getRuleContext(TablePropertyValueContext.class,0); + } + public TerminalNode EQ() { return getToken(SQLParser.EQ, 0); } + public TablePropertyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tableProperty; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTableProperty(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTableProperty(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTableProperty(this); + else return visitor.visitChildren(this); + } + } + + public final TablePropertyContext tableProperty() throws RecognitionException { + TablePropertyContext _localctx = new TablePropertyContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_tableProperty); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1441); + ((TablePropertyContext)_localctx).key = tablePropertyKey(); + setState(1446); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FALSE || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & ((1L << (TRUE - 242)) | (1L << (EQ - 242)) | (1L << (STRING - 242)) | (1L << (INTEGER_VALUE - 242)) | (1L << (DECIMAL_VALUE - 242)))) != 0)) { + { + setState(1443); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EQ) { + { + setState(1442); + match(EQ); + } + } + + setState(1445); + ((TablePropertyContext)_localctx).value = tablePropertyValue(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TablePropertyKeyContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public List POINT() { return getTokens(SQLParser.POINT); } + public TerminalNode POINT(int i) { + return getToken(SQLParser.POINT, i); + } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TablePropertyKeyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tablePropertyKey; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTablePropertyKey(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTablePropertyKey(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTablePropertyKey(this); + else return visitor.visitChildren(this); + } + } + + public final TablePropertyKeyContext tablePropertyKey() throws RecognitionException { + TablePropertyKeyContext _localctx = new TablePropertyKeyContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_tablePropertyKey); + int _la; + try { + setState(1457); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1448); + identifier(); + setState(1453); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==POINT) { + { + { + setState(1449); + match(POINT); + setState(1450); + identifier(); + } + } + setState(1455); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1456); + match(STRING); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TablePropertyValueContext extends ParserRuleContext { + public TerminalNode INTEGER_VALUE() { return getToken(SQLParser.INTEGER_VALUE, 0); } + public TerminalNode DECIMAL_VALUE() { return getToken(SQLParser.DECIMAL_VALUE, 0); } + public BooleanValueContext booleanValue() { + return getRuleContext(BooleanValueContext.class,0); + } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TablePropertyValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tablePropertyValue; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTablePropertyValue(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTablePropertyValue(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTablePropertyValue(this); + else return visitor.visitChildren(this); + } + } + + public final TablePropertyValueContext tablePropertyValue() throws RecognitionException { + TablePropertyValueContext _localctx = new TablePropertyValueContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_tablePropertyValue); + try { + setState(1463); + _errHandler.sync(this); + switch (_input.LA(1)) { + case INTEGER_VALUE: + enterOuterAlt(_localctx, 1); + { + setState(1459); + match(INTEGER_VALUE); + } + break; + case DECIMAL_VALUE: + enterOuterAlt(_localctx, 2); + { + setState(1460); + match(DECIMAL_VALUE); + } + break; + case FALSE: + case TRUE: + enterOuterAlt(_localctx, 3); + { + setState(1461); + booleanValue(); + } + break; + case STRING: + enterOuterAlt(_localctx, 4); + { + setState(1462); + match(STRING); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ConstantListContext extends ParserRuleContext { + public List constant() { + return getRuleContexts(ConstantContext.class); + } + public ConstantContext constant(int i) { + return getRuleContext(ConstantContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public ConstantListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constantList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterConstantList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitConstantList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitConstantList(this); + else return visitor.visitChildren(this); + } + } + + public final ConstantListContext constantList() throws RecognitionException { + ConstantListContext _localctx = new ConstantListContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_constantList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1465); + match(T__0); + setState(1466); + constant(); + setState(1471); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1467); + match(COMMA); + setState(1468); + constant(); + } + } + setState(1473); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1474); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NestedConstantListContext extends ParserRuleContext { + public List constantList() { + return getRuleContexts(ConstantListContext.class); + } + public ConstantListContext constantList(int i) { + return getRuleContext(ConstantListContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public NestedConstantListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nestedConstantList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNestedConstantList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNestedConstantList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNestedConstantList(this); + else return visitor.visitChildren(this); + } + } + + public final NestedConstantListContext nestedConstantList() throws RecognitionException { + NestedConstantListContext _localctx = new NestedConstantListContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_nestedConstantList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1476); + match(T__0); + setState(1477); + constantList(); + setState(1482); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1478); + match(COMMA); + setState(1479); + constantList(); + } + } + setState(1484); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1485); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class CreateFileFormatContext extends ParserRuleContext { + public TerminalNode STORED() { return getToken(SQLParser.STORED, 0); } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public FileFormatContext fileFormat() { + return getRuleContext(FileFormatContext.class,0); + } + public TerminalNode BY() { return getToken(SQLParser.BY, 0); } + public StorageHandlerContext storageHandler() { + return getRuleContext(StorageHandlerContext.class,0); + } + public CreateFileFormatContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_createFileFormat; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCreateFileFormat(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCreateFileFormat(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCreateFileFormat(this); + else return visitor.visitChildren(this); + } + } + + public final CreateFileFormatContext createFileFormat() throws RecognitionException { + CreateFileFormatContext _localctx = new CreateFileFormatContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_createFileFormat); + try { + setState(1493); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1487); + match(STORED); + setState(1488); + match(AS); + setState(1489); + fileFormat(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1490); + match(STORED); + setState(1491); + match(BY); + setState(1492); + storageHandler(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FileFormatContext extends ParserRuleContext { + public FileFormatContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fileFormat; } + + public FileFormatContext() { } + public void copyFrom(FileFormatContext ctx) { + super.copyFrom(ctx); + } + } + public static class TableFileFormatContext extends FileFormatContext { + public Token inFmt; + public Token outFmt; + public TerminalNode INPUTFORMAT() { return getToken(SQLParser.INPUTFORMAT, 0); } + public TerminalNode OUTPUTFORMAT() { return getToken(SQLParser.OUTPUTFORMAT, 0); } + public List STRING() { return getTokens(SQLParser.STRING); } + public TerminalNode STRING(int i) { + return getToken(SQLParser.STRING, i); + } + public TableFileFormatContext(FileFormatContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTableFileFormat(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTableFileFormat(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTableFileFormat(this); + else return visitor.visitChildren(this); + } + } + public static class GenericFileFormatContext extends FileFormatContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public GenericFileFormatContext(FileFormatContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterGenericFileFormat(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitGenericFileFormat(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitGenericFileFormat(this); + else return visitor.visitChildren(this); + } + } + + public final FileFormatContext fileFormat() throws RecognitionException { + FileFormatContext _localctx = new FileFormatContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_fileFormat); + try { + setState(1500); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { + case 1: + _localctx = new TableFileFormatContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(1495); + match(INPUTFORMAT); + setState(1496); + ((TableFileFormatContext)_localctx).inFmt = match(STRING); + setState(1497); + match(OUTPUTFORMAT); + setState(1498); + ((TableFileFormatContext)_localctx).outFmt = match(STRING); + } + break; + case 2: + _localctx = new GenericFileFormatContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(1499); + identifier(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class StorageHandlerContext extends ParserRuleContext { + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode WITH() { return getToken(SQLParser.WITH, 0); } + public TerminalNode SERDEPROPERTIES() { return getToken(SQLParser.SERDEPROPERTIES, 0); } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public StorageHandlerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_storageHandler; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterStorageHandler(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitStorageHandler(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitStorageHandler(this); + else return visitor.visitChildren(this); + } + } + + public final StorageHandlerContext storageHandler() throws RecognitionException { + StorageHandlerContext _localctx = new StorageHandlerContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_storageHandler); + try { + enterOuterAlt(_localctx, 1); + { + setState(1502); + match(STRING); + setState(1506); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { + case 1: + { + setState(1503); + match(WITH); + setState(1504); + match(SERDEPROPERTIES); + setState(1505); + tablePropertyList(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ResourceContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public ResourceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_resource; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterResource(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitResource(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitResource(this); + else return visitor.visitChildren(this); + } + } + + public final ResourceContext resource() throws RecognitionException { + ResourceContext _localctx = new ResourceContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_resource); + try { + enterOuterAlt(_localctx, 1); + { + setState(1508); + identifier(); + setState(1509); + match(STRING); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DmlStatementNoWithContext extends ParserRuleContext { + public DmlStatementNoWithContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dmlStatementNoWith; } + + public DmlStatementNoWithContext() { } + public void copyFrom(DmlStatementNoWithContext ctx) { + super.copyFrom(ctx); + } + } + public static class DeleteFromTableContext extends DmlStatementNoWithContext { + public TerminalNode DELETE() { return getToken(SQLParser.DELETE, 0); } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TableAliasContext tableAlias() { + return getRuleContext(TableAliasContext.class,0); + } + public WhereClauseContext whereClause() { + return getRuleContext(WhereClauseContext.class,0); + } + public DeleteFromTableContext(DmlStatementNoWithContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDeleteFromTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDeleteFromTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDeleteFromTable(this); + else return visitor.visitChildren(this); + } + } + public static class SingleInsertQueryContext extends DmlStatementNoWithContext { + public InsertIntoContext insertInto() { + return getRuleContext(InsertIntoContext.class,0); + } + public QueryTermContext queryTerm() { + return getRuleContext(QueryTermContext.class,0); + } + public QueryOrganizationContext queryOrganization() { + return getRuleContext(QueryOrganizationContext.class,0); + } + public SingleInsertQueryContext(DmlStatementNoWithContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSingleInsertQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSingleInsertQuery(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSingleInsertQuery(this); + else return visitor.visitChildren(this); + } + } + public static class MultiInsertQueryContext extends DmlStatementNoWithContext { + public FromClauseContext fromClause() { + return getRuleContext(FromClauseContext.class,0); + } + public List multiInsertQueryBody() { + return getRuleContexts(MultiInsertQueryBodyContext.class); + } + public MultiInsertQueryBodyContext multiInsertQueryBody(int i) { + return getRuleContext(MultiInsertQueryBodyContext.class,i); + } + public MultiInsertQueryContext(DmlStatementNoWithContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterMultiInsertQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitMultiInsertQuery(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitMultiInsertQuery(this); + else return visitor.visitChildren(this); + } + } + public static class UpdateTableContext extends DmlStatementNoWithContext { + public TerminalNode UPDATE() { return getToken(SQLParser.UPDATE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TableAliasContext tableAlias() { + return getRuleContext(TableAliasContext.class,0); + } + public SetClauseContext setClause() { + return getRuleContext(SetClauseContext.class,0); + } + public WhereClauseContext whereClause() { + return getRuleContext(WhereClauseContext.class,0); + } + public UpdateTableContext(DmlStatementNoWithContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterUpdateTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitUpdateTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitUpdateTable(this); + else return visitor.visitChildren(this); + } + } + public static class MergeIntoTableContext extends DmlStatementNoWithContext { + public MultipartIdentifierContext target; + public TableAliasContext targetAlias; + public MultipartIdentifierContext source; + public QueryContext sourceQuery; + public TableAliasContext sourceAlias; + public BooleanExpressionContext mergeCondition; + public TerminalNode MERGE() { return getToken(SQLParser.MERGE, 0); } + public TerminalNode INTO() { return getToken(SQLParser.INTO, 0); } + public TerminalNode USING() { return getToken(SQLParser.USING, 0); } + public TerminalNode ON() { return getToken(SQLParser.ON, 0); } + public List multipartIdentifier() { + return getRuleContexts(MultipartIdentifierContext.class); + } + public MultipartIdentifierContext multipartIdentifier(int i) { + return getRuleContext(MultipartIdentifierContext.class,i); + } + public List tableAlias() { + return getRuleContexts(TableAliasContext.class); + } + public TableAliasContext tableAlias(int i) { + return getRuleContext(TableAliasContext.class,i); + } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public List matchedClause() { + return getRuleContexts(MatchedClauseContext.class); + } + public MatchedClauseContext matchedClause(int i) { + return getRuleContext(MatchedClauseContext.class,i); + } + public List notMatchedClause() { + return getRuleContexts(NotMatchedClauseContext.class); + } + public NotMatchedClauseContext notMatchedClause(int i) { + return getRuleContext(NotMatchedClauseContext.class,i); + } + public MergeIntoTableContext(DmlStatementNoWithContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterMergeIntoTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitMergeIntoTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitMergeIntoTable(this); + else return visitor.visitChildren(this); + } + } + + public final DmlStatementNoWithContext dmlStatementNoWith() throws RecognitionException { + DmlStatementNoWithContext _localctx = new DmlStatementNoWithContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_dmlStatementNoWith); + int _la; + try { + int _alt; + setState(1562); + _errHandler.sync(this); + switch (_input.LA(1)) { + case INSERT: + _localctx = new SingleInsertQueryContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(1511); + insertInto(); + setState(1512); + queryTerm(0); + setState(1513); + queryOrganization(); + } + break; + case FROM: + _localctx = new MultiInsertQueryContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(1515); + fromClause(); + setState(1517); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(1516); + multiInsertQueryBody(); + } + } + setState(1519); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==INSERT ); + } + break; + case DELETE: + _localctx = new DeleteFromTableContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(1521); + match(DELETE); + setState(1522); + match(FROM); + setState(1523); + multipartIdentifier(); + setState(1524); + tableAlias(); + setState(1526); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(1525); + whereClause(); + } + } + + } + break; + case UPDATE: + _localctx = new UpdateTableContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(1528); + match(UPDATE); + setState(1529); + multipartIdentifier(); + setState(1530); + tableAlias(); + setState(1531); + setClause(); + setState(1533); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(1532); + whereClause(); + } + } + + } + break; + case MERGE: + _localctx = new MergeIntoTableContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(1535); + match(MERGE); + setState(1536); + match(INTO); + setState(1537); + ((MergeIntoTableContext)_localctx).target = multipartIdentifier(); + setState(1538); + ((MergeIntoTableContext)_localctx).targetAlias = tableAlias(); + setState(1539); + match(USING); + setState(1545); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,165,_ctx) ) { + case 1: + { + setState(1540); + ((MergeIntoTableContext)_localctx).source = multipartIdentifier(); + } + break; + case 2: + { + setState(1541); + match(T__0); + setState(1542); + ((MergeIntoTableContext)_localctx).sourceQuery = query(); + setState(1543); + match(T__1); + } + break; + } + setState(1547); + ((MergeIntoTableContext)_localctx).sourceAlias = tableAlias(); + setState(1548); + match(ON); + setState(1549); + ((MergeIntoTableContext)_localctx).mergeCondition = booleanExpression(0); + setState(1553); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,166,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1550); + matchedClause(); + } + } + } + setState(1555); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,166,_ctx); + } + setState(1559); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==WHEN) { + { + { + setState(1556); + notMatchedClause(); + } + } + setState(1561); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QueryOrganizationContext extends ParserRuleContext { + public SortItemContext sortItem; + public List order = new ArrayList(); + public ExpressionContext expression; + public List clusterBy = new ArrayList(); + public List distributeBy = new ArrayList(); + public List sort = new ArrayList(); + public LimitExpressionContext limit; + public TerminalNode ORDER() { return getToken(SQLParser.ORDER, 0); } + public List BY() { return getTokens(SQLParser.BY); } + public TerminalNode BY(int i) { + return getToken(SQLParser.BY, i); + } + public TerminalNode CLUSTER() { return getToken(SQLParser.CLUSTER, 0); } + public TerminalNode DISTRIBUTE() { return getToken(SQLParser.DISTRIBUTE, 0); } + public TerminalNode SORT() { return getToken(SQLParser.SORT, 0); } + public WindowClauseContext windowClause() { + return getRuleContext(WindowClauseContext.class,0); + } + public TerminalNode LIMIT() { return getToken(SQLParser.LIMIT, 0); } + public List sortItem() { + return getRuleContexts(SortItemContext.class); + } + public SortItemContext sortItem(int i) { + return getRuleContext(SortItemContext.class,i); + } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode ALL() { return getToken(SQLParser.ALL, 0); } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public LimitExpressionContext limitExpression() { + return getRuleContext(LimitExpressionContext.class,0); + } + public QueryOrganizationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_queryOrganization; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQueryOrganization(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQueryOrganization(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQueryOrganization(this); + else return visitor.visitChildren(this); + } + } + + public final QueryOrganizationContext queryOrganization() throws RecognitionException { + QueryOrganizationContext _localctx = new QueryOrganizationContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_queryOrganization); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1574); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { + case 1: + { + setState(1564); + match(ORDER); + setState(1565); + match(BY); + setState(1566); + ((QueryOrganizationContext)_localctx).sortItem = sortItem(); + ((QueryOrganizationContext)_localctx).order.add(((QueryOrganizationContext)_localctx).sortItem); + setState(1571); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,169,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1567); + match(COMMA); + setState(1568); + ((QueryOrganizationContext)_localctx).sortItem = sortItem(); + ((QueryOrganizationContext)_localctx).order.add(((QueryOrganizationContext)_localctx).sortItem); + } + } + } + setState(1573); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,169,_ctx); + } + } + break; + } + setState(1586); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) { + case 1: + { + setState(1576); + match(CLUSTER); + setState(1577); + match(BY); + setState(1578); + ((QueryOrganizationContext)_localctx).expression = expression(); + ((QueryOrganizationContext)_localctx).clusterBy.add(((QueryOrganizationContext)_localctx).expression); + setState(1583); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,171,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1579); + match(COMMA); + setState(1580); + ((QueryOrganizationContext)_localctx).expression = expression(); + ((QueryOrganizationContext)_localctx).clusterBy.add(((QueryOrganizationContext)_localctx).expression); + } + } + } + setState(1585); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,171,_ctx); + } + } + break; + } + setState(1598); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + case 1: + { + setState(1588); + match(DISTRIBUTE); + setState(1589); + match(BY); + setState(1590); + ((QueryOrganizationContext)_localctx).expression = expression(); + ((QueryOrganizationContext)_localctx).distributeBy.add(((QueryOrganizationContext)_localctx).expression); + setState(1595); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,173,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1591); + match(COMMA); + setState(1592); + ((QueryOrganizationContext)_localctx).expression = expression(); + ((QueryOrganizationContext)_localctx).distributeBy.add(((QueryOrganizationContext)_localctx).expression); + } + } + } + setState(1597); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,173,_ctx); + } + } + break; + } + setState(1610); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { + case 1: + { + setState(1600); + match(SORT); + setState(1601); + match(BY); + setState(1602); + ((QueryOrganizationContext)_localctx).sortItem = sortItem(); + ((QueryOrganizationContext)_localctx).sort.add(((QueryOrganizationContext)_localctx).sortItem); + setState(1607); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,175,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1603); + match(COMMA); + setState(1604); + ((QueryOrganizationContext)_localctx).sortItem = sortItem(); + ((QueryOrganizationContext)_localctx).sort.add(((QueryOrganizationContext)_localctx).sortItem); + } + } + } + setState(1609); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,175,_ctx); + } + } + break; + } + setState(1613); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) { + case 1: + { + setState(1612); + windowClause(); + } + break; + } + setState(1620); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { + case 1: + { + setState(1615); + match(LIMIT); + setState(1618); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { + case 1: + { + setState(1616); + match(ALL); + } + break; + case 2: + { + setState(1617); + ((QueryOrganizationContext)_localctx).limit = limitExpression(); + } + break; + } + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MultiInsertQueryBodyContext extends ParserRuleContext { + public InsertIntoContext insertInto() { + return getRuleContext(InsertIntoContext.class,0); + } + public FromStatementBodyContext fromStatementBody() { + return getRuleContext(FromStatementBodyContext.class,0); + } + public MultiInsertQueryBodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiInsertQueryBody; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterMultiInsertQueryBody(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitMultiInsertQueryBody(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitMultiInsertQueryBody(this); + else return visitor.visitChildren(this); + } + } + + public final MultiInsertQueryBodyContext multiInsertQueryBody() throws RecognitionException { + MultiInsertQueryBodyContext _localctx = new MultiInsertQueryBodyContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_multiInsertQueryBody); + try { + enterOuterAlt(_localctx, 1); + { + setState(1622); + insertInto(); + setState(1623); + fromStatementBody(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QueryTermContext extends ParserRuleContext { + public QueryTermContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_queryTerm; } + + public QueryTermContext() { } + public void copyFrom(QueryTermContext ctx) { + super.copyFrom(ctx); + } + } + public static class QueryTermDefaultContext extends QueryTermContext { + public QueryPrimaryContext queryPrimary() { + return getRuleContext(QueryPrimaryContext.class,0); + } + public QueryTermDefaultContext(QueryTermContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQueryTermDefault(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQueryTermDefault(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQueryTermDefault(this); + else return visitor.visitChildren(this); + } + } + public static class SetOperationContext extends QueryTermContext { + public QueryTermContext left; + public Token operator; + public QueryTermContext right; + public List queryTerm() { + return getRuleContexts(QueryTermContext.class); + } + public QueryTermContext queryTerm(int i) { + return getRuleContext(QueryTermContext.class,i); + } + public TerminalNode INTERSECT() { return getToken(SQLParser.INTERSECT, 0); } + public TerminalNode UNION() { return getToken(SQLParser.UNION, 0); } + public TerminalNode EXCEPT() { return getToken(SQLParser.EXCEPT, 0); } + public TerminalNode SETMINUS() { return getToken(SQLParser.SETMINUS, 0); } + public SetQuantifierContext setQuantifier() { + return getRuleContext(SetQuantifierContext.class,0); + } + public SetOperationContext(QueryTermContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetOperation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetOperation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetOperation(this); + else return visitor.visitChildren(this); + } + } + + public final QueryTermContext queryTerm() throws RecognitionException { + return queryTerm(0); + } + + private QueryTermContext queryTerm(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + QueryTermContext _localctx = new QueryTermContext(_ctx, _parentState); + QueryTermContext _prevctx = _localctx; + int _startState = 84; + enterRecursionRule(_localctx, 84, RULE_queryTerm, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + { + _localctx = new QueryTermDefaultContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(1626); + queryPrimary(); + } + _ctx.stop = _input.LT(-1); + setState(1651); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,184,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(1649); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,183,_ctx) ) { + case 1: + { + _localctx = new SetOperationContext(new QueryTermContext(_parentctx, _parentState)); + ((SetOperationContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_queryTerm); + setState(1628); + if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); + setState(1629); + if (!(legacy_setops_precedence_enabled)) throw new FailedPredicateException(this, "legacy_setops_precedence_enabled"); + setState(1630); + ((SetOperationContext)_localctx).operator = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==EXCEPT || _la==INTERSECT || _la==SETMINUS || _la==UNION) ) { + ((SetOperationContext)_localctx).operator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1632); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ALL || _la==DISTINCT) { + { + setState(1631); + setQuantifier(); + } + } + + setState(1634); + ((SetOperationContext)_localctx).right = queryTerm(4); + } + break; + case 2: + { + _localctx = new SetOperationContext(new QueryTermContext(_parentctx, _parentState)); + ((SetOperationContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_queryTerm); + setState(1635); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(1636); + if (!(!legacy_setops_precedence_enabled)) throw new FailedPredicateException(this, "!legacy_setops_precedence_enabled"); + setState(1637); + ((SetOperationContext)_localctx).operator = match(INTERSECT); + setState(1639); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ALL || _la==DISTINCT) { + { + setState(1638); + setQuantifier(); + } + } + + setState(1641); + ((SetOperationContext)_localctx).right = queryTerm(3); + } + break; + case 3: + { + _localctx = new SetOperationContext(new QueryTermContext(_parentctx, _parentState)); + ((SetOperationContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_queryTerm); + setState(1642); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(1643); + if (!(!legacy_setops_precedence_enabled)) throw new FailedPredicateException(this, "!legacy_setops_precedence_enabled"); + setState(1644); + ((SetOperationContext)_localctx).operator = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==EXCEPT || _la==SETMINUS || _la==UNION) ) { + ((SetOperationContext)_localctx).operator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1646); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ALL || _la==DISTINCT) { + { + setState(1645); + setQuantifier(); + } + } + + setState(1648); + ((SetOperationContext)_localctx).right = queryTerm(2); + } + break; + } + } + } + setState(1653); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,184,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + public static class QueryPrimaryContext extends ParserRuleContext { + public QueryPrimaryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_queryPrimary; } + + public QueryPrimaryContext() { } + public void copyFrom(QueryPrimaryContext ctx) { + super.copyFrom(ctx); + } + } + public static class SubqueryContext extends QueryPrimaryContext { + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public SubqueryContext(QueryPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSubquery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSubquery(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSubquery(this); + else return visitor.visitChildren(this); + } + } + public static class QueryPrimaryDefaultContext extends QueryPrimaryContext { + public QuerySpecificationContext querySpecification() { + return getRuleContext(QuerySpecificationContext.class,0); + } + public QueryPrimaryDefaultContext(QueryPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQueryPrimaryDefault(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQueryPrimaryDefault(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQueryPrimaryDefault(this); + else return visitor.visitChildren(this); + } + } + public static class InlineTableDefault1Context extends QueryPrimaryContext { + public InlineTableContext inlineTable() { + return getRuleContext(InlineTableContext.class,0); + } + public InlineTableDefault1Context(QueryPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterInlineTableDefault1(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitInlineTableDefault1(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitInlineTableDefault1(this); + else return visitor.visitChildren(this); + } + } + public static class FromStmtContext extends QueryPrimaryContext { + public FromStatementContext fromStatement() { + return getRuleContext(FromStatementContext.class,0); + } + public FromStmtContext(QueryPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFromStmt(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFromStmt(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFromStmt(this); + else return visitor.visitChildren(this); + } + } + public static class TableContext extends QueryPrimaryContext { + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TableContext(QueryPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTable(this); + else return visitor.visitChildren(this); + } + } + + public final QueryPrimaryContext queryPrimary() throws RecognitionException { + QueryPrimaryContext _localctx = new QueryPrimaryContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_queryPrimary); + try { + setState(1663); + _errHandler.sync(this); + switch (_input.LA(1)) { + case MAP: + case REDUCE: + case SELECT: + _localctx = new QueryPrimaryDefaultContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(1654); + querySpecification(); + } + break; + case FROM: + _localctx = new FromStmtContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(1655); + fromStatement(); + } + break; + case TABLE: + _localctx = new TableContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(1656); + match(TABLE); + setState(1657); + multipartIdentifier(); + } + break; + case VALUES: + _localctx = new InlineTableDefault1Context(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(1658); + inlineTable(); + } + break; + case T__0: + _localctx = new SubqueryContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(1659); + match(T__0); + setState(1660); + query(); + setState(1661); + match(T__1); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SortItemContext extends ParserRuleContext { + public Token ordering; + public Token nullOrder; + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode NULLS() { return getToken(SQLParser.NULLS, 0); } + public TerminalNode ASC() { return getToken(SQLParser.ASC, 0); } + public TerminalNode DESC() { return getToken(SQLParser.DESC, 0); } + public TerminalNode LAST() { return getToken(SQLParser.LAST, 0); } + public TerminalNode FIRST() { return getToken(SQLParser.FIRST, 0); } + public SortItemContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sortItem; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSortItem(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSortItem(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSortItem(this); + else return visitor.visitChildren(this); + } + } + + public final SortItemContext sortItem() throws RecognitionException { + SortItemContext _localctx = new SortItemContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_sortItem); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1665); + expression(); + setState(1667); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { + case 1: + { + setState(1666); + ((SortItemContext)_localctx).ordering = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ASC || _la==DESC) ) { + ((SortItemContext)_localctx).ordering = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + setState(1671); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { + case 1: + { + setState(1669); + match(NULLS); + setState(1670); + ((SortItemContext)_localctx).nullOrder = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==FIRST || _la==LAST) ) { + ((SortItemContext)_localctx).nullOrder = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FromStatementContext extends ParserRuleContext { + public FromClauseContext fromClause() { + return getRuleContext(FromClauseContext.class,0); + } + public List fromStatementBody() { + return getRuleContexts(FromStatementBodyContext.class); + } + public FromStatementBodyContext fromStatementBody(int i) { + return getRuleContext(FromStatementBodyContext.class,i); + } + public FromStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fromStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFromStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFromStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFromStatement(this); + else return visitor.visitChildren(this); + } + } + + public final FromStatementContext fromStatement() throws RecognitionException { + FromStatementContext _localctx = new FromStatementContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_fromStatement); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1673); + fromClause(); + setState(1675); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(1674); + fromStatementBody(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(1677); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,188,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FromStatementBodyContext extends ParserRuleContext { + public TransformClauseContext transformClause() { + return getRuleContext(TransformClauseContext.class,0); + } + public QueryOrganizationContext queryOrganization() { + return getRuleContext(QueryOrganizationContext.class,0); + } + public WhereClauseContext whereClause() { + return getRuleContext(WhereClauseContext.class,0); + } + public SelectClauseContext selectClause() { + return getRuleContext(SelectClauseContext.class,0); + } + public List lateralView() { + return getRuleContexts(LateralViewContext.class); + } + public LateralViewContext lateralView(int i) { + return getRuleContext(LateralViewContext.class,i); + } + public AggregationClauseContext aggregationClause() { + return getRuleContext(AggregationClauseContext.class,0); + } + public HavingClauseContext havingClause() { + return getRuleContext(HavingClauseContext.class,0); + } + public WindowClauseContext windowClause() { + return getRuleContext(WindowClauseContext.class,0); + } + public FromStatementBodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fromStatementBody; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFromStatementBody(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFromStatementBody(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFromStatementBody(this); + else return visitor.visitChildren(this); + } + } + + public final FromStatementBodyContext fromStatementBody() throws RecognitionException { + FromStatementBodyContext _localctx = new FromStatementBodyContext(_ctx, getState()); + enterRule(_localctx, 92, RULE_fromStatementBody); + try { + int _alt; + setState(1706); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1679); + transformClause(); + setState(1681); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,189,_ctx) ) { + case 1: + { + setState(1680); + whereClause(); + } + break; + } + setState(1683); + queryOrganization(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1685); + selectClause(); + setState(1689); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,190,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1686); + lateralView(); + } + } + } + setState(1691); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,190,_ctx); + } + setState(1693); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { + case 1: + { + setState(1692); + whereClause(); + } + break; + } + setState(1696); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { + case 1: + { + setState(1695); + aggregationClause(); + } + break; + } + setState(1699); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,193,_ctx) ) { + case 1: + { + setState(1698); + havingClause(); + } + break; + } + setState(1702); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,194,_ctx) ) { + case 1: + { + setState(1701); + windowClause(); + } + break; + } + setState(1704); + queryOrganization(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QuerySpecificationContext extends ParserRuleContext { + public QuerySpecificationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_querySpecification; } + + public QuerySpecificationContext() { } + public void copyFrom(QuerySpecificationContext ctx) { + super.copyFrom(ctx); + } + } + public static class RegularQuerySpecificationContext extends QuerySpecificationContext { + public SelectClauseContext selectClause() { + return getRuleContext(SelectClauseContext.class,0); + } + public FromClauseContext fromClause() { + return getRuleContext(FromClauseContext.class,0); + } + public List lateralView() { + return getRuleContexts(LateralViewContext.class); + } + public LateralViewContext lateralView(int i) { + return getRuleContext(LateralViewContext.class,i); + } + public WhereClauseContext whereClause() { + return getRuleContext(WhereClauseContext.class,0); + } + public AggregationClauseContext aggregationClause() { + return getRuleContext(AggregationClauseContext.class,0); + } + public HavingClauseContext havingClause() { + return getRuleContext(HavingClauseContext.class,0); + } + public WindowClauseContext windowClause() { + return getRuleContext(WindowClauseContext.class,0); + } + public RegularQuerySpecificationContext(QuerySpecificationContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRegularQuerySpecification(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRegularQuerySpecification(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRegularQuerySpecification(this); + else return visitor.visitChildren(this); + } + } + public static class TransformQuerySpecificationContext extends QuerySpecificationContext { + public TransformClauseContext transformClause() { + return getRuleContext(TransformClauseContext.class,0); + } + public FromClauseContext fromClause() { + return getRuleContext(FromClauseContext.class,0); + } + public List lateralView() { + return getRuleContexts(LateralViewContext.class); + } + public LateralViewContext lateralView(int i) { + return getRuleContext(LateralViewContext.class,i); + } + public WhereClauseContext whereClause() { + return getRuleContext(WhereClauseContext.class,0); + } + public AggregationClauseContext aggregationClause() { + return getRuleContext(AggregationClauseContext.class,0); + } + public HavingClauseContext havingClause() { + return getRuleContext(HavingClauseContext.class,0); + } + public WindowClauseContext windowClause() { + return getRuleContext(WindowClauseContext.class,0); + } + public TransformQuerySpecificationContext(QuerySpecificationContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTransformQuerySpecification(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTransformQuerySpecification(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTransformQuerySpecification(this); + else return visitor.visitChildren(this); + } + } + + public final QuerySpecificationContext querySpecification() throws RecognitionException { + QuerySpecificationContext _localctx = new QuerySpecificationContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_querySpecification); + try { + int _alt; + setState(1752); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,208,_ctx) ) { + case 1: + _localctx = new TransformQuerySpecificationContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(1708); + transformClause(); + setState(1710); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) { + case 1: + { + setState(1709); + fromClause(); + } + break; + } + setState(1715); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,197,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1712); + lateralView(); + } + } + } + setState(1717); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,197,_ctx); + } + setState(1719); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,198,_ctx) ) { + case 1: + { + setState(1718); + whereClause(); + } + break; + } + setState(1722); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,199,_ctx) ) { + case 1: + { + setState(1721); + aggregationClause(); + } + break; + } + setState(1725); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,200,_ctx) ) { + case 1: + { + setState(1724); + havingClause(); + } + break; + } + setState(1728); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,201,_ctx) ) { + case 1: + { + setState(1727); + windowClause(); + } + break; + } + } + break; + case 2: + _localctx = new RegularQuerySpecificationContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(1730); + selectClause(); + setState(1732); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,202,_ctx) ) { + case 1: + { + setState(1731); + fromClause(); + } + break; + } + setState(1737); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,203,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1734); + lateralView(); + } + } + } + setState(1739); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,203,_ctx); + } + setState(1741); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,204,_ctx) ) { + case 1: + { + setState(1740); + whereClause(); + } + break; + } + setState(1744); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,205,_ctx) ) { + case 1: + { + setState(1743); + aggregationClause(); + } + break; + } + setState(1747); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,206,_ctx) ) { + case 1: + { + setState(1746); + havingClause(); + } + break; + } + setState(1750); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,207,_ctx) ) { + case 1: + { + setState(1749); + windowClause(); + } + break; + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TransformClauseContext extends ParserRuleContext { + public Token kind; + public RowFormatContext inRowFormat; + public Token recordWriter; + public Token script; + public RowFormatContext outRowFormat; + public Token recordReader; + public TerminalNode USING() { return getToken(SQLParser.USING, 0); } + public List STRING() { return getTokens(SQLParser.STRING); } + public TerminalNode STRING(int i) { + return getToken(SQLParser.STRING, i); + } + public TerminalNode SELECT() { return getToken(SQLParser.SELECT, 0); } + public ExpressionSeqContext expressionSeq() { + return getRuleContext(ExpressionSeqContext.class,0); + } + public TerminalNode TRANSFORM() { return getToken(SQLParser.TRANSFORM, 0); } + public TerminalNode MAP() { return getToken(SQLParser.MAP, 0); } + public TerminalNode REDUCE() { return getToken(SQLParser.REDUCE, 0); } + public TerminalNode RECORDWRITER() { return getToken(SQLParser.RECORDWRITER, 0); } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public TerminalNode RECORDREADER() { return getToken(SQLParser.RECORDREADER, 0); } + public List rowFormat() { + return getRuleContexts(RowFormatContext.class); + } + public RowFormatContext rowFormat(int i) { + return getRuleContext(RowFormatContext.class,i); + } + public SetQuantifierContext setQuantifier() { + return getRuleContext(SetQuantifierContext.class,0); + } + public IdentifierSeqContext identifierSeq() { + return getRuleContext(IdentifierSeqContext.class,0); + } + public ColTypeListContext colTypeList() { + return getRuleContext(ColTypeListContext.class,0); + } + public TransformClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_transformClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTransformClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTransformClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTransformClause(this); + else return visitor.visitChildren(this); + } + } + + public final TransformClauseContext transformClause() throws RecognitionException { + TransformClauseContext _localctx = new TransformClauseContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_transformClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1773); + _errHandler.sync(this); + switch (_input.LA(1)) { + case SELECT: + { + setState(1754); + match(SELECT); + setState(1755); + ((TransformClauseContext)_localctx).kind = match(TRANSFORM); + setState(1756); + match(T__0); + setState(1758); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,209,_ctx) ) { + case 1: + { + setState(1757); + setQuantifier(); + } + break; + } + setState(1760); + expressionSeq(); + setState(1761); + match(T__1); + } + break; + case MAP: + { + setState(1763); + ((TransformClauseContext)_localctx).kind = match(MAP); + setState(1765); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,210,_ctx) ) { + case 1: + { + setState(1764); + setQuantifier(); + } + break; + } + setState(1767); + expressionSeq(); + } + break; + case REDUCE: + { + setState(1768); + ((TransformClauseContext)_localctx).kind = match(REDUCE); + setState(1770); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,211,_ctx) ) { + case 1: + { + setState(1769); + setQuantifier(); + } + break; + } + setState(1772); + expressionSeq(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(1776); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ROW) { + { + setState(1775); + ((TransformClauseContext)_localctx).inRowFormat = rowFormat(); + } + } + + setState(1780); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==RECORDWRITER) { + { + setState(1778); + match(RECORDWRITER); + setState(1779); + ((TransformClauseContext)_localctx).recordWriter = match(STRING); + } + } + + setState(1782); + match(USING); + setState(1783); + ((TransformClauseContext)_localctx).script = match(STRING); + setState(1796); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,217,_ctx) ) { + case 1: + { + setState(1784); + match(AS); + setState(1794); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,216,_ctx) ) { + case 1: + { + setState(1785); + identifierSeq(); + } + break; + case 2: + { + setState(1786); + colTypeList(); + } + break; + case 3: + { + { + setState(1787); + match(T__0); + setState(1790); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,215,_ctx) ) { + case 1: + { + setState(1788); + identifierSeq(); + } + break; + case 2: + { + setState(1789); + colTypeList(); + } + break; + } + setState(1792); + match(T__1); + } + } + break; + } + } + break; + } + setState(1799); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,218,_ctx) ) { + case 1: + { + setState(1798); + ((TransformClauseContext)_localctx).outRowFormat = rowFormat(); + } + break; + } + setState(1803); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,219,_ctx) ) { + case 1: + { + setState(1801); + match(RECORDREADER); + setState(1802); + ((TransformClauseContext)_localctx).recordReader = match(STRING); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SelectClauseContext extends ParserRuleContext { + public HintContext hint; + public List hints = new ArrayList(); + public TerminalNode SELECT() { return getToken(SQLParser.SELECT, 0); } + public NamedExpressionSeqContext namedExpressionSeq() { + return getRuleContext(NamedExpressionSeqContext.class,0); + } + public SetQuantifierContext setQuantifier() { + return getRuleContext(SetQuantifierContext.class,0); + } + public List hint() { + return getRuleContexts(HintContext.class); + } + public HintContext hint(int i) { + return getRuleContext(HintContext.class,i); + } + public SelectClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_selectClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSelectClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSelectClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSelectClause(this); + else return visitor.visitChildren(this); + } + } + + public final SelectClauseContext selectClause() throws RecognitionException { + SelectClauseContext _localctx = new SelectClauseContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_selectClause); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1805); + match(SELECT); + setState(1809); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,220,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1806); + ((SelectClauseContext)_localctx).hint = hint(); + ((SelectClauseContext)_localctx).hints.add(((SelectClauseContext)_localctx).hint); + } + } + } + setState(1811); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,220,_ctx); + } + setState(1813); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,221,_ctx) ) { + case 1: + { + setState(1812); + setQuantifier(); + } + break; + } + setState(1815); + namedExpressionSeq(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SetClauseContext extends ParserRuleContext { + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public AssignmentListContext assignmentList() { + return getRuleContext(AssignmentListContext.class,0); + } + public SetClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_setClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetClause(this); + else return visitor.visitChildren(this); + } + } + + public final SetClauseContext setClause() throws RecognitionException { + SetClauseContext _localctx = new SetClauseContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_setClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(1817); + match(SET); + setState(1818); + assignmentList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MatchedClauseContext extends ParserRuleContext { + public BooleanExpressionContext matchedCond; + public TerminalNode WHEN() { return getToken(SQLParser.WHEN, 0); } + public TerminalNode MATCHED() { return getToken(SQLParser.MATCHED, 0); } + public TerminalNode THEN() { return getToken(SQLParser.THEN, 0); } + public MatchedActionContext matchedAction() { + return getRuleContext(MatchedActionContext.class,0); + } + public TerminalNode AND() { return getToken(SQLParser.AND, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public MatchedClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchedClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterMatchedClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitMatchedClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitMatchedClause(this); + else return visitor.visitChildren(this); + } + } + + public final MatchedClauseContext matchedClause() throws RecognitionException { + MatchedClauseContext _localctx = new MatchedClauseContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_matchedClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1820); + match(WHEN); + setState(1821); + match(MATCHED); + setState(1824); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AND) { + { + setState(1822); + match(AND); + setState(1823); + ((MatchedClauseContext)_localctx).matchedCond = booleanExpression(0); + } + } + + setState(1826); + match(THEN); + setState(1827); + matchedAction(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NotMatchedClauseContext extends ParserRuleContext { + public BooleanExpressionContext notMatchedCond; + public TerminalNode WHEN() { return getToken(SQLParser.WHEN, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode MATCHED() { return getToken(SQLParser.MATCHED, 0); } + public TerminalNode THEN() { return getToken(SQLParser.THEN, 0); } + public NotMatchedActionContext notMatchedAction() { + return getRuleContext(NotMatchedActionContext.class,0); + } + public TerminalNode AND() { return getToken(SQLParser.AND, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public NotMatchedClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_notMatchedClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNotMatchedClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNotMatchedClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNotMatchedClause(this); + else return visitor.visitChildren(this); + } + } + + public final NotMatchedClauseContext notMatchedClause() throws RecognitionException { + NotMatchedClauseContext _localctx = new NotMatchedClauseContext(_ctx, getState()); + enterRule(_localctx, 104, RULE_notMatchedClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1829); + match(WHEN); + setState(1830); + match(NOT); + setState(1831); + match(MATCHED); + setState(1834); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AND) { + { + setState(1832); + match(AND); + setState(1833); + ((NotMatchedClauseContext)_localctx).notMatchedCond = booleanExpression(0); + } + } + + setState(1836); + match(THEN); + setState(1837); + notMatchedAction(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MatchedActionContext extends ParserRuleContext { + public TerminalNode DELETE() { return getToken(SQLParser.DELETE, 0); } + public TerminalNode UPDATE() { return getToken(SQLParser.UPDATE, 0); } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode ASTERISK() { return getToken(SQLParser.ASTERISK, 0); } + public AssignmentListContext assignmentList() { + return getRuleContext(AssignmentListContext.class,0); + } + public MatchedActionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchedAction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterMatchedAction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitMatchedAction(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitMatchedAction(this); + else return visitor.visitChildren(this); + } + } + + public final MatchedActionContext matchedAction() throws RecognitionException { + MatchedActionContext _localctx = new MatchedActionContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_matchedAction); + try { + setState(1846); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,224,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1839); + match(DELETE); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1840); + match(UPDATE); + setState(1841); + match(SET); + setState(1842); + match(ASTERISK); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1843); + match(UPDATE); + setState(1844); + match(SET); + setState(1845); + assignmentList(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NotMatchedActionContext extends ParserRuleContext { + public MultipartIdentifierListContext columns; + public TerminalNode INSERT() { return getToken(SQLParser.INSERT, 0); } + public TerminalNode ASTERISK() { return getToken(SQLParser.ASTERISK, 0); } + public TerminalNode VALUES() { return getToken(SQLParser.VALUES, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public MultipartIdentifierListContext multipartIdentifierList() { + return getRuleContext(MultipartIdentifierListContext.class,0); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public NotMatchedActionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_notMatchedAction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNotMatchedAction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNotMatchedAction(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNotMatchedAction(this); + else return visitor.visitChildren(this); + } + } + + public final NotMatchedActionContext notMatchedAction() throws RecognitionException { + NotMatchedActionContext _localctx = new NotMatchedActionContext(_ctx, getState()); + enterRule(_localctx, 108, RULE_notMatchedAction); + int _la; + try { + setState(1866); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,226,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1848); + match(INSERT); + setState(1849); + match(ASTERISK); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1850); + match(INSERT); + setState(1851); + match(T__0); + setState(1852); + ((NotMatchedActionContext)_localctx).columns = multipartIdentifierList(); + setState(1853); + match(T__1); + setState(1854); + match(VALUES); + setState(1855); + match(T__0); + setState(1856); + expression(); + setState(1861); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1857); + match(COMMA); + setState(1858); + expression(); + } + } + setState(1863); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1864); + match(T__1); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AssignmentListContext extends ParserRuleContext { + public List assignment() { + return getRuleContexts(AssignmentContext.class); + } + public AssignmentContext assignment(int i) { + return getRuleContext(AssignmentContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public AssignmentListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assignmentList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAssignmentList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAssignmentList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAssignmentList(this); + else return visitor.visitChildren(this); + } + } + + public final AssignmentListContext assignmentList() throws RecognitionException { + AssignmentListContext _localctx = new AssignmentListContext(_ctx, getState()); + enterRule(_localctx, 110, RULE_assignmentList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1868); + assignment(); + setState(1873); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1869); + match(COMMA); + setState(1870); + assignment(); + } + } + setState(1875); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AssignmentContext extends ParserRuleContext { + public MultipartIdentifierContext key; + public ExpressionContext value; + public TerminalNode EQ() { return getToken(SQLParser.EQ, 0); } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public AssignmentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assignment; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAssignment(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAssignment(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAssignment(this); + else return visitor.visitChildren(this); + } + } + + public final AssignmentContext assignment() throws RecognitionException { + AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); + enterRule(_localctx, 112, RULE_assignment); + try { + enterOuterAlt(_localctx, 1); + { + setState(1876); + ((AssignmentContext)_localctx).key = multipartIdentifier(); + setState(1877); + match(EQ); + setState(1878); + ((AssignmentContext)_localctx).value = expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class WhereClauseContext extends ParserRuleContext { + public TerminalNode WHERE() { return getToken(SQLParser.WHERE, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public WhereClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_whereClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterWhereClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitWhereClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitWhereClause(this); + else return visitor.visitChildren(this); + } + } + + public final WhereClauseContext whereClause() throws RecognitionException { + WhereClauseContext _localctx = new WhereClauseContext(_ctx, getState()); + enterRule(_localctx, 114, RULE_whereClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(1880); + match(WHERE); + setState(1881); + booleanExpression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class HavingClauseContext extends ParserRuleContext { + public TerminalNode HAVING() { return getToken(SQLParser.HAVING, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public HavingClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_havingClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterHavingClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitHavingClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitHavingClause(this); + else return visitor.visitChildren(this); + } + } + + public final HavingClauseContext havingClause() throws RecognitionException { + HavingClauseContext _localctx = new HavingClauseContext(_ctx, getState()); + enterRule(_localctx, 116, RULE_havingClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(1883); + match(HAVING); + setState(1884); + booleanExpression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class HintContext extends ParserRuleContext { + public HintStatementContext hintStatement; + public List hintStatements = new ArrayList(); + public List hintStatement() { + return getRuleContexts(HintStatementContext.class); + } + public HintStatementContext hintStatement(int i) { + return getRuleContext(HintStatementContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public HintContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_hint; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterHint(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitHint(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitHint(this); + else return visitor.visitChildren(this); + } + } + + public final HintContext hint() throws RecognitionException { + HintContext _localctx = new HintContext(_ctx, getState()); + enterRule(_localctx, 118, RULE_hint); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1886); + match(T__2); + setState(1887); + ((HintContext)_localctx).hintStatement = hintStatement(); + ((HintContext)_localctx).hintStatements.add(((HintContext)_localctx).hintStatement); + setState(1894); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,229,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1889); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,228,_ctx) ) { + case 1: + { + setState(1888); + match(COMMA); + } + break; + } + setState(1891); + ((HintContext)_localctx).hintStatement = hintStatement(); + ((HintContext)_localctx).hintStatements.add(((HintContext)_localctx).hintStatement); + } + } + } + setState(1896); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,229,_ctx); + } + setState(1897); + match(T__3); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class HintStatementContext extends ParserRuleContext { + public IdentifierContext hintName; + public PrimaryExpressionContext primaryExpression; + public List parameters = new ArrayList(); + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public List primaryExpression() { + return getRuleContexts(PrimaryExpressionContext.class); + } + public PrimaryExpressionContext primaryExpression(int i) { + return getRuleContext(PrimaryExpressionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public HintStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_hintStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterHintStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitHintStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitHintStatement(this); + else return visitor.visitChildren(this); + } + } + + public final HintStatementContext hintStatement() throws RecognitionException { + HintStatementContext _localctx = new HintStatementContext(_ctx, getState()); + enterRule(_localctx, 120, RULE_hintStatement); + int _la; + try { + setState(1912); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,231,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1899); + ((HintStatementContext)_localctx).hintName = identifier(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1900); + ((HintStatementContext)_localctx).hintName = identifier(); + setState(1901); + match(T__0); + setState(1902); + ((HintStatementContext)_localctx).primaryExpression = primaryExpression(0); + ((HintStatementContext)_localctx).parameters.add(((HintStatementContext)_localctx).primaryExpression); + setState(1907); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1903); + match(COMMA); + setState(1904); + ((HintStatementContext)_localctx).primaryExpression = primaryExpression(0); + ((HintStatementContext)_localctx).parameters.add(((HintStatementContext)_localctx).primaryExpression); + } + } + setState(1909); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1910); + match(T__1); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FromClauseContext extends ParserRuleContext { + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public List relation() { + return getRuleContexts(RelationContext.class); + } + public RelationContext relation(int i) { + return getRuleContext(RelationContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public List lateralView() { + return getRuleContexts(LateralViewContext.class); + } + public LateralViewContext lateralView(int i) { + return getRuleContext(LateralViewContext.class,i); + } + public PivotClauseContext pivotClause() { + return getRuleContext(PivotClauseContext.class,0); + } + public FromClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fromClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFromClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFromClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFromClause(this); + else return visitor.visitChildren(this); + } + } + + public final FromClauseContext fromClause() throws RecognitionException { + FromClauseContext _localctx = new FromClauseContext(_ctx, getState()); + enterRule(_localctx, 122, RULE_fromClause); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1914); + match(FROM); + setState(1915); + relation(); + setState(1920); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,232,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1916); + match(COMMA); + setState(1917); + relation(); + } + } + } + setState(1922); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,232,_ctx); + } + setState(1926); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,233,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1923); + lateralView(); + } + } + } + setState(1928); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,233,_ctx); + } + setState(1930); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,234,_ctx) ) { + case 1: + { + setState(1929); + pivotClause(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AggregationClauseContext extends ParserRuleContext { + public GroupByClauseContext groupByClause; + public List groupingExpressionsWithGroupingAnalytics = new ArrayList(); + public ExpressionContext expression; + public List groupingExpressions = new ArrayList(); + public Token kind; + public TerminalNode GROUP() { return getToken(SQLParser.GROUP, 0); } + public TerminalNode BY() { return getToken(SQLParser.BY, 0); } + public List groupByClause() { + return getRuleContexts(GroupByClauseContext.class); + } + public GroupByClauseContext groupByClause(int i) { + return getRuleContext(GroupByClauseContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode WITH() { return getToken(SQLParser.WITH, 0); } + public TerminalNode SETS() { return getToken(SQLParser.SETS, 0); } + public List groupingSet() { + return getRuleContexts(GroupingSetContext.class); + } + public GroupingSetContext groupingSet(int i) { + return getRuleContext(GroupingSetContext.class,i); + } + public TerminalNode ROLLUP() { return getToken(SQLParser.ROLLUP, 0); } + public TerminalNode CUBE() { return getToken(SQLParser.CUBE, 0); } + public TerminalNode GROUPING() { return getToken(SQLParser.GROUPING, 0); } + public AggregationClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_aggregationClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAggregationClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAggregationClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAggregationClause(this); + else return visitor.visitChildren(this); + } + } + + public final AggregationClauseContext aggregationClause() throws RecognitionException { + AggregationClauseContext _localctx = new AggregationClauseContext(_ctx, getState()); + enterRule(_localctx, 124, RULE_aggregationClause); + int _la; + try { + int _alt; + setState(1971); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,239,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1932); + match(GROUP); + setState(1933); + match(BY); + setState(1934); + ((AggregationClauseContext)_localctx).groupByClause = groupByClause(); + ((AggregationClauseContext)_localctx).groupingExpressionsWithGroupingAnalytics.add(((AggregationClauseContext)_localctx).groupByClause); + setState(1939); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,235,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1935); + match(COMMA); + setState(1936); + ((AggregationClauseContext)_localctx).groupByClause = groupByClause(); + ((AggregationClauseContext)_localctx).groupingExpressionsWithGroupingAnalytics.add(((AggregationClauseContext)_localctx).groupByClause); + } + } + } + setState(1941); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,235,_ctx); + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1942); + match(GROUP); + setState(1943); + match(BY); + setState(1944); + ((AggregationClauseContext)_localctx).expression = expression(); + ((AggregationClauseContext)_localctx).groupingExpressions.add(((AggregationClauseContext)_localctx).expression); + setState(1949); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,236,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1945); + match(COMMA); + setState(1946); + ((AggregationClauseContext)_localctx).expression = expression(); + ((AggregationClauseContext)_localctx).groupingExpressions.add(((AggregationClauseContext)_localctx).expression); + } + } + } + setState(1951); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,236,_ctx); + } + setState(1969); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,238,_ctx) ) { + case 1: + { + setState(1952); + match(WITH); + setState(1953); + ((AggregationClauseContext)_localctx).kind = match(ROLLUP); + } + break; + case 2: + { + setState(1954); + match(WITH); + setState(1955); + ((AggregationClauseContext)_localctx).kind = match(CUBE); + } + break; + case 3: + { + setState(1956); + ((AggregationClauseContext)_localctx).kind = match(GROUPING); + setState(1957); + match(SETS); + setState(1958); + match(T__0); + setState(1959); + groupingSet(); + setState(1964); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1960); + match(COMMA); + setState(1961); + groupingSet(); + } + } + setState(1966); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1967); + match(T__1); + } + break; + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class GroupByClauseContext extends ParserRuleContext { + public GroupingAnalyticsContext groupingAnalytics() { + return getRuleContext(GroupingAnalyticsContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GroupByClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_groupByClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterGroupByClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitGroupByClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitGroupByClause(this); + else return visitor.visitChildren(this); + } + } + + public final GroupByClauseContext groupByClause() throws RecognitionException { + GroupByClauseContext _localctx = new GroupByClauseContext(_ctx, getState()); + enterRule(_localctx, 126, RULE_groupByClause); + try { + setState(1975); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,240,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1973); + groupingAnalytics(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1974); + expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class GroupingAnalyticsContext extends ParserRuleContext { + public List groupingSet() { + return getRuleContexts(GroupingSetContext.class); + } + public GroupingSetContext groupingSet(int i) { + return getRuleContext(GroupingSetContext.class,i); + } + public TerminalNode ROLLUP() { return getToken(SQLParser.ROLLUP, 0); } + public TerminalNode CUBE() { return getToken(SQLParser.CUBE, 0); } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public TerminalNode GROUPING() { return getToken(SQLParser.GROUPING, 0); } + public TerminalNode SETS() { return getToken(SQLParser.SETS, 0); } + public List groupingElement() { + return getRuleContexts(GroupingElementContext.class); + } + public GroupingElementContext groupingElement(int i) { + return getRuleContext(GroupingElementContext.class,i); + } + public GroupingAnalyticsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_groupingAnalytics; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterGroupingAnalytics(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitGroupingAnalytics(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitGroupingAnalytics(this); + else return visitor.visitChildren(this); + } + } + + public final GroupingAnalyticsContext groupingAnalytics() throws RecognitionException { + GroupingAnalyticsContext _localctx = new GroupingAnalyticsContext(_ctx, getState()); + enterRule(_localctx, 128, RULE_groupingAnalytics); + int _la; + try { + setState(2002); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CUBE: + case ROLLUP: + enterOuterAlt(_localctx, 1); + { + setState(1977); + _la = _input.LA(1); + if ( !(_la==CUBE || _la==ROLLUP) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1978); + match(T__0); + setState(1979); + groupingSet(); + setState(1984); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1980); + match(COMMA); + setState(1981); + groupingSet(); + } + } + setState(1986); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1987); + match(T__1); + } + break; + case GROUPING: + enterOuterAlt(_localctx, 2); + { + setState(1989); + match(GROUPING); + setState(1990); + match(SETS); + setState(1991); + match(T__0); + setState(1992); + groupingElement(); + setState(1997); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1993); + match(COMMA); + setState(1994); + groupingElement(); + } + } + setState(1999); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2000); + match(T__1); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class GroupingElementContext extends ParserRuleContext { + public GroupingAnalyticsContext groupingAnalytics() { + return getRuleContext(GroupingAnalyticsContext.class,0); + } + public GroupingSetContext groupingSet() { + return getRuleContext(GroupingSetContext.class,0); + } + public GroupingElementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_groupingElement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterGroupingElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitGroupingElement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitGroupingElement(this); + else return visitor.visitChildren(this); + } + } + + public final GroupingElementContext groupingElement() throws RecognitionException { + GroupingElementContext _localctx = new GroupingElementContext(_ctx, getState()); + enterRule(_localctx, 130, RULE_groupingElement); + try { + setState(2006); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,244,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2004); + groupingAnalytics(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2005); + groupingSet(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class GroupingSetContext extends ParserRuleContext { + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public GroupingSetContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_groupingSet; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterGroupingSet(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitGroupingSet(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitGroupingSet(this); + else return visitor.visitChildren(this); + } + } + + public final GroupingSetContext groupingSet() throws RecognitionException { + GroupingSetContext _localctx = new GroupingSetContext(_ctx, getState()); + enterRule(_localctx, 132, RULE_groupingSet); + int _la; + try { + setState(2021); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,247,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2008); + match(T__0); + setState(2017); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,246,_ctx) ) { + case 1: + { + setState(2009); + expression(); + setState(2014); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2010); + match(COMMA); + setState(2011); + expression(); + } + } + setState(2016); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + } + setState(2019); + match(T__1); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2020); + expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PivotClauseContext extends ParserRuleContext { + public NamedExpressionSeqContext aggregates; + public PivotValueContext pivotValue; + public List pivotValues = new ArrayList(); + public TerminalNode PIVOT() { return getToken(SQLParser.PIVOT, 0); } + public TerminalNode FOR() { return getToken(SQLParser.FOR, 0); } + public PivotColumnContext pivotColumn() { + return getRuleContext(PivotColumnContext.class,0); + } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public NamedExpressionSeqContext namedExpressionSeq() { + return getRuleContext(NamedExpressionSeqContext.class,0); + } + public List pivotValue() { + return getRuleContexts(PivotValueContext.class); + } + public PivotValueContext pivotValue(int i) { + return getRuleContext(PivotValueContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public PivotClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pivotClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPivotClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPivotClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPivotClause(this); + else return visitor.visitChildren(this); + } + } + + public final PivotClauseContext pivotClause() throws RecognitionException { + PivotClauseContext _localctx = new PivotClauseContext(_ctx, getState()); + enterRule(_localctx, 134, RULE_pivotClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2023); + match(PIVOT); + setState(2024); + match(T__0); + setState(2025); + ((PivotClauseContext)_localctx).aggregates = namedExpressionSeq(); + setState(2026); + match(FOR); + setState(2027); + pivotColumn(); + setState(2028); + match(IN); + setState(2029); + match(T__0); + setState(2030); + ((PivotClauseContext)_localctx).pivotValue = pivotValue(); + ((PivotClauseContext)_localctx).pivotValues.add(((PivotClauseContext)_localctx).pivotValue); + setState(2035); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2031); + match(COMMA); + setState(2032); + ((PivotClauseContext)_localctx).pivotValue = pivotValue(); + ((PivotClauseContext)_localctx).pivotValues.add(((PivotClauseContext)_localctx).pivotValue); + } + } + setState(2037); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2038); + match(T__1); + setState(2039); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PivotColumnContext extends ParserRuleContext { + public IdentifierContext identifier; + public List identifiers = new ArrayList(); + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public PivotColumnContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pivotColumn; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPivotColumn(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPivotColumn(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPivotColumn(this); + else return visitor.visitChildren(this); + } + } + + public final PivotColumnContext pivotColumn() throws RecognitionException { + PivotColumnContext _localctx = new PivotColumnContext(_ctx, getState()); + enterRule(_localctx, 136, RULE_pivotColumn); + int _la; + try { + setState(2053); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,250,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2041); + ((PivotColumnContext)_localctx).identifier = identifier(); + ((PivotColumnContext)_localctx).identifiers.add(((PivotColumnContext)_localctx).identifier); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2042); + match(T__0); + setState(2043); + ((PivotColumnContext)_localctx).identifier = identifier(); + ((PivotColumnContext)_localctx).identifiers.add(((PivotColumnContext)_localctx).identifier); + setState(2048); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2044); + match(COMMA); + setState(2045); + ((PivotColumnContext)_localctx).identifier = identifier(); + ((PivotColumnContext)_localctx).identifiers.add(((PivotColumnContext)_localctx).identifier); + } + } + setState(2050); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2051); + match(T__1); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PivotValueContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public PivotValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pivotValue; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPivotValue(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPivotValue(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPivotValue(this); + else return visitor.visitChildren(this); + } + } + + public final PivotValueContext pivotValue() throws RecognitionException { + PivotValueContext _localctx = new PivotValueContext(_ctx, getState()); + enterRule(_localctx, 138, RULE_pivotValue); + try { + enterOuterAlt(_localctx, 1); + { + setState(2055); + expression(); + setState(2060); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,252,_ctx) ) { + case 1: + { + setState(2057); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,251,_ctx) ) { + case 1: + { + setState(2056); + match(AS); + } + break; + } + setState(2059); + identifier(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class LateralViewContext extends ParserRuleContext { + public IdentifierContext tblName; + public IdentifierContext identifier; + public List colName = new ArrayList(); + public TerminalNode LATERAL() { return getToken(SQLParser.LATERAL, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public TerminalNode OUTER() { return getToken(SQLParser.OUTER, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public LateralViewContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_lateralView; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLateralView(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLateralView(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLateralView(this); + else return visitor.visitChildren(this); + } + } + + public final LateralViewContext lateralView() throws RecognitionException { + LateralViewContext _localctx = new LateralViewContext(_ctx, getState()); + enterRule(_localctx, 140, RULE_lateralView); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2062); + match(LATERAL); + setState(2063); + match(VIEW); + setState(2065); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,253,_ctx) ) { + case 1: + { + setState(2064); + match(OUTER); + } + break; + } + setState(2067); + qualifiedName(); + setState(2068); + match(T__0); + setState(2077); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,255,_ctx) ) { + case 1: + { + setState(2069); + expression(); + setState(2074); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2070); + match(COMMA); + setState(2071); + expression(); + } + } + setState(2076); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + } + setState(2079); + match(T__1); + setState(2080); + ((LateralViewContext)_localctx).tblName = identifier(); + setState(2092); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,258,_ctx) ) { + case 1: + { + setState(2082); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,256,_ctx) ) { + case 1: + { + setState(2081); + match(AS); + } + break; + } + setState(2084); + ((LateralViewContext)_localctx).identifier = identifier(); + ((LateralViewContext)_localctx).colName.add(((LateralViewContext)_localctx).identifier); + setState(2089); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,257,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2085); + match(COMMA); + setState(2086); + ((LateralViewContext)_localctx).identifier = identifier(); + ((LateralViewContext)_localctx).colName.add(((LateralViewContext)_localctx).identifier); + } + } + } + setState(2091); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,257,_ctx); + } + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SetQuantifierContext extends ParserRuleContext { + public TerminalNode DISTINCT() { return getToken(SQLParser.DISTINCT, 0); } + public TerminalNode ALL() { return getToken(SQLParser.ALL, 0); } + public SetQuantifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_setQuantifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSetQuantifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSetQuantifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSetQuantifier(this); + else return visitor.visitChildren(this); + } + } + + public final SetQuantifierContext setQuantifier() throws RecognitionException { + SetQuantifierContext _localctx = new SetQuantifierContext(_ctx, getState()); + enterRule(_localctx, 142, RULE_setQuantifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2094); + _la = _input.LA(1); + if ( !(_la==ALL || _la==DISTINCT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RelationContext extends ParserRuleContext { + public RelationPrimaryContext relationPrimary() { + return getRuleContext(RelationPrimaryContext.class,0); + } + public TerminalNode LATERAL() { return getToken(SQLParser.LATERAL, 0); } + public List joinRelation() { + return getRuleContexts(JoinRelationContext.class); + } + public JoinRelationContext joinRelation(int i) { + return getRuleContext(JoinRelationContext.class,i); + } + public RelationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relation; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRelation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRelation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRelation(this); + else return visitor.visitChildren(this); + } + } + + public final RelationContext relation() throws RecognitionException { + RelationContext _localctx = new RelationContext(_ctx, getState()); + enterRule(_localctx, 144, RULE_relation); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2097); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,259,_ctx) ) { + case 1: + { + setState(2096); + match(LATERAL); + } + break; + } + setState(2099); + relationPrimary(); + setState(2103); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,260,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2100); + joinRelation(); + } + } + } + setState(2105); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,260,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class JoinRelationContext extends ParserRuleContext { + public RelationPrimaryContext right; + public TerminalNode JOIN() { return getToken(SQLParser.JOIN, 0); } + public RelationPrimaryContext relationPrimary() { + return getRuleContext(RelationPrimaryContext.class,0); + } + public JoinTypeContext joinType() { + return getRuleContext(JoinTypeContext.class,0); + } + public TerminalNode LATERAL() { return getToken(SQLParser.LATERAL, 0); } + public JoinCriteriaContext joinCriteria() { + return getRuleContext(JoinCriteriaContext.class,0); + } + public TerminalNode NATURAL() { return getToken(SQLParser.NATURAL, 0); } + public JoinRelationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_joinRelation; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterJoinRelation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitJoinRelation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitJoinRelation(this); + else return visitor.visitChildren(this); + } + } + + public final JoinRelationContext joinRelation() throws RecognitionException { + JoinRelationContext _localctx = new JoinRelationContext(_ctx, getState()); + enterRule(_localctx, 146, RULE_joinRelation); + try { + setState(2123); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ANTI: + case CROSS: + case FULL: + case INNER: + case JOIN: + case LEFT: + case RIGHT: + case SEMI: + enterOuterAlt(_localctx, 1); + { + { + setState(2106); + joinType(); + } + setState(2107); + match(JOIN); + setState(2109); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,261,_ctx) ) { + case 1: + { + setState(2108); + match(LATERAL); + } + break; + } + setState(2111); + ((JoinRelationContext)_localctx).right = relationPrimary(); + setState(2113); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,262,_ctx) ) { + case 1: + { + setState(2112); + joinCriteria(); + } + break; + } + } + break; + case NATURAL: + enterOuterAlt(_localctx, 2); + { + setState(2115); + match(NATURAL); + setState(2116); + joinType(); + setState(2117); + match(JOIN); + setState(2119); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,263,_ctx) ) { + case 1: + { + setState(2118); + match(LATERAL); + } + break; + } + setState(2121); + ((JoinRelationContext)_localctx).right = relationPrimary(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class JoinTypeContext extends ParserRuleContext { + public TerminalNode INNER() { return getToken(SQLParser.INNER, 0); } + public TerminalNode CROSS() { return getToken(SQLParser.CROSS, 0); } + public TerminalNode LEFT() { return getToken(SQLParser.LEFT, 0); } + public TerminalNode OUTER() { return getToken(SQLParser.OUTER, 0); } + public TerminalNode SEMI() { return getToken(SQLParser.SEMI, 0); } + public TerminalNode RIGHT() { return getToken(SQLParser.RIGHT, 0); } + public TerminalNode FULL() { return getToken(SQLParser.FULL, 0); } + public TerminalNode ANTI() { return getToken(SQLParser.ANTI, 0); } + public JoinTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_joinType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterJoinType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitJoinType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitJoinType(this); + else return visitor.visitChildren(this); + } + } + + public final JoinTypeContext joinType() throws RecognitionException { + JoinTypeContext _localctx = new JoinTypeContext(_ctx, getState()); + enterRule(_localctx, 148, RULE_joinType); + int _la; + try { + setState(2149); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,271,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2126); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==INNER) { + { + setState(2125); + match(INNER); + } + } + + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2128); + match(CROSS); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(2129); + match(LEFT); + setState(2131); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OUTER) { + { + setState(2130); + match(OUTER); + } + } + + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(2134); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LEFT) { + { + setState(2133); + match(LEFT); + } + } + + setState(2136); + match(SEMI); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(2137); + match(RIGHT); + setState(2139); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OUTER) { + { + setState(2138); + match(OUTER); + } + } + + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(2141); + match(FULL); + setState(2143); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OUTER) { + { + setState(2142); + match(OUTER); + } + } + + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(2146); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LEFT) { + { + setState(2145); + match(LEFT); + } + } + + setState(2148); + match(ANTI); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class JoinCriteriaContext extends ParserRuleContext { + public TerminalNode ON() { return getToken(SQLParser.ON, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public TerminalNode USING() { return getToken(SQLParser.USING, 0); } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public JoinCriteriaContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_joinCriteria; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterJoinCriteria(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitJoinCriteria(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitJoinCriteria(this); + else return visitor.visitChildren(this); + } + } + + public final JoinCriteriaContext joinCriteria() throws RecognitionException { + JoinCriteriaContext _localctx = new JoinCriteriaContext(_ctx, getState()); + enterRule(_localctx, 150, RULE_joinCriteria); + try { + setState(2155); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ON: + enterOuterAlt(_localctx, 1); + { + setState(2151); + match(ON); + setState(2152); + booleanExpression(0); + } + break; + case USING: + enterOuterAlt(_localctx, 2); + { + setState(2153); + match(USING); + setState(2154); + identifierList(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SampleContext extends ParserRuleContext { + public TerminalNode TABLESAMPLE() { return getToken(SQLParser.TABLESAMPLE, 0); } + public SampleMethodContext sampleMethod() { + return getRuleContext(SampleMethodContext.class,0); + } + public SampleContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sample; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSample(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSample(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSample(this); + else return visitor.visitChildren(this); + } + } + + public final SampleContext sample() throws RecognitionException { + SampleContext _localctx = new SampleContext(_ctx, getState()); + enterRule(_localctx, 152, RULE_sample); + try { + enterOuterAlt(_localctx, 1); + { + setState(2157); + match(TABLESAMPLE); + setState(2158); + match(T__0); + setState(2160); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,273,_ctx) ) { + case 1: + { + setState(2159); + sampleMethod(); + } + break; + } + setState(2162); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SampleMethodContext extends ParserRuleContext { + public SampleMethodContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sampleMethod; } + + public SampleMethodContext() { } + public void copyFrom(SampleMethodContext ctx) { + super.copyFrom(ctx); + } + } + public static class SampleByRowsContext extends SampleMethodContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode ROWS() { return getToken(SQLParser.ROWS, 0); } + public SampleByRowsContext(SampleMethodContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSampleByRows(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSampleByRows(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSampleByRows(this); + else return visitor.visitChildren(this); + } + } + public static class SampleByPercentileContext extends SampleMethodContext { + public Token negativeSign; + public Token percentage; + public TerminalNode PERCENTLIT() { return getToken(SQLParser.PERCENTLIT, 0); } + public TerminalNode INTEGER_VALUE() { return getToken(SQLParser.INTEGER_VALUE, 0); } + public TerminalNode DECIMAL_VALUE() { return getToken(SQLParser.DECIMAL_VALUE, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public SampleByPercentileContext(SampleMethodContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSampleByPercentile(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSampleByPercentile(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSampleByPercentile(this); + else return visitor.visitChildren(this); + } + } + public static class SampleByBucketContext extends SampleMethodContext { + public Token sampleType; + public Token numerator; + public Token denominator; + public TerminalNode OUT() { return getToken(SQLParser.OUT, 0); } + public TerminalNode OF() { return getToken(SQLParser.OF, 0); } + public TerminalNode BUCKET() { return getToken(SQLParser.BUCKET, 0); } + public List INTEGER_VALUE() { return getTokens(SQLParser.INTEGER_VALUE); } + public TerminalNode INTEGER_VALUE(int i) { + return getToken(SQLParser.INTEGER_VALUE, i); + } + public TerminalNode ON() { return getToken(SQLParser.ON, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public SampleByBucketContext(SampleMethodContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSampleByBucket(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSampleByBucket(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSampleByBucket(this); + else return visitor.visitChildren(this); + } + } + public static class SampleByBytesContext extends SampleMethodContext { + public ExpressionContext bytes; + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public SampleByBytesContext(SampleMethodContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSampleByBytes(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSampleByBytes(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSampleByBytes(this); + else return visitor.visitChildren(this); + } + } + + public final SampleMethodContext sampleMethod() throws RecognitionException { + SampleMethodContext _localctx = new SampleMethodContext(_ctx, getState()); + enterRule(_localctx, 154, RULE_sampleMethod); + int _la; + try { + setState(2188); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,277,_ctx) ) { + case 1: + _localctx = new SampleByPercentileContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(2165); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(2164); + ((SampleByPercentileContext)_localctx).negativeSign = match(MINUS); + } + } + + setState(2167); + ((SampleByPercentileContext)_localctx).percentage = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==INTEGER_VALUE || _la==DECIMAL_VALUE) ) { + ((SampleByPercentileContext)_localctx).percentage = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2168); + match(PERCENTLIT); + } + break; + case 2: + _localctx = new SampleByRowsContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(2169); + expression(); + setState(2170); + match(ROWS); + } + break; + case 3: + _localctx = new SampleByBucketContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(2172); + ((SampleByBucketContext)_localctx).sampleType = match(BUCKET); + setState(2173); + ((SampleByBucketContext)_localctx).numerator = match(INTEGER_VALUE); + setState(2174); + match(OUT); + setState(2175); + match(OF); + setState(2176); + ((SampleByBucketContext)_localctx).denominator = match(INTEGER_VALUE); + setState(2185); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ON) { + { + setState(2177); + match(ON); + setState(2183); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,275,_ctx) ) { + case 1: + { + setState(2178); + identifier(); + } + break; + case 2: + { + setState(2179); + qualifiedName(); + setState(2180); + match(T__0); + setState(2181); + match(T__1); + } + break; + } + } + } + + } + break; + case 4: + _localctx = new SampleByBytesContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(2187); + ((SampleByBytesContext)_localctx).bytes = expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IdentifierListContext extends ParserRuleContext { + public IdentifierSeqContext identifierSeq() { + return getRuleContext(IdentifierSeqContext.class,0); + } + public IdentifierListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifierList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIdentifierList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIdentifierList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIdentifierList(this); + else return visitor.visitChildren(this); + } + } + + public final IdentifierListContext identifierList() throws RecognitionException { + IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); + enterRule(_localctx, 156, RULE_identifierList); + try { + enterOuterAlt(_localctx, 1); + { + setState(2190); + match(T__0); + setState(2191); + identifierSeq(); + setState(2192); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IdentifierSeqContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext errorCapturingIdentifier; + public List ident = new ArrayList(); + public List errorCapturingIdentifier() { + return getRuleContexts(ErrorCapturingIdentifierContext.class); + } + public ErrorCapturingIdentifierContext errorCapturingIdentifier(int i) { + return getRuleContext(ErrorCapturingIdentifierContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public IdentifierSeqContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifierSeq; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIdentifierSeq(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIdentifierSeq(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIdentifierSeq(this); + else return visitor.visitChildren(this); + } + } + + public final IdentifierSeqContext identifierSeq() throws RecognitionException { + IdentifierSeqContext _localctx = new IdentifierSeqContext(_ctx, getState()); + enterRule(_localctx, 158, RULE_identifierSeq); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2194); + ((IdentifierSeqContext)_localctx).errorCapturingIdentifier = errorCapturingIdentifier(); + ((IdentifierSeqContext)_localctx).ident.add(((IdentifierSeqContext)_localctx).errorCapturingIdentifier); + setState(2199); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,278,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2195); + match(COMMA); + setState(2196); + ((IdentifierSeqContext)_localctx).errorCapturingIdentifier = errorCapturingIdentifier(); + ((IdentifierSeqContext)_localctx).ident.add(((IdentifierSeqContext)_localctx).errorCapturingIdentifier); + } + } + } + setState(2201); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,278,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class OrderedIdentifierListContext extends ParserRuleContext { + public List orderedIdentifier() { + return getRuleContexts(OrderedIdentifierContext.class); + } + public OrderedIdentifierContext orderedIdentifier(int i) { + return getRuleContext(OrderedIdentifierContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public OrderedIdentifierListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderedIdentifierList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterOrderedIdentifierList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitOrderedIdentifierList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitOrderedIdentifierList(this); + else return visitor.visitChildren(this); + } + } + + public final OrderedIdentifierListContext orderedIdentifierList() throws RecognitionException { + OrderedIdentifierListContext _localctx = new OrderedIdentifierListContext(_ctx, getState()); + enterRule(_localctx, 160, RULE_orderedIdentifierList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2202); + match(T__0); + setState(2203); + orderedIdentifier(); + setState(2208); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2204); + match(COMMA); + setState(2205); + orderedIdentifier(); + } + } + setState(2210); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2211); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class OrderedIdentifierContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext ident; + public Token ordering; + public ErrorCapturingIdentifierContext errorCapturingIdentifier() { + return getRuleContext(ErrorCapturingIdentifierContext.class,0); + } + public TerminalNode ASC() { return getToken(SQLParser.ASC, 0); } + public TerminalNode DESC() { return getToken(SQLParser.DESC, 0); } + public OrderedIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderedIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterOrderedIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitOrderedIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitOrderedIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final OrderedIdentifierContext orderedIdentifier() throws RecognitionException { + OrderedIdentifierContext _localctx = new OrderedIdentifierContext(_ctx, getState()); + enterRule(_localctx, 162, RULE_orderedIdentifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2213); + ((OrderedIdentifierContext)_localctx).ident = errorCapturingIdentifier(); + setState(2215); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASC || _la==DESC) { + { + setState(2214); + ((OrderedIdentifierContext)_localctx).ordering = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ASC || _la==DESC) ) { + ((OrderedIdentifierContext)_localctx).ordering = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IdentifierCommentListContext extends ParserRuleContext { + public List identifierComment() { + return getRuleContexts(IdentifierCommentContext.class); + } + public IdentifierCommentContext identifierComment(int i) { + return getRuleContext(IdentifierCommentContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public IdentifierCommentListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifierCommentList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIdentifierCommentList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIdentifierCommentList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIdentifierCommentList(this); + else return visitor.visitChildren(this); + } + } + + public final IdentifierCommentListContext identifierCommentList() throws RecognitionException { + IdentifierCommentListContext _localctx = new IdentifierCommentListContext(_ctx, getState()); + enterRule(_localctx, 164, RULE_identifierCommentList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2217); + match(T__0); + setState(2218); + identifierComment(); + setState(2223); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2219); + match(COMMA); + setState(2220); + identifierComment(); + } + } + setState(2225); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2226); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IdentifierCommentContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public CommentSpecContext commentSpec() { + return getRuleContext(CommentSpecContext.class,0); + } + public IdentifierCommentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifierComment; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIdentifierComment(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIdentifierComment(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIdentifierComment(this); + else return visitor.visitChildren(this); + } + } + + public final IdentifierCommentContext identifierComment() throws RecognitionException { + IdentifierCommentContext _localctx = new IdentifierCommentContext(_ctx, getState()); + enterRule(_localctx, 166, RULE_identifierComment); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2228); + identifier(); + setState(2230); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMENT) { + { + setState(2229); + commentSpec(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RelationPrimaryContext extends ParserRuleContext { + public RelationPrimaryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relationPrimary; } + + public RelationPrimaryContext() { } + public void copyFrom(RelationPrimaryContext ctx) { + super.copyFrom(ctx); + } + } + public static class TableValuedFunctionContext extends RelationPrimaryContext { + public FunctionTableContext functionTable() { + return getRuleContext(FunctionTableContext.class,0); + } + public TableValuedFunctionContext(RelationPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTableValuedFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTableValuedFunction(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTableValuedFunction(this); + else return visitor.visitChildren(this); + } + } + public static class InlineTableDefault2Context extends RelationPrimaryContext { + public InlineTableContext inlineTable() { + return getRuleContext(InlineTableContext.class,0); + } + public InlineTableDefault2Context(RelationPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterInlineTableDefault2(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitInlineTableDefault2(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitInlineTableDefault2(this); + else return visitor.visitChildren(this); + } + } + public static class AliasedRelationContext extends RelationPrimaryContext { + public RelationContext relation() { + return getRuleContext(RelationContext.class,0); + } + public TableAliasContext tableAlias() { + return getRuleContext(TableAliasContext.class,0); + } + public SampleContext sample() { + return getRuleContext(SampleContext.class,0); + } + public AliasedRelationContext(RelationPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAliasedRelation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAliasedRelation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAliasedRelation(this); + else return visitor.visitChildren(this); + } + } + public static class AliasedQueryContext extends RelationPrimaryContext { + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TableAliasContext tableAlias() { + return getRuleContext(TableAliasContext.class,0); + } + public SampleContext sample() { + return getRuleContext(SampleContext.class,0); + } + public AliasedQueryContext(RelationPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAliasedQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAliasedQuery(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAliasedQuery(this); + else return visitor.visitChildren(this); + } + } + public static class TableNameContext extends RelationPrimaryContext { + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TableAliasContext tableAlias() { + return getRuleContext(TableAliasContext.class,0); + } + public SampleContext sample() { + return getRuleContext(SampleContext.class,0); + } + public TableNameContext(RelationPrimaryContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTableName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTableName(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTableName(this); + else return visitor.visitChildren(this); + } + } + + public final RelationPrimaryContext relationPrimary() throws RecognitionException { + RelationPrimaryContext _localctx = new RelationPrimaryContext(_ctx, getState()); + enterRule(_localctx, 168, RULE_relationPrimary); + try { + setState(2256); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,286,_ctx) ) { + case 1: + _localctx = new TableNameContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(2232); + multipartIdentifier(); + setState(2234); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,283,_ctx) ) { + case 1: + { + setState(2233); + sample(); + } + break; + } + setState(2236); + tableAlias(); + } + break; + case 2: + _localctx = new AliasedQueryContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(2238); + match(T__0); + setState(2239); + query(); + setState(2240); + match(T__1); + setState(2242); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,284,_ctx) ) { + case 1: + { + setState(2241); + sample(); + } + break; + } + setState(2244); + tableAlias(); + } + break; + case 3: + _localctx = new AliasedRelationContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(2246); + match(T__0); + setState(2247); + relation(); + setState(2248); + match(T__1); + setState(2250); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,285,_ctx) ) { + case 1: + { + setState(2249); + sample(); + } + break; + } + setState(2252); + tableAlias(); + } + break; + case 4: + _localctx = new InlineTableDefault2Context(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(2254); + inlineTable(); + } + break; + case 5: + _localctx = new TableValuedFunctionContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(2255); + functionTable(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class InlineTableContext extends ParserRuleContext { + public TerminalNode VALUES() { return getToken(SQLParser.VALUES, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TableAliasContext tableAlias() { + return getRuleContext(TableAliasContext.class,0); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public InlineTableContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inlineTable; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterInlineTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitInlineTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitInlineTable(this); + else return visitor.visitChildren(this); + } + } + + public final InlineTableContext inlineTable() throws RecognitionException { + InlineTableContext _localctx = new InlineTableContext(_ctx, getState()); + enterRule(_localctx, 170, RULE_inlineTable); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2258); + match(VALUES); + setState(2259); + expression(); + setState(2264); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,287,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2260); + match(COMMA); + setState(2261); + expression(); + } + } + } + setState(2266); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,287,_ctx); + } + setState(2267); + tableAlias(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FunctionTableContext extends ParserRuleContext { + public FunctionNameContext funcName; + public TableAliasContext tableAlias() { + return getRuleContext(TableAliasContext.class,0); + } + public FunctionNameContext functionName() { + return getRuleContext(FunctionNameContext.class,0); + } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public FunctionTableContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionTable; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFunctionTable(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFunctionTable(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFunctionTable(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionTableContext functionTable() throws RecognitionException { + FunctionTableContext _localctx = new FunctionTableContext(_ctx, getState()); + enterRule(_localctx, 172, RULE_functionTable); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2269); + ((FunctionTableContext)_localctx).funcName = functionName(); + setState(2270); + match(T__0); + setState(2279); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,289,_ctx) ) { + case 1: + { + setState(2271); + expression(); + setState(2276); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2272); + match(COMMA); + setState(2273); + expression(); + } + } + setState(2278); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + } + setState(2281); + match(T__1); + setState(2282); + tableAlias(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TableAliasContext extends ParserRuleContext { + public StrictIdentifierContext strictIdentifier() { + return getRuleContext(StrictIdentifierContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public TableAliasContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tableAlias; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTableAlias(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTableAlias(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTableAlias(this); + else return visitor.visitChildren(this); + } + } + + public final TableAliasContext tableAlias() throws RecognitionException { + TableAliasContext _localctx = new TableAliasContext(_ctx, getState()); + enterRule(_localctx, 174, RULE_tableAlias); + try { + enterOuterAlt(_localctx, 1); + { + setState(2291); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,292,_ctx) ) { + case 1: + { + setState(2285); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,290,_ctx) ) { + case 1: + { + setState(2284); + match(AS); + } + break; + } + setState(2287); + strictIdentifier(); + setState(2289); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,291,_ctx) ) { + case 1: + { + setState(2288); + identifierList(); + } + break; + } + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RowFormatContext extends ParserRuleContext { + public RowFormatContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_rowFormat; } + + public RowFormatContext() { } + public void copyFrom(RowFormatContext ctx) { + super.copyFrom(ctx); + } + } + public static class RowFormatSerdeContext extends RowFormatContext { + public Token name; + public TablePropertyListContext props; + public TerminalNode ROW() { return getToken(SQLParser.ROW, 0); } + public TerminalNode FORMAT() { return getToken(SQLParser.FORMAT, 0); } + public TerminalNode SERDE() { return getToken(SQLParser.SERDE, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode WITH() { return getToken(SQLParser.WITH, 0); } + public TerminalNode SERDEPROPERTIES() { return getToken(SQLParser.SERDEPROPERTIES, 0); } + public TablePropertyListContext tablePropertyList() { + return getRuleContext(TablePropertyListContext.class,0); + } + public RowFormatSerdeContext(RowFormatContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRowFormatSerde(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRowFormatSerde(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRowFormatSerde(this); + else return visitor.visitChildren(this); + } + } + public static class RowFormatDelimitedContext extends RowFormatContext { + public Token fieldsTerminatedBy; + public Token escapedBy; + public Token collectionItemsTerminatedBy; + public Token keysTerminatedBy; + public Token linesSeparatedBy; + public Token nullDefinedAs; + public TerminalNode ROW() { return getToken(SQLParser.ROW, 0); } + public TerminalNode FORMAT() { return getToken(SQLParser.FORMAT, 0); } + public TerminalNode DELIMITED() { return getToken(SQLParser.DELIMITED, 0); } + public TerminalNode FIELDS() { return getToken(SQLParser.FIELDS, 0); } + public List TERMINATED() { return getTokens(SQLParser.TERMINATED); } + public TerminalNode TERMINATED(int i) { + return getToken(SQLParser.TERMINATED, i); + } + public List BY() { return getTokens(SQLParser.BY); } + public TerminalNode BY(int i) { + return getToken(SQLParser.BY, i); + } + public TerminalNode COLLECTION() { return getToken(SQLParser.COLLECTION, 0); } + public TerminalNode ITEMS() { return getToken(SQLParser.ITEMS, 0); } + public TerminalNode MAP() { return getToken(SQLParser.MAP, 0); } + public TerminalNode KEYS() { return getToken(SQLParser.KEYS, 0); } + public TerminalNode LINES() { return getToken(SQLParser.LINES, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public TerminalNode DEFINED() { return getToken(SQLParser.DEFINED, 0); } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public List STRING() { return getTokens(SQLParser.STRING); } + public TerminalNode STRING(int i) { + return getToken(SQLParser.STRING, i); + } + public TerminalNode ESCAPED() { return getToken(SQLParser.ESCAPED, 0); } + public RowFormatDelimitedContext(RowFormatContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRowFormatDelimited(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRowFormatDelimited(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRowFormatDelimited(this); + else return visitor.visitChildren(this); + } + } + + public final RowFormatContext rowFormat() throws RecognitionException { + RowFormatContext _localctx = new RowFormatContext(_ctx, getState()); + enterRule(_localctx, 176, RULE_rowFormat); + try { + setState(2342); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,300,_ctx) ) { + case 1: + _localctx = new RowFormatSerdeContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(2293); + match(ROW); + setState(2294); + match(FORMAT); + setState(2295); + match(SERDE); + setState(2296); + ((RowFormatSerdeContext)_localctx).name = match(STRING); + setState(2300); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,293,_ctx) ) { + case 1: + { + setState(2297); + match(WITH); + setState(2298); + match(SERDEPROPERTIES); + setState(2299); + ((RowFormatSerdeContext)_localctx).props = tablePropertyList(); + } + break; + } + } + break; + case 2: + _localctx = new RowFormatDelimitedContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(2302); + match(ROW); + setState(2303); + match(FORMAT); + setState(2304); + match(DELIMITED); + setState(2314); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,295,_ctx) ) { + case 1: + { + setState(2305); + match(FIELDS); + setState(2306); + match(TERMINATED); + setState(2307); + match(BY); + setState(2308); + ((RowFormatDelimitedContext)_localctx).fieldsTerminatedBy = match(STRING); + setState(2312); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,294,_ctx) ) { + case 1: + { + setState(2309); + match(ESCAPED); + setState(2310); + match(BY); + setState(2311); + ((RowFormatDelimitedContext)_localctx).escapedBy = match(STRING); + } + break; + } + } + break; + } + setState(2321); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,296,_ctx) ) { + case 1: + { + setState(2316); + match(COLLECTION); + setState(2317); + match(ITEMS); + setState(2318); + match(TERMINATED); + setState(2319); + match(BY); + setState(2320); + ((RowFormatDelimitedContext)_localctx).collectionItemsTerminatedBy = match(STRING); + } + break; + } + setState(2328); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,297,_ctx) ) { + case 1: + { + setState(2323); + match(MAP); + setState(2324); + match(KEYS); + setState(2325); + match(TERMINATED); + setState(2326); + match(BY); + setState(2327); + ((RowFormatDelimitedContext)_localctx).keysTerminatedBy = match(STRING); + } + break; + } + setState(2334); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,298,_ctx) ) { + case 1: + { + setState(2330); + match(LINES); + setState(2331); + match(TERMINATED); + setState(2332); + match(BY); + setState(2333); + ((RowFormatDelimitedContext)_localctx).linesSeparatedBy = match(STRING); + } + break; + } + setState(2340); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,299,_ctx) ) { + case 1: + { + setState(2336); + match(NULL); + setState(2337); + match(DEFINED); + setState(2338); + match(AS); + setState(2339); + ((RowFormatDelimitedContext)_localctx).nullDefinedAs = match(STRING); + } + break; + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MultipartIdentifierListContext extends ParserRuleContext { + public List multipartIdentifier() { + return getRuleContexts(MultipartIdentifierContext.class); + } + public MultipartIdentifierContext multipartIdentifier(int i) { + return getRuleContext(MultipartIdentifierContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public MultipartIdentifierListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multipartIdentifierList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterMultipartIdentifierList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitMultipartIdentifierList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitMultipartIdentifierList(this); + else return visitor.visitChildren(this); + } + } + + public final MultipartIdentifierListContext multipartIdentifierList() throws RecognitionException { + MultipartIdentifierListContext _localctx = new MultipartIdentifierListContext(_ctx, getState()); + enterRule(_localctx, 178, RULE_multipartIdentifierList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2344); + multipartIdentifier(); + setState(2349); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2345); + match(COMMA); + setState(2346); + multipartIdentifier(); + } + } + setState(2351); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MultipartIdentifierContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext errorCapturingIdentifier; + public List parts = new ArrayList(); + public List errorCapturingIdentifier() { + return getRuleContexts(ErrorCapturingIdentifierContext.class); + } + public ErrorCapturingIdentifierContext errorCapturingIdentifier(int i) { + return getRuleContext(ErrorCapturingIdentifierContext.class,i); + } + public List POINT() { return getTokens(SQLParser.POINT); } + public TerminalNode POINT(int i) { + return getToken(SQLParser.POINT, i); + } + public MultipartIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multipartIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterMultipartIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitMultipartIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitMultipartIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final MultipartIdentifierContext multipartIdentifier() throws RecognitionException { + MultipartIdentifierContext _localctx = new MultipartIdentifierContext(_ctx, getState()); + enterRule(_localctx, 180, RULE_multipartIdentifier); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2352); + ((MultipartIdentifierContext)_localctx).errorCapturingIdentifier = errorCapturingIdentifier(); + ((MultipartIdentifierContext)_localctx).parts.add(((MultipartIdentifierContext)_localctx).errorCapturingIdentifier); + setState(2357); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,302,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2353); + match(POINT); + setState(2354); + ((MultipartIdentifierContext)_localctx).errorCapturingIdentifier = errorCapturingIdentifier(); + ((MultipartIdentifierContext)_localctx).parts.add(((MultipartIdentifierContext)_localctx).errorCapturingIdentifier); + } + } + } + setState(2359); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,302,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TableIdentifierContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext db; + public ErrorCapturingIdentifierContext table; + public List errorCapturingIdentifier() { + return getRuleContexts(ErrorCapturingIdentifierContext.class); + } + public ErrorCapturingIdentifierContext errorCapturingIdentifier(int i) { + return getRuleContext(ErrorCapturingIdentifierContext.class,i); + } + public TerminalNode POINT() { return getToken(SQLParser.POINT, 0); } + public TableIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tableIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTableIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTableIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTableIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final TableIdentifierContext tableIdentifier() throws RecognitionException { + TableIdentifierContext _localctx = new TableIdentifierContext(_ctx, getState()); + enterRule(_localctx, 182, RULE_tableIdentifier); + try { + enterOuterAlt(_localctx, 1); + { + setState(2363); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,303,_ctx) ) { + case 1: + { + setState(2360); + ((TableIdentifierContext)_localctx).db = errorCapturingIdentifier(); + setState(2361); + match(POINT); + } + break; + } + setState(2365); + ((TableIdentifierContext)_localctx).table = errorCapturingIdentifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FunctionIdentifierContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext db; + public ErrorCapturingIdentifierContext function; + public List errorCapturingIdentifier() { + return getRuleContexts(ErrorCapturingIdentifierContext.class); + } + public ErrorCapturingIdentifierContext errorCapturingIdentifier(int i) { + return getRuleContext(ErrorCapturingIdentifierContext.class,i); + } + public TerminalNode POINT() { return getToken(SQLParser.POINT, 0); } + public FunctionIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFunctionIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFunctionIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFunctionIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionIdentifierContext functionIdentifier() throws RecognitionException { + FunctionIdentifierContext _localctx = new FunctionIdentifierContext(_ctx, getState()); + enterRule(_localctx, 184, RULE_functionIdentifier); + try { + enterOuterAlt(_localctx, 1); + { + setState(2370); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,304,_ctx) ) { + case 1: + { + setState(2367); + ((FunctionIdentifierContext)_localctx).db = errorCapturingIdentifier(); + setState(2368); + match(POINT); + } + break; + } + setState(2372); + ((FunctionIdentifierContext)_localctx).function = errorCapturingIdentifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NamedExpressionContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext name; + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public ErrorCapturingIdentifierContext errorCapturingIdentifier() { + return getRuleContext(ErrorCapturingIdentifierContext.class,0); + } + public NamedExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namedExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNamedExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNamedExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNamedExpression(this); + else return visitor.visitChildren(this); + } + } + + public final NamedExpressionContext namedExpression() throws RecognitionException { + NamedExpressionContext _localctx = new NamedExpressionContext(_ctx, getState()); + enterRule(_localctx, 186, RULE_namedExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(2374); + expression(); + setState(2382); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,307,_ctx) ) { + case 1: + { + setState(2376); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,305,_ctx) ) { + case 1: + { + setState(2375); + match(AS); + } + break; + } + setState(2380); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,306,_ctx) ) { + case 1: + { + setState(2378); + ((NamedExpressionContext)_localctx).name = errorCapturingIdentifier(); + } + break; + case 2: + { + setState(2379); + identifierList(); + } + break; + } + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NamedExpressionSeqContext extends ParserRuleContext { + public List namedExpression() { + return getRuleContexts(NamedExpressionContext.class); + } + public NamedExpressionContext namedExpression(int i) { + return getRuleContext(NamedExpressionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public NamedExpressionSeqContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namedExpressionSeq; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNamedExpressionSeq(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNamedExpressionSeq(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNamedExpressionSeq(this); + else return visitor.visitChildren(this); + } + } + + public final NamedExpressionSeqContext namedExpressionSeq() throws RecognitionException { + NamedExpressionSeqContext _localctx = new NamedExpressionSeqContext(_ctx, getState()); + enterRule(_localctx, 188, RULE_namedExpressionSeq); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2384); + namedExpression(); + setState(2389); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,308,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2385); + match(COMMA); + setState(2386); + namedExpression(); + } + } + } + setState(2391); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,308,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PartitionFieldListContext extends ParserRuleContext { + public PartitionFieldContext partitionField; + public List fields = new ArrayList(); + public List partitionField() { + return getRuleContexts(PartitionFieldContext.class); + } + public PartitionFieldContext partitionField(int i) { + return getRuleContext(PartitionFieldContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public PartitionFieldListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_partitionFieldList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPartitionFieldList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPartitionFieldList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPartitionFieldList(this); + else return visitor.visitChildren(this); + } + } + + public final PartitionFieldListContext partitionFieldList() throws RecognitionException { + PartitionFieldListContext _localctx = new PartitionFieldListContext(_ctx, getState()); + enterRule(_localctx, 190, RULE_partitionFieldList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2392); + match(T__0); + setState(2393); + ((PartitionFieldListContext)_localctx).partitionField = partitionField(); + ((PartitionFieldListContext)_localctx).fields.add(((PartitionFieldListContext)_localctx).partitionField); + setState(2398); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2394); + match(COMMA); + setState(2395); + ((PartitionFieldListContext)_localctx).partitionField = partitionField(); + ((PartitionFieldListContext)_localctx).fields.add(((PartitionFieldListContext)_localctx).partitionField); + } + } + setState(2400); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2401); + match(T__1); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PartitionFieldContext extends ParserRuleContext { + public PartitionFieldContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_partitionField; } + + public PartitionFieldContext() { } + public void copyFrom(PartitionFieldContext ctx) { + super.copyFrom(ctx); + } + } + public static class PartitionColumnContext extends PartitionFieldContext { + public ColTypeContext colType() { + return getRuleContext(ColTypeContext.class,0); + } + public PartitionColumnContext(PartitionFieldContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPartitionColumn(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPartitionColumn(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPartitionColumn(this); + else return visitor.visitChildren(this); + } + } + public static class PartitionTransformContext extends PartitionFieldContext { + public TransformContext transform() { + return getRuleContext(TransformContext.class,0); + } + public PartitionTransformContext(PartitionFieldContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPartitionTransform(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPartitionTransform(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPartitionTransform(this); + else return visitor.visitChildren(this); + } + } + + public final PartitionFieldContext partitionField() throws RecognitionException { + PartitionFieldContext _localctx = new PartitionFieldContext(_ctx, getState()); + enterRule(_localctx, 192, RULE_partitionField); + try { + setState(2405); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,310,_ctx) ) { + case 1: + _localctx = new PartitionTransformContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(2403); + transform(); + } + break; + case 2: + _localctx = new PartitionColumnContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(2404); + colType(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TransformContext extends ParserRuleContext { + public TransformContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_transform; } + + public TransformContext() { } + public void copyFrom(TransformContext ctx) { + super.copyFrom(ctx); + } + } + public static class IdentityTransformContext extends TransformContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public IdentityTransformContext(TransformContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIdentityTransform(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIdentityTransform(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIdentityTransform(this); + else return visitor.visitChildren(this); + } + } + public static class ApplyTransformContext extends TransformContext { + public IdentifierContext transformName; + public TransformArgumentContext transformArgument; + public List argument = new ArrayList(); + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public List transformArgument() { + return getRuleContexts(TransformArgumentContext.class); + } + public TransformArgumentContext transformArgument(int i) { + return getRuleContext(TransformArgumentContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public ApplyTransformContext(TransformContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterApplyTransform(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitApplyTransform(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitApplyTransform(this); + else return visitor.visitChildren(this); + } + } + + public final TransformContext transform() throws RecognitionException { + TransformContext _localctx = new TransformContext(_ctx, getState()); + enterRule(_localctx, 194, RULE_transform); + int _la; + try { + setState(2420); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,312,_ctx) ) { + case 1: + _localctx = new IdentityTransformContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(2407); + qualifiedName(); + } + break; + case 2: + _localctx = new ApplyTransformContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(2408); + ((ApplyTransformContext)_localctx).transformName = identifier(); + setState(2409); + match(T__0); + setState(2410); + ((ApplyTransformContext)_localctx).transformArgument = transformArgument(); + ((ApplyTransformContext)_localctx).argument.add(((ApplyTransformContext)_localctx).transformArgument); + setState(2415); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2411); + match(COMMA); + setState(2412); + ((ApplyTransformContext)_localctx).transformArgument = transformArgument(); + ((ApplyTransformContext)_localctx).argument.add(((ApplyTransformContext)_localctx).transformArgument); + } + } + setState(2417); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2418); + match(T__1); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TransformArgumentContext extends ParserRuleContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public ConstantContext constant() { + return getRuleContext(ConstantContext.class,0); + } + public TransformArgumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_transformArgument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTransformArgument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTransformArgument(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTransformArgument(this); + else return visitor.visitChildren(this); + } + } + + public final TransformArgumentContext transformArgument() throws RecognitionException { + TransformArgumentContext _localctx = new TransformArgumentContext(_ctx, getState()); + enterRule(_localctx, 196, RULE_transformArgument); + try { + setState(2424); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,313,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2422); + qualifiedName(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2423); + constant(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ExpressionContext extends ParserRuleContext { + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitExpression(this); + else return visitor.visitChildren(this); + } + } + + public final ExpressionContext expression() throws RecognitionException { + ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); + enterRule(_localctx, 198, RULE_expression); + try { + enterOuterAlt(_localctx, 1); + { + setState(2426); + booleanExpression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ExpressionSeqContext extends ParserRuleContext { + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public ExpressionSeqContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expressionSeq; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterExpressionSeq(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitExpressionSeq(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitExpressionSeq(this); + else return visitor.visitChildren(this); + } + } + + public final ExpressionSeqContext expressionSeq() throws RecognitionException { + ExpressionSeqContext _localctx = new ExpressionSeqContext(_ctx, getState()); + enterRule(_localctx, 200, RULE_expressionSeq); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2428); + expression(); + setState(2433); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2429); + match(COMMA); + setState(2430); + expression(); + } + } + setState(2435); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BooleanExpressionContext extends ParserRuleContext { + public BooleanExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_booleanExpression; } + + public BooleanExpressionContext() { } + public void copyFrom(BooleanExpressionContext ctx) { + super.copyFrom(ctx); + } + } + public static class LogicalNotContext extends BooleanExpressionContext { + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public LogicalNotContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLogicalNot(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLogicalNot(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLogicalNot(this); + else return visitor.visitChildren(this); + } + } + public static class PredicatedContext extends BooleanExpressionContext { + public ValueExpressionContext valueExpression() { + return getRuleContext(ValueExpressionContext.class,0); + } + public PredicateContext predicate() { + return getRuleContext(PredicateContext.class,0); + } + public PredicatedContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPredicated(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPredicated(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPredicated(this); + else return visitor.visitChildren(this); + } + } + public static class ExistsContext extends BooleanExpressionContext { + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public ExistsContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterExists(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitExists(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitExists(this); + else return visitor.visitChildren(this); + } + } + public static class LogicalBinaryContext extends BooleanExpressionContext { + public BooleanExpressionContext left; + public Token operator; + public BooleanExpressionContext right; + public List booleanExpression() { + return getRuleContexts(BooleanExpressionContext.class); + } + public BooleanExpressionContext booleanExpression(int i) { + return getRuleContext(BooleanExpressionContext.class,i); + } + public TerminalNode AND() { return getToken(SQLParser.AND, 0); } + public TerminalNode OR() { return getToken(SQLParser.OR, 0); } + public LogicalBinaryContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLogicalBinary(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLogicalBinary(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLogicalBinary(this); + else return visitor.visitChildren(this); + } + } + + public final BooleanExpressionContext booleanExpression() throws RecognitionException { + return booleanExpression(0); + } + + private BooleanExpressionContext booleanExpression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + BooleanExpressionContext _localctx = new BooleanExpressionContext(_ctx, _parentState); + BooleanExpressionContext _prevctx = _localctx; + int _startState = 202; + enterRecursionRule(_localctx, 202, RULE_booleanExpression, _p); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2448); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,316,_ctx) ) { + case 1: + { + _localctx = new LogicalNotContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(2437); + match(NOT); + setState(2438); + booleanExpression(5); + } + break; + case 2: + { + _localctx = new ExistsContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2439); + match(EXISTS); + setState(2440); + match(T__0); + setState(2441); + query(); + setState(2442); + match(T__1); + } + break; + case 3: + { + _localctx = new PredicatedContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2444); + valueExpression(0); + setState(2446); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,315,_ctx) ) { + case 1: + { + setState(2445); + predicate(); + } + break; + } + } + break; + } + _ctx.stop = _input.LT(-1); + setState(2458); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,318,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(2456); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,317,_ctx) ) { + case 1: + { + _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); + ((LogicalBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); + setState(2450); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(2451); + ((LogicalBinaryContext)_localctx).operator = match(AND); + setState(2452); + ((LogicalBinaryContext)_localctx).right = booleanExpression(3); + } + break; + case 2: + { + _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); + ((LogicalBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); + setState(2453); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(2454); + ((LogicalBinaryContext)_localctx).operator = match(OR); + setState(2455); + ((LogicalBinaryContext)_localctx).right = booleanExpression(2); + } + break; + } + } + } + setState(2460); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,318,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + public static class PredicateContext extends ParserRuleContext { + public Token kind; + public ValueExpressionContext lower; + public ValueExpressionContext upper; + public ValueExpressionContext pattern; + public Token quantifier; + public Token escapeChar; + public ValueExpressionContext right; + public TerminalNode AND() { return getToken(SQLParser.AND, 0); } + public TerminalNode BETWEEN() { return getToken(SQLParser.BETWEEN, 0); } + public List valueExpression() { + return getRuleContexts(ValueExpressionContext.class); + } + public ValueExpressionContext valueExpression(int i) { + return getRuleContext(ValueExpressionContext.class,i); + } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode RLIKE() { return getToken(SQLParser.RLIKE, 0); } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public TerminalNode ANY() { return getToken(SQLParser.ANY, 0); } + public TerminalNode SOME() { return getToken(SQLParser.SOME, 0); } + public TerminalNode ALL() { return getToken(SQLParser.ALL, 0); } + public TerminalNode ESCAPE() { return getToken(SQLParser.ESCAPE, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode IS() { return getToken(SQLParser.IS, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public TerminalNode TRUE() { return getToken(SQLParser.TRUE, 0); } + public TerminalNode FALSE() { return getToken(SQLParser.FALSE, 0); } + public TerminalNode UNKNOWN() { return getToken(SQLParser.UNKNOWN, 0); } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public TerminalNode DISTINCT() { return getToken(SQLParser.DISTINCT, 0); } + public PredicateContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_predicate; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPredicate(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPredicate(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPredicate(this); + else return visitor.visitChildren(this); + } + } + + public final PredicateContext predicate() throws RecognitionException { + PredicateContext _localctx = new PredicateContext(_ctx, getState()); + enterRule(_localctx, 204, RULE_predicate); + int _la; + try { + setState(2543); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,332,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2462); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2461); + match(NOT); + } + } + + setState(2464); + ((PredicateContext)_localctx).kind = match(BETWEEN); + setState(2465); + ((PredicateContext)_localctx).lower = valueExpression(0); + setState(2466); + match(AND); + setState(2467); + ((PredicateContext)_localctx).upper = valueExpression(0); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2470); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2469); + match(NOT); + } + } + + setState(2472); + ((PredicateContext)_localctx).kind = match(IN); + setState(2473); + match(T__0); + setState(2474); + expression(); + setState(2479); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2475); + match(COMMA); + setState(2476); + expression(); + } + } + setState(2481); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2482); + match(T__1); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(2485); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2484); + match(NOT); + } + } + + setState(2487); + ((PredicateContext)_localctx).kind = match(IN); + setState(2488); + match(T__0); + setState(2489); + query(); + setState(2490); + match(T__1); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(2493); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2492); + match(NOT); + } + } + + setState(2495); + ((PredicateContext)_localctx).kind = match(RLIKE); + setState(2496); + ((PredicateContext)_localctx).pattern = valueExpression(0); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(2498); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2497); + match(NOT); + } + } + + setState(2500); + ((PredicateContext)_localctx).kind = match(LIKE); + setState(2501); + ((PredicateContext)_localctx).quantifier = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ALL || _la==ANY || _la==SOME) ) { + ((PredicateContext)_localctx).quantifier = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2515); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,326,_ctx) ) { + case 1: + { + setState(2502); + match(T__0); + setState(2503); + match(T__1); + } + break; + case 2: + { + setState(2504); + match(T__0); + setState(2505); + expression(); + setState(2510); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2506); + match(COMMA); + setState(2507); + expression(); + } + } + setState(2512); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2513); + match(T__1); + } + break; + } + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(2518); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2517); + match(NOT); + } + } + + setState(2520); + ((PredicateContext)_localctx).kind = match(LIKE); + setState(2521); + ((PredicateContext)_localctx).pattern = valueExpression(0); + setState(2524); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,328,_ctx) ) { + case 1: + { + setState(2522); + match(ESCAPE); + setState(2523); + ((PredicateContext)_localctx).escapeChar = match(STRING); + } + break; + } + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(2526); + match(IS); + setState(2528); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2527); + match(NOT); + } + } + + setState(2530); + ((PredicateContext)_localctx).kind = match(NULL); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(2531); + match(IS); + setState(2533); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2532); + match(NOT); + } + } + + setState(2535); + ((PredicateContext)_localctx).kind = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==FALSE || _la==TRUE || _la==UNKNOWN) ) { + ((PredicateContext)_localctx).kind = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(2536); + match(IS); + setState(2538); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2537); + match(NOT); + } + } + + setState(2540); + ((PredicateContext)_localctx).kind = match(DISTINCT); + setState(2541); + match(FROM); + setState(2542); + ((PredicateContext)_localctx).right = valueExpression(0); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ValueExpressionContext extends ParserRuleContext { + public ValueExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_valueExpression; } + + public ValueExpressionContext() { } + public void copyFrom(ValueExpressionContext ctx) { + super.copyFrom(ctx); + } + } + public static class ValueExpressionDefaultContext extends ValueExpressionContext { + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + public ValueExpressionDefaultContext(ValueExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterValueExpressionDefault(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitValueExpressionDefault(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitValueExpressionDefault(this); + else return visitor.visitChildren(this); + } + } + public static class ComparisonContext extends ValueExpressionContext { + public ValueExpressionContext left; + public ValueExpressionContext right; + public ComparisonOperatorContext comparisonOperator() { + return getRuleContext(ComparisonOperatorContext.class,0); + } + public List valueExpression() { + return getRuleContexts(ValueExpressionContext.class); + } + public ValueExpressionContext valueExpression(int i) { + return getRuleContext(ValueExpressionContext.class,i); + } + public ComparisonContext(ValueExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterComparison(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitComparison(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitComparison(this); + else return visitor.visitChildren(this); + } + } + public static class ArithmeticBinaryContext extends ValueExpressionContext { + public ValueExpressionContext left; + public Token operator; + public ValueExpressionContext right; + public List valueExpression() { + return getRuleContexts(ValueExpressionContext.class); + } + public ValueExpressionContext valueExpression(int i) { + return getRuleContext(ValueExpressionContext.class,i); + } + public TerminalNode ASTERISK() { return getToken(SQLParser.ASTERISK, 0); } + public TerminalNode SLASH() { return getToken(SQLParser.SLASH, 0); } + public TerminalNode PERCENT() { return getToken(SQLParser.PERCENT, 0); } + public TerminalNode DIV() { return getToken(SQLParser.DIV, 0); } + public TerminalNode PLUS() { return getToken(SQLParser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public TerminalNode CONCAT_PIPE() { return getToken(SQLParser.CONCAT_PIPE, 0); } + public TerminalNode AMPERSAND() { return getToken(SQLParser.AMPERSAND, 0); } + public TerminalNode HAT() { return getToken(SQLParser.HAT, 0); } + public TerminalNode PIPE() { return getToken(SQLParser.PIPE, 0); } + public ArithmeticBinaryContext(ValueExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterArithmeticBinary(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitArithmeticBinary(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitArithmeticBinary(this); + else return visitor.visitChildren(this); + } + } + public static class ArithmeticUnaryContext extends ValueExpressionContext { + public Token operator; + public ValueExpressionContext valueExpression() { + return getRuleContext(ValueExpressionContext.class,0); + } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public TerminalNode PLUS() { return getToken(SQLParser.PLUS, 0); } + public TerminalNode TILDE() { return getToken(SQLParser.TILDE, 0); } + public ArithmeticUnaryContext(ValueExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterArithmeticUnary(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitArithmeticUnary(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitArithmeticUnary(this); + else return visitor.visitChildren(this); + } + } + + public final ValueExpressionContext valueExpression() throws RecognitionException { + return valueExpression(0); + } + + private ValueExpressionContext valueExpression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, _parentState); + ValueExpressionContext _prevctx = _localctx; + int _startState = 206; + enterRecursionRule(_localctx, 206, RULE_valueExpression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2549); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,333,_ctx) ) { + case 1: + { + _localctx = new ValueExpressionDefaultContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(2546); + primaryExpression(0); + } + break; + case 2: + { + _localctx = new ArithmeticUnaryContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2547); + ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 275)) & ~0x3f) == 0 && ((1L << (_la - 275)) & ((1L << (PLUS - 275)) | (1L << (MINUS - 275)) | (1L << (TILDE - 275)))) != 0)) ) { + ((ArithmeticUnaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2548); + valueExpression(7); + } + break; + } + _ctx.stop = _input.LT(-1); + setState(2572); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,335,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(2570); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,334,_ctx) ) { + case 1: + { + _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); + ((ArithmeticBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); + setState(2551); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(2552); + ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==DIV || ((((_la - 277)) & ~0x3f) == 0 && ((1L << (_la - 277)) & ((1L << (ASTERISK - 277)) | (1L << (SLASH - 277)) | (1L << (PERCENT - 277)))) != 0)) ) { + ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2553); + ((ArithmeticBinaryContext)_localctx).right = valueExpression(7); + } + break; + case 2: + { + _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); + ((ArithmeticBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); + setState(2554); + if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); + setState(2555); + ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 275)) & ~0x3f) == 0 && ((1L << (_la - 275)) & ((1L << (PLUS - 275)) | (1L << (MINUS - 275)) | (1L << (CONCAT_PIPE - 275)))) != 0)) ) { + ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2556); + ((ArithmeticBinaryContext)_localctx).right = valueExpression(6); + } + break; + case 3: + { + _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); + ((ArithmeticBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); + setState(2557); + if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); + setState(2558); + ((ArithmeticBinaryContext)_localctx).operator = match(AMPERSAND); + setState(2559); + ((ArithmeticBinaryContext)_localctx).right = valueExpression(5); + } + break; + case 4: + { + _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); + ((ArithmeticBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); + setState(2560); + if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); + setState(2561); + ((ArithmeticBinaryContext)_localctx).operator = match(HAT); + setState(2562); + ((ArithmeticBinaryContext)_localctx).right = valueExpression(4); + } + break; + case 5: + { + _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); + ((ArithmeticBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); + setState(2563); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(2564); + ((ArithmeticBinaryContext)_localctx).operator = match(PIPE); + setState(2565); + ((ArithmeticBinaryContext)_localctx).right = valueExpression(3); + } + break; + case 6: + { + _localctx = new ComparisonContext(new ValueExpressionContext(_parentctx, _parentState)); + ((ComparisonContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); + setState(2566); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(2567); + comparisonOperator(); + setState(2568); + ((ComparisonContext)_localctx).right = valueExpression(2); + } + break; + } + } + } + setState(2574); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,335,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + public static class PrimaryExpressionContext extends ParserRuleContext { + public PrimaryExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_primaryExpression; } + + public PrimaryExpressionContext() { } + public void copyFrom(PrimaryExpressionContext ctx) { + super.copyFrom(ctx); + } + } + public static class StructContext extends PrimaryExpressionContext { + public NamedExpressionContext namedExpression; + public List argument = new ArrayList(); + public TerminalNode STRUCT() { return getToken(SQLParser.STRUCT, 0); } + public List namedExpression() { + return getRuleContexts(NamedExpressionContext.class); + } + public NamedExpressionContext namedExpression(int i) { + return getRuleContext(NamedExpressionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public StructContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterStruct(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitStruct(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitStruct(this); + else return visitor.visitChildren(this); + } + } + public static class DereferenceContext extends PrimaryExpressionContext { + public PrimaryExpressionContext base; + public IdentifierContext fieldName; + public TerminalNode POINT() { return getToken(SQLParser.POINT, 0); } + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public DereferenceContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDereference(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDereference(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDereference(this); + else return visitor.visitChildren(this); + } + } + public static class SimpleCaseContext extends PrimaryExpressionContext { + public ExpressionContext value; + public ExpressionContext elseExpression; + public TerminalNode CASE() { return getToken(SQLParser.CASE, 0); } + public TerminalNode END() { return getToken(SQLParser.END, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List whenClause() { + return getRuleContexts(WhenClauseContext.class); + } + public WhenClauseContext whenClause(int i) { + return getRuleContext(WhenClauseContext.class,i); + } + public TerminalNode ELSE() { return getToken(SQLParser.ELSE, 0); } + public SimpleCaseContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSimpleCase(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSimpleCase(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSimpleCase(this); + else return visitor.visitChildren(this); + } + } + public static class CurrentLikeContext extends PrimaryExpressionContext { + public Token name; + public TerminalNode CURRENT_DATE() { return getToken(SQLParser.CURRENT_DATE, 0); } + public TerminalNode CURRENT_TIMESTAMP() { return getToken(SQLParser.CURRENT_TIMESTAMP, 0); } + public TerminalNode CURRENT_USER() { return getToken(SQLParser.CURRENT_USER, 0); } + public CurrentLikeContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCurrentLike(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCurrentLike(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCurrentLike(this); + else return visitor.visitChildren(this); + } + } + public static class ColumnReferenceContext extends PrimaryExpressionContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public ColumnReferenceContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterColumnReference(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitColumnReference(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitColumnReference(this); + else return visitor.visitChildren(this); + } + } + public static class RowConstructorContext extends PrimaryExpressionContext { + public List namedExpression() { + return getRuleContexts(NamedExpressionContext.class); + } + public NamedExpressionContext namedExpression(int i) { + return getRuleContext(NamedExpressionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public RowConstructorContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRowConstructor(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRowConstructor(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRowConstructor(this); + else return visitor.visitChildren(this); + } + } + public static class LastContext extends PrimaryExpressionContext { + public TerminalNode LAST() { return getToken(SQLParser.LAST, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode IGNORE() { return getToken(SQLParser.IGNORE, 0); } + public TerminalNode NULLS() { return getToken(SQLParser.NULLS, 0); } + public LastContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLast(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLast(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLast(this); + else return visitor.visitChildren(this); + } + } + public static class StarContext extends PrimaryExpressionContext { + public TerminalNode ASTERISK() { return getToken(SQLParser.ASTERISK, 0); } + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public TerminalNode POINT() { return getToken(SQLParser.POINT, 0); } + public StarContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterStar(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitStar(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitStar(this); + else return visitor.visitChildren(this); + } + } + public static class OverlayContext extends PrimaryExpressionContext { + public ValueExpressionContext input; + public ValueExpressionContext replace; + public ValueExpressionContext position; + public ValueExpressionContext length; + public TerminalNode OVERLAY() { return getToken(SQLParser.OVERLAY, 0); } + public TerminalNode PLACING() { return getToken(SQLParser.PLACING, 0); } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public List valueExpression() { + return getRuleContexts(ValueExpressionContext.class); + } + public ValueExpressionContext valueExpression(int i) { + return getRuleContext(ValueExpressionContext.class,i); + } + public TerminalNode FOR() { return getToken(SQLParser.FOR, 0); } + public OverlayContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterOverlay(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitOverlay(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitOverlay(this); + else return visitor.visitChildren(this); + } + } + public static class SubscriptContext extends PrimaryExpressionContext { + public PrimaryExpressionContext value; + public ValueExpressionContext index; + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + public ValueExpressionContext valueExpression() { + return getRuleContext(ValueExpressionContext.class,0); + } + public SubscriptContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSubscript(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSubscript(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSubscript(this); + else return visitor.visitChildren(this); + } + } + public static class SubqueryExpressionContext extends PrimaryExpressionContext { + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public SubqueryExpressionContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSubqueryExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSubqueryExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSubqueryExpression(this); + else return visitor.visitChildren(this); + } + } + public static class SubstringContext extends PrimaryExpressionContext { + public ValueExpressionContext str; + public ValueExpressionContext pos; + public ValueExpressionContext len; + public TerminalNode SUBSTR() { return getToken(SQLParser.SUBSTR, 0); } + public TerminalNode SUBSTRING() { return getToken(SQLParser.SUBSTRING, 0); } + public List valueExpression() { + return getRuleContexts(ValueExpressionContext.class); + } + public ValueExpressionContext valueExpression(int i) { + return getRuleContext(ValueExpressionContext.class,i); + } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public TerminalNode FOR() { return getToken(SQLParser.FOR, 0); } + public SubstringContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSubstring(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSubstring(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSubstring(this); + else return visitor.visitChildren(this); + } + } + public static class CastContext extends PrimaryExpressionContext { + public Token name; + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public DataTypeContext dataType() { + return getRuleContext(DataTypeContext.class,0); + } + public TerminalNode CAST() { return getToken(SQLParser.CAST, 0); } + public TerminalNode TRY_CAST() { return getToken(SQLParser.TRY_CAST, 0); } + public CastContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterCast(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitCast(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitCast(this); + else return visitor.visitChildren(this); + } + } + public static class ConstantDefaultContext extends PrimaryExpressionContext { + public ConstantContext constant() { + return getRuleContext(ConstantContext.class,0); + } + public ConstantDefaultContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterConstantDefault(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitConstantDefault(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitConstantDefault(this); + else return visitor.visitChildren(this); + } + } + public static class LambdaContext extends PrimaryExpressionContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public LambdaContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLambda(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLambda(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLambda(this); + else return visitor.visitChildren(this); + } + } + public static class ParenthesizedExpressionContext extends PrimaryExpressionContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ParenthesizedExpressionContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterParenthesizedExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitParenthesizedExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitParenthesizedExpression(this); + else return visitor.visitChildren(this); + } + } + public static class ExtractContext extends PrimaryExpressionContext { + public IdentifierContext field; + public ValueExpressionContext source; + public TerminalNode EXTRACT() { return getToken(SQLParser.EXTRACT, 0); } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public ValueExpressionContext valueExpression() { + return getRuleContext(ValueExpressionContext.class,0); + } + public ExtractContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterExtract(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitExtract(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitExtract(this); + else return visitor.visitChildren(this); + } + } + public static class TrimContext extends PrimaryExpressionContext { + public Token trimOption; + public ValueExpressionContext trimStr; + public ValueExpressionContext srcStr; + public TerminalNode TRIM() { return getToken(SQLParser.TRIM, 0); } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public List valueExpression() { + return getRuleContexts(ValueExpressionContext.class); + } + public ValueExpressionContext valueExpression(int i) { + return getRuleContext(ValueExpressionContext.class,i); + } + public TerminalNode BOTH() { return getToken(SQLParser.BOTH, 0); } + public TerminalNode LEADING() { return getToken(SQLParser.LEADING, 0); } + public TerminalNode TRAILING() { return getToken(SQLParser.TRAILING, 0); } + public TrimContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTrim(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTrim(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTrim(this); + else return visitor.visitChildren(this); + } + } + public static class FunctionCallContext extends PrimaryExpressionContext { + public ExpressionContext expression; + public List argument = new ArrayList(); + public BooleanExpressionContext where; + public Token nullsOption; + public FunctionNameContext functionName() { + return getRuleContext(FunctionNameContext.class,0); + } + public TerminalNode FILTER() { return getToken(SQLParser.FILTER, 0); } + public TerminalNode WHERE() { return getToken(SQLParser.WHERE, 0); } + public TerminalNode NULLS() { return getToken(SQLParser.NULLS, 0); } + public TerminalNode OVER() { return getToken(SQLParser.OVER, 0); } + public WindowSpecContext windowSpec() { + return getRuleContext(WindowSpecContext.class,0); + } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public TerminalNode IGNORE() { return getToken(SQLParser.IGNORE, 0); } + public TerminalNode RESPECT() { return getToken(SQLParser.RESPECT, 0); } + public SetQuantifierContext setQuantifier() { + return getRuleContext(SetQuantifierContext.class,0); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public FunctionCallContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFunctionCall(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFunctionCall(this); + else return visitor.visitChildren(this); + } + } + public static class SearchedCaseContext extends PrimaryExpressionContext { + public ExpressionContext elseExpression; + public TerminalNode CASE() { return getToken(SQLParser.CASE, 0); } + public TerminalNode END() { return getToken(SQLParser.END, 0); } + public List whenClause() { + return getRuleContexts(WhenClauseContext.class); + } + public WhenClauseContext whenClause(int i) { + return getRuleContext(WhenClauseContext.class,i); + } + public TerminalNode ELSE() { return getToken(SQLParser.ELSE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public SearchedCaseContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSearchedCase(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSearchedCase(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSearchedCase(this); + else return visitor.visitChildren(this); + } + } + public static class PositionContext extends PrimaryExpressionContext { + public ValueExpressionContext substr; + public ValueExpressionContext str; + public TerminalNode POSITION() { return getToken(SQLParser.POSITION, 0); } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public List valueExpression() { + return getRuleContexts(ValueExpressionContext.class); + } + public ValueExpressionContext valueExpression(int i) { + return getRuleContext(ValueExpressionContext.class,i); + } + public PositionContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPosition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPosition(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPosition(this); + else return visitor.visitChildren(this); + } + } + public static class FirstContext extends PrimaryExpressionContext { + public TerminalNode FIRST() { return getToken(SQLParser.FIRST, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode IGNORE() { return getToken(SQLParser.IGNORE, 0); } + public TerminalNode NULLS() { return getToken(SQLParser.NULLS, 0); } + public FirstContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFirst(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFirst(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFirst(this); + else return visitor.visitChildren(this); + } + } + + public final PrimaryExpressionContext primaryExpression() throws RecognitionException { + return primaryExpression(0); + } + + private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + PrimaryExpressionContext _localctx = new PrimaryExpressionContext(_ctx, _parentState); + PrimaryExpressionContext _prevctx = _localctx; + int _startState = 208; + enterRecursionRule(_localctx, 208, RULE_primaryExpression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2763); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,356,_ctx) ) { + case 1: + { + _localctx = new CurrentLikeContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(2576); + ((CurrentLikeContext)_localctx).name = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURRENT_DATE) | (1L << CURRENT_TIMESTAMP) | (1L << CURRENT_USER))) != 0)) ) { + ((CurrentLikeContext)_localctx).name = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 2: + { + _localctx = new SearchedCaseContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2577); + match(CASE); + setState(2579); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(2578); + whenClause(); + } + } + setState(2581); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==WHEN ); + setState(2585); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ELSE) { + { + setState(2583); + match(ELSE); + setState(2584); + ((SearchedCaseContext)_localctx).elseExpression = expression(); + } + } + + setState(2587); + match(END); + } + break; + case 3: + { + _localctx = new SimpleCaseContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2589); + match(CASE); + setState(2590); + ((SimpleCaseContext)_localctx).value = expression(); + setState(2592); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(2591); + whenClause(); + } + } + setState(2594); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==WHEN ); + setState(2598); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ELSE) { + { + setState(2596); + match(ELSE); + setState(2597); + ((SimpleCaseContext)_localctx).elseExpression = expression(); + } + } + + setState(2600); + match(END); + } + break; + case 4: + { + _localctx = new CastContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2602); + ((CastContext)_localctx).name = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==CAST || _la==TRY_CAST) ) { + ((CastContext)_localctx).name = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2603); + match(T__0); + setState(2604); + expression(); + setState(2605); + match(AS); + setState(2606); + dataType(); + setState(2607); + match(T__1); + } + break; + case 5: + { + _localctx = new StructContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2609); + match(STRUCT); + setState(2610); + match(T__0); + setState(2619); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,341,_ctx) ) { + case 1: + { + setState(2611); + ((StructContext)_localctx).namedExpression = namedExpression(); + ((StructContext)_localctx).argument.add(((StructContext)_localctx).namedExpression); + setState(2616); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2612); + match(COMMA); + setState(2613); + ((StructContext)_localctx).namedExpression = namedExpression(); + ((StructContext)_localctx).argument.add(((StructContext)_localctx).namedExpression); + } + } + setState(2618); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + } + setState(2621); + match(T__1); + } + break; + case 6: + { + _localctx = new FirstContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2622); + match(FIRST); + setState(2623); + match(T__0); + setState(2624); + expression(); + setState(2627); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IGNORE) { + { + setState(2625); + match(IGNORE); + setState(2626); + match(NULLS); + } + } + + setState(2629); + match(T__1); + } + break; + case 7: + { + _localctx = new LastContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2631); + match(LAST); + setState(2632); + match(T__0); + setState(2633); + expression(); + setState(2636); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IGNORE) { + { + setState(2634); + match(IGNORE); + setState(2635); + match(NULLS); + } + } + + setState(2638); + match(T__1); + } + break; + case 8: + { + _localctx = new PositionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2640); + match(POSITION); + setState(2641); + match(T__0); + setState(2642); + ((PositionContext)_localctx).substr = valueExpression(0); + setState(2643); + match(IN); + setState(2644); + ((PositionContext)_localctx).str = valueExpression(0); + setState(2645); + match(T__1); + } + break; + case 9: + { + _localctx = new ConstantDefaultContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2647); + constant(); + } + break; + case 10: + { + _localctx = new StarContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2648); + match(ASTERISK); + } + break; + case 11: + { + _localctx = new StarContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2649); + qualifiedName(); + setState(2650); + match(POINT); + setState(2651); + match(ASTERISK); + } + break; + case 12: + { + _localctx = new RowConstructorContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2653); + match(T__0); + setState(2654); + namedExpression(); + setState(2657); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(2655); + match(COMMA); + setState(2656); + namedExpression(); + } + } + setState(2659); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==COMMA ); + setState(2661); + match(T__1); + } + break; + case 13: + { + _localctx = new SubqueryExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2663); + match(T__0); + setState(2664); + query(); + setState(2665); + match(T__1); + } + break; + case 14: + { + _localctx = new FunctionCallContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2667); + functionName(); + setState(2668); + match(T__0); + setState(2680); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,347,_ctx) ) { + case 1: + { + setState(2670); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,345,_ctx) ) { + case 1: + { + setState(2669); + setQuantifier(); + } + break; + } + setState(2672); + ((FunctionCallContext)_localctx).expression = expression(); + ((FunctionCallContext)_localctx).argument.add(((FunctionCallContext)_localctx).expression); + setState(2677); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2673); + match(COMMA); + setState(2674); + ((FunctionCallContext)_localctx).expression = expression(); + ((FunctionCallContext)_localctx).argument.add(((FunctionCallContext)_localctx).expression); + } + } + setState(2679); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + } + setState(2682); + match(T__1); + setState(2689); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,348,_ctx) ) { + case 1: + { + setState(2683); + match(FILTER); + setState(2684); + match(T__0); + setState(2685); + match(WHERE); + setState(2686); + ((FunctionCallContext)_localctx).where = booleanExpression(0); + setState(2687); + match(T__1); + } + break; + } + setState(2693); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,349,_ctx) ) { + case 1: + { + setState(2691); + ((FunctionCallContext)_localctx).nullsOption = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==IGNORE || _la==RESPECT) ) { + ((FunctionCallContext)_localctx).nullsOption = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2692); + match(NULLS); + } + break; + } + setState(2697); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,350,_ctx) ) { + case 1: + { + setState(2695); + match(OVER); + setState(2696); + windowSpec(); + } + break; + } + } + break; + case 15: + { + _localctx = new LambdaContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2699); + identifier(); + setState(2700); + match(T__4); + setState(2701); + expression(); + } + break; + case 16: + { + _localctx = new LambdaContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2703); + match(T__0); + setState(2704); + identifier(); + setState(2707); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(2705); + match(COMMA); + setState(2706); + identifier(); + } + } + setState(2709); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==COMMA ); + setState(2711); + match(T__1); + setState(2712); + match(T__4); + setState(2713); + expression(); + } + break; + case 17: + { + _localctx = new ColumnReferenceContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2715); + identifier(); + } + break; + case 18: + { + _localctx = new ParenthesizedExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2716); + match(T__0); + setState(2717); + expression(); + setState(2718); + match(T__1); + } + break; + case 19: + { + _localctx = new ExtractContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2720); + match(EXTRACT); + setState(2721); + match(T__0); + setState(2722); + ((ExtractContext)_localctx).field = identifier(); + setState(2723); + match(FROM); + setState(2724); + ((ExtractContext)_localctx).source = valueExpression(0); + setState(2725); + match(T__1); + } + break; + case 20: + { + _localctx = new SubstringContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2727); + _la = _input.LA(1); + if ( !(_la==SUBSTR || _la==SUBSTRING) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2728); + match(T__0); + setState(2729); + ((SubstringContext)_localctx).str = valueExpression(0); + setState(2730); + _la = _input.LA(1); + if ( !(_la==FROM || _la==COMMA) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2731); + ((SubstringContext)_localctx).pos = valueExpression(0); + setState(2734); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FOR || _la==COMMA) { + { + setState(2732); + _la = _input.LA(1); + if ( !(_la==FOR || _la==COMMA) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2733); + ((SubstringContext)_localctx).len = valueExpression(0); + } + } + + setState(2736); + match(T__1); + } + break; + case 21: + { + _localctx = new TrimContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2738); + match(TRIM); + setState(2739); + match(T__0); + setState(2741); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,353,_ctx) ) { + case 1: + { + setState(2740); + ((TrimContext)_localctx).trimOption = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==BOTH || _la==LEADING || _la==TRAILING) ) { + ((TrimContext)_localctx).trimOption = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + setState(2744); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,354,_ctx) ) { + case 1: + { + setState(2743); + ((TrimContext)_localctx).trimStr = valueExpression(0); + } + break; + } + setState(2746); + match(FROM); + setState(2747); + ((TrimContext)_localctx).srcStr = valueExpression(0); + setState(2748); + match(T__1); + } + break; + case 22: + { + _localctx = new OverlayContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(2750); + match(OVERLAY); + setState(2751); + match(T__0); + setState(2752); + ((OverlayContext)_localctx).input = valueExpression(0); + setState(2753); + match(PLACING); + setState(2754); + ((OverlayContext)_localctx).replace = valueExpression(0); + setState(2755); + match(FROM); + setState(2756); + ((OverlayContext)_localctx).position = valueExpression(0); + setState(2759); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FOR) { + { + setState(2757); + match(FOR); + setState(2758); + ((OverlayContext)_localctx).length = valueExpression(0); + } + } + + setState(2761); + match(T__1); + } + break; + } + _ctx.stop = _input.LT(-1); + setState(2775); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,358,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(2773); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,357,_ctx) ) { + case 1: + { + _localctx = new SubscriptContext(new PrimaryExpressionContext(_parentctx, _parentState)); + ((SubscriptContext)_localctx).value = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_primaryExpression); + setState(2765); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); + setState(2766); + match(T__5); + setState(2767); + ((SubscriptContext)_localctx).index = valueExpression(0); + setState(2768); + match(T__6); + } + break; + case 2: + { + _localctx = new DereferenceContext(new PrimaryExpressionContext(_parentctx, _parentState)); + ((DereferenceContext)_localctx).base = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_primaryExpression); + setState(2770); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(2771); + match(POINT); + setState(2772); + ((DereferenceContext)_localctx).fieldName = identifier(); + } + break; + } + } + } + setState(2777); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,358,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + public static class LimitExpressionContext extends ParserRuleContext { + public Token offset; + public Token rows; + public List INTEGER_VALUE() { return getTokens(SQLParser.INTEGER_VALUE); } + public TerminalNode INTEGER_VALUE(int i) { + return getToken(SQLParser.INTEGER_VALUE, i); + } + public TerminalNode COMMA() { return getToken(SQLParser.COMMA, 0); } + public TerminalNode OFFSET() { return getToken(SQLParser.OFFSET, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public LimitExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_limitExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLimitExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLimitExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLimitExpression(this); + else return visitor.visitChildren(this); + } + } + + public final LimitExpressionContext limitExpression() throws RecognitionException { + LimitExpressionContext _localctx = new LimitExpressionContext(_ctx, getState()); + enterRule(_localctx, 210, RULE_limitExpression); + try { + setState(2787); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,360,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2780); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,359,_ctx) ) { + case 1: + { + setState(2778); + ((LimitExpressionContext)_localctx).offset = match(INTEGER_VALUE); + setState(2779); + match(COMMA); + } + break; + } + setState(2782); + ((LimitExpressionContext)_localctx).rows = match(INTEGER_VALUE); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2783); + ((LimitExpressionContext)_localctx).rows = match(INTEGER_VALUE); + setState(2784); + match(OFFSET); + setState(2785); + ((LimitExpressionContext)_localctx).offset = match(INTEGER_VALUE); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(2786); + booleanExpression(0); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ConstantContext extends ParserRuleContext { + public ConstantContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constant; } + + public ConstantContext() { } + public void copyFrom(ConstantContext ctx) { + super.copyFrom(ctx); + } + } + public static class NullLiteralContext extends ConstantContext { + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public NullLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNullLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNullLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNullLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class StringLiteralContext extends ConstantContext { + public List STRING() { return getTokens(SQLParser.STRING); } + public TerminalNode STRING(int i) { + return getToken(SQLParser.STRING, i); + } + public StringLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterStringLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitStringLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitStringLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class TypeConstructorContext extends ConstantContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TypeConstructorContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTypeConstructor(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTypeConstructor(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTypeConstructor(this); + else return visitor.visitChildren(this); + } + } + public static class IntervalLiteralContext extends ConstantContext { + public IntervalContext interval() { + return getRuleContext(IntervalContext.class,0); + } + public IntervalLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIntervalLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIntervalLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIntervalLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class NumericLiteralContext extends ConstantContext { + public NumberContext number() { + return getRuleContext(NumberContext.class,0); + } + public NumericLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNumericLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNumericLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNumericLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class BooleanLiteralContext extends ConstantContext { + public BooleanValueContext booleanValue() { + return getRuleContext(BooleanValueContext.class,0); + } + public BooleanLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterBooleanLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitBooleanLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitBooleanLiteral(this); + else return visitor.visitChildren(this); + } + } + + public final ConstantContext constant() throws RecognitionException { + ConstantContext _localctx = new ConstantContext(_ctx, getState()); + enterRule(_localctx, 212, RULE_constant); + try { + int _alt; + setState(2801); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,362,_ctx) ) { + case 1: + _localctx = new NullLiteralContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(2789); + match(NULL); + } + break; + case 2: + _localctx = new IntervalLiteralContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(2790); + interval(); + } + break; + case 3: + _localctx = new TypeConstructorContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(2791); + identifier(); + setState(2792); + match(STRING); + } + break; + case 4: + _localctx = new NumericLiteralContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(2794); + number(); + } + break; + case 5: + _localctx = new BooleanLiteralContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(2795); + booleanValue(); + } + break; + case 6: + _localctx = new StringLiteralContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(2797); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(2796); + match(STRING); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(2799); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,361,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ComparisonOperatorContext extends ParserRuleContext { + public TerminalNode EQ() { return getToken(SQLParser.EQ, 0); } + public TerminalNode NEQ() { return getToken(SQLParser.NEQ, 0); } + public TerminalNode NEQJ() { return getToken(SQLParser.NEQJ, 0); } + public TerminalNode LT() { return getToken(SQLParser.LT, 0); } + public TerminalNode LTE() { return getToken(SQLParser.LTE, 0); } + public TerminalNode GT() { return getToken(SQLParser.GT, 0); } + public TerminalNode GTE() { return getToken(SQLParser.GTE, 0); } + public TerminalNode NSEQ() { return getToken(SQLParser.NSEQ, 0); } + public ComparisonOperatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_comparisonOperator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterComparisonOperator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitComparisonOperator(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitComparisonOperator(this); + else return visitor.visitChildren(this); + } + } + + public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { + ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); + enterRule(_localctx, 214, RULE_comparisonOperator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2803); + _la = _input.LA(1); + if ( !(((((_la - 267)) & ~0x3f) == 0 && ((1L << (_la - 267)) & ((1L << (EQ - 267)) | (1L << (NSEQ - 267)) | (1L << (NEQ - 267)) | (1L << (NEQJ - 267)) | (1L << (LT - 267)) | (1L << (LTE - 267)) | (1L << (GT - 267)) | (1L << (GTE - 267)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ArithmeticOperatorContext extends ParserRuleContext { + public TerminalNode PLUS() { return getToken(SQLParser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public TerminalNode ASTERISK() { return getToken(SQLParser.ASTERISK, 0); } + public TerminalNode SLASH() { return getToken(SQLParser.SLASH, 0); } + public TerminalNode PERCENT() { return getToken(SQLParser.PERCENT, 0); } + public TerminalNode DIV() { return getToken(SQLParser.DIV, 0); } + public TerminalNode TILDE() { return getToken(SQLParser.TILDE, 0); } + public TerminalNode AMPERSAND() { return getToken(SQLParser.AMPERSAND, 0); } + public TerminalNode PIPE() { return getToken(SQLParser.PIPE, 0); } + public TerminalNode CONCAT_PIPE() { return getToken(SQLParser.CONCAT_PIPE, 0); } + public TerminalNode HAT() { return getToken(SQLParser.HAT, 0); } + public ArithmeticOperatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arithmeticOperator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterArithmeticOperator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitArithmeticOperator(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitArithmeticOperator(this); + else return visitor.visitChildren(this); + } + } + + public final ArithmeticOperatorContext arithmeticOperator() throws RecognitionException { + ArithmeticOperatorContext _localctx = new ArithmeticOperatorContext(_ctx, getState()); + enterRule(_localctx, 216, RULE_arithmeticOperator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2805); + _la = _input.LA(1); + if ( !(_la==DIV || ((((_la - 275)) & ~0x3f) == 0 && ((1L << (_la - 275)) & ((1L << (PLUS - 275)) | (1L << (MINUS - 275)) | (1L << (ASTERISK - 275)) | (1L << (SLASH - 275)) | (1L << (PERCENT - 275)) | (1L << (TILDE - 275)) | (1L << (AMPERSAND - 275)) | (1L << (PIPE - 275)) | (1L << (CONCAT_PIPE - 275)) | (1L << (HAT - 275)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PredicateOperatorContext extends ParserRuleContext { + public TerminalNode OR() { return getToken(SQLParser.OR, 0); } + public TerminalNode AND() { return getToken(SQLParser.AND, 0); } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public PredicateOperatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_predicateOperator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPredicateOperator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPredicateOperator(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPredicateOperator(this); + else return visitor.visitChildren(this); + } + } + + public final PredicateOperatorContext predicateOperator() throws RecognitionException { + PredicateOperatorContext _localctx = new PredicateOperatorContext(_ctx, getState()); + enterRule(_localctx, 218, RULE_predicateOperator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2807); + _la = _input.LA(1); + if ( !(_la==AND || ((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (IN - 110)) | (1L << (NOT - 110)) | (1L << (OR - 110)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BooleanValueContext extends ParserRuleContext { + public TerminalNode TRUE() { return getToken(SQLParser.TRUE, 0); } + public TerminalNode FALSE() { return getToken(SQLParser.FALSE, 0); } + public BooleanValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_booleanValue; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterBooleanValue(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitBooleanValue(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitBooleanValue(this); + else return visitor.visitChildren(this); + } + } + + public final BooleanValueContext booleanValue() throws RecognitionException { + BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); + enterRule(_localctx, 220, RULE_booleanValue); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2809); + _la = _input.LA(1); + if ( !(_la==FALSE || _la==TRUE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IntervalContext extends ParserRuleContext { + public TerminalNode INTERVAL() { return getToken(SQLParser.INTERVAL, 0); } + public ErrorCapturingMultiUnitsIntervalContext errorCapturingMultiUnitsInterval() { + return getRuleContext(ErrorCapturingMultiUnitsIntervalContext.class,0); + } + public ErrorCapturingUnitToUnitIntervalContext errorCapturingUnitToUnitInterval() { + return getRuleContext(ErrorCapturingUnitToUnitIntervalContext.class,0); + } + public IntervalContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interval; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterInterval(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitInterval(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitInterval(this); + else return visitor.visitChildren(this); + } + } + + public final IntervalContext interval() throws RecognitionException { + IntervalContext _localctx = new IntervalContext(_ctx, getState()); + enterRule(_localctx, 222, RULE_interval); + try { + enterOuterAlt(_localctx, 1); + { + setState(2811); + match(INTERVAL); + setState(2814); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,363,_ctx) ) { + case 1: + { + setState(2812); + errorCapturingMultiUnitsInterval(); + } + break; + case 2: + { + setState(2813); + errorCapturingUnitToUnitInterval(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ErrorCapturingMultiUnitsIntervalContext extends ParserRuleContext { + public MultiUnitsIntervalContext body; + public MultiUnitsIntervalContext multiUnitsInterval() { + return getRuleContext(MultiUnitsIntervalContext.class,0); + } + public UnitToUnitIntervalContext unitToUnitInterval() { + return getRuleContext(UnitToUnitIntervalContext.class,0); + } + public ErrorCapturingMultiUnitsIntervalContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_errorCapturingMultiUnitsInterval; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterErrorCapturingMultiUnitsInterval(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitErrorCapturingMultiUnitsInterval(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitErrorCapturingMultiUnitsInterval(this); + else return visitor.visitChildren(this); + } + } + + public final ErrorCapturingMultiUnitsIntervalContext errorCapturingMultiUnitsInterval() throws RecognitionException { + ErrorCapturingMultiUnitsIntervalContext _localctx = new ErrorCapturingMultiUnitsIntervalContext(_ctx, getState()); + enterRule(_localctx, 224, RULE_errorCapturingMultiUnitsInterval); + try { + enterOuterAlt(_localctx, 1); + { + setState(2816); + ((ErrorCapturingMultiUnitsIntervalContext)_localctx).body = multiUnitsInterval(); + setState(2818); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,364,_ctx) ) { + case 1: + { + setState(2817); + unitToUnitInterval(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MultiUnitsIntervalContext extends ParserRuleContext { + public IdentifierContext identifier; + public List unit = new ArrayList(); + public List intervalValue() { + return getRuleContexts(IntervalValueContext.class); + } + public IntervalValueContext intervalValue(int i) { + return getRuleContext(IntervalValueContext.class,i); + } + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public MultiUnitsIntervalContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiUnitsInterval; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterMultiUnitsInterval(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitMultiUnitsInterval(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitMultiUnitsInterval(this); + else return visitor.visitChildren(this); + } + } + + public final MultiUnitsIntervalContext multiUnitsInterval() throws RecognitionException { + MultiUnitsIntervalContext _localctx = new MultiUnitsIntervalContext(_ctx, getState()); + enterRule(_localctx, 226, RULE_multiUnitsInterval); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2823); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(2820); + intervalValue(); + setState(2821); + ((MultiUnitsIntervalContext)_localctx).identifier = identifier(); + ((MultiUnitsIntervalContext)_localctx).unit.add(((MultiUnitsIntervalContext)_localctx).identifier); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(2825); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,365,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ErrorCapturingUnitToUnitIntervalContext extends ParserRuleContext { + public UnitToUnitIntervalContext body; + public MultiUnitsIntervalContext error1; + public UnitToUnitIntervalContext error2; + public List unitToUnitInterval() { + return getRuleContexts(UnitToUnitIntervalContext.class); + } + public UnitToUnitIntervalContext unitToUnitInterval(int i) { + return getRuleContext(UnitToUnitIntervalContext.class,i); + } + public MultiUnitsIntervalContext multiUnitsInterval() { + return getRuleContext(MultiUnitsIntervalContext.class,0); + } + public ErrorCapturingUnitToUnitIntervalContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_errorCapturingUnitToUnitInterval; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterErrorCapturingUnitToUnitInterval(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitErrorCapturingUnitToUnitInterval(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitErrorCapturingUnitToUnitInterval(this); + else return visitor.visitChildren(this); + } + } + + public final ErrorCapturingUnitToUnitIntervalContext errorCapturingUnitToUnitInterval() throws RecognitionException { + ErrorCapturingUnitToUnitIntervalContext _localctx = new ErrorCapturingUnitToUnitIntervalContext(_ctx, getState()); + enterRule(_localctx, 228, RULE_errorCapturingUnitToUnitInterval); + try { + enterOuterAlt(_localctx, 1); + { + setState(2827); + ((ErrorCapturingUnitToUnitIntervalContext)_localctx).body = unitToUnitInterval(); + setState(2830); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,366,_ctx) ) { + case 1: + { + setState(2828); + ((ErrorCapturingUnitToUnitIntervalContext)_localctx).error1 = multiUnitsInterval(); + } + break; + case 2: + { + setState(2829); + ((ErrorCapturingUnitToUnitIntervalContext)_localctx).error2 = unitToUnitInterval(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class UnitToUnitIntervalContext extends ParserRuleContext { + public IntervalValueContext value; + public IdentifierContext from; + public IdentifierContext to; + public TerminalNode TO() { return getToken(SQLParser.TO, 0); } + public IntervalValueContext intervalValue() { + return getRuleContext(IntervalValueContext.class,0); + } + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public UnitToUnitIntervalContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_unitToUnitInterval; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterUnitToUnitInterval(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitUnitToUnitInterval(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitUnitToUnitInterval(this); + else return visitor.visitChildren(this); + } + } + + public final UnitToUnitIntervalContext unitToUnitInterval() throws RecognitionException { + UnitToUnitIntervalContext _localctx = new UnitToUnitIntervalContext(_ctx, getState()); + enterRule(_localctx, 230, RULE_unitToUnitInterval); + try { + enterOuterAlt(_localctx, 1); + { + setState(2832); + ((UnitToUnitIntervalContext)_localctx).value = intervalValue(); + setState(2833); + ((UnitToUnitIntervalContext)_localctx).from = identifier(); + setState(2834); + match(TO); + setState(2835); + ((UnitToUnitIntervalContext)_localctx).to = identifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IntervalValueContext extends ParserRuleContext { + public TerminalNode INTEGER_VALUE() { return getToken(SQLParser.INTEGER_VALUE, 0); } + public TerminalNode DECIMAL_VALUE() { return getToken(SQLParser.DECIMAL_VALUE, 0); } + public TerminalNode STRING() { return getToken(SQLParser.STRING, 0); } + public TerminalNode PLUS() { return getToken(SQLParser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public IntervalValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_intervalValue; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIntervalValue(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIntervalValue(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIntervalValue(this); + else return visitor.visitChildren(this); + } + } + + public final IntervalValueContext intervalValue() throws RecognitionException { + IntervalValueContext _localctx = new IntervalValueContext(_ctx, getState()); + enterRule(_localctx, 232, RULE_intervalValue); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2838); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PLUS || _la==MINUS) { + { + setState(2837); + _la = _input.LA(1); + if ( !(_la==PLUS || _la==MINUS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + setState(2840); + _la = _input.LA(1); + if ( !(((((_la - 291)) & ~0x3f) == 0 && ((1L << (_la - 291)) & ((1L << (STRING - 291)) | (1L << (INTEGER_VALUE - 291)) | (1L << (DECIMAL_VALUE - 291)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ColPositionContext extends ParserRuleContext { + public Token position; + public ErrorCapturingIdentifierContext afterCol; + public TerminalNode FIRST() { return getToken(SQLParser.FIRST, 0); } + public TerminalNode AFTER() { return getToken(SQLParser.AFTER, 0); } + public ErrorCapturingIdentifierContext errorCapturingIdentifier() { + return getRuleContext(ErrorCapturingIdentifierContext.class,0); + } + public ColPositionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_colPosition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterColPosition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitColPosition(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitColPosition(this); + else return visitor.visitChildren(this); + } + } + + public final ColPositionContext colPosition() throws RecognitionException { + ColPositionContext _localctx = new ColPositionContext(_ctx, getState()); + enterRule(_localctx, 234, RULE_colPosition); + try { + setState(2845); + _errHandler.sync(this); + switch (_input.LA(1)) { + case FIRST: + enterOuterAlt(_localctx, 1); + { + setState(2842); + ((ColPositionContext)_localctx).position = match(FIRST); + } + break; + case AFTER: + enterOuterAlt(_localctx, 2); + { + setState(2843); + ((ColPositionContext)_localctx).position = match(AFTER); + setState(2844); + ((ColPositionContext)_localctx).afterCol = errorCapturingIdentifier(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DataTypeContext extends ParserRuleContext { + public DataTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dataType; } + + public DataTypeContext() { } + public void copyFrom(DataTypeContext ctx) { + super.copyFrom(ctx); + } + } + public static class ComplexDataTypeContext extends DataTypeContext { + public Token complex; + public TerminalNode LT() { return getToken(SQLParser.LT, 0); } + public List dataType() { + return getRuleContexts(DataTypeContext.class); + } + public DataTypeContext dataType(int i) { + return getRuleContext(DataTypeContext.class,i); + } + public TerminalNode GT() { return getToken(SQLParser.GT, 0); } + public TerminalNode ARRAY() { return getToken(SQLParser.ARRAY, 0); } + public TerminalNode COMMA() { return getToken(SQLParser.COMMA, 0); } + public TerminalNode MAP() { return getToken(SQLParser.MAP, 0); } + public TerminalNode STRUCT() { return getToken(SQLParser.STRUCT, 0); } + public TerminalNode NEQ() { return getToken(SQLParser.NEQ, 0); } + public ComplexColTypeListContext complexColTypeList() { + return getRuleContext(ComplexColTypeListContext.class,0); + } + public ComplexDataTypeContext(DataTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterComplexDataType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitComplexDataType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitComplexDataType(this); + else return visitor.visitChildren(this); + } + } + public static class YearMonthIntervalDataTypeContext extends DataTypeContext { + public Token from; + public Token to; + public TerminalNode INTERVAL() { return getToken(SQLParser.INTERVAL, 0); } + public TerminalNode YEAR() { return getToken(SQLParser.YEAR, 0); } + public List MONTH() { return getTokens(SQLParser.MONTH); } + public TerminalNode MONTH(int i) { + return getToken(SQLParser.MONTH, i); + } + public TerminalNode TO() { return getToken(SQLParser.TO, 0); } + public YearMonthIntervalDataTypeContext(DataTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterYearMonthIntervalDataType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitYearMonthIntervalDataType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitYearMonthIntervalDataType(this); + else return visitor.visitChildren(this); + } + } + public static class DayTimeIntervalDataTypeContext extends DataTypeContext { + public Token from; + public Token to; + public TerminalNode INTERVAL() { return getToken(SQLParser.INTERVAL, 0); } + public TerminalNode DAY() { return getToken(SQLParser.DAY, 0); } + public List HOUR() { return getTokens(SQLParser.HOUR); } + public TerminalNode HOUR(int i) { + return getToken(SQLParser.HOUR, i); + } + public List MINUTE() { return getTokens(SQLParser.MINUTE); } + public TerminalNode MINUTE(int i) { + return getToken(SQLParser.MINUTE, i); + } + public List SECOND() { return getTokens(SQLParser.SECOND); } + public TerminalNode SECOND(int i) { + return getToken(SQLParser.SECOND, i); + } + public TerminalNode TO() { return getToken(SQLParser.TO, 0); } + public DayTimeIntervalDataTypeContext(DataTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDayTimeIntervalDataType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDayTimeIntervalDataType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDayTimeIntervalDataType(this); + else return visitor.visitChildren(this); + } + } + public static class PrimitiveDataTypeContext extends DataTypeContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public List INTEGER_VALUE() { return getTokens(SQLParser.INTEGER_VALUE); } + public TerminalNode INTEGER_VALUE(int i) { + return getToken(SQLParser.INTEGER_VALUE, i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public PrimitiveDataTypeContext(DataTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterPrimitiveDataType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitPrimitiveDataType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitPrimitiveDataType(this); + else return visitor.visitChildren(this); + } + } + + public final DataTypeContext dataType() throws RecognitionException { + DataTypeContext _localctx = new DataTypeContext(_ctx, getState()); + enterRule(_localctx, 236, RULE_dataType); + int _la; + try { + setState(2893); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,375,_ctx) ) { + case 1: + _localctx = new ComplexDataTypeContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(2847); + ((ComplexDataTypeContext)_localctx).complex = match(ARRAY); + setState(2848); + match(LT); + setState(2849); + dataType(); + setState(2850); + match(GT); + } + break; + case 2: + _localctx = new ComplexDataTypeContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(2852); + ((ComplexDataTypeContext)_localctx).complex = match(MAP); + setState(2853); + match(LT); + setState(2854); + dataType(); + setState(2855); + match(COMMA); + setState(2856); + dataType(); + setState(2857); + match(GT); + } + break; + case 3: + _localctx = new ComplexDataTypeContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(2859); + ((ComplexDataTypeContext)_localctx).complex = match(STRUCT); + setState(2866); + _errHandler.sync(this); + switch (_input.LA(1)) { + case LT: + { + setState(2860); + match(LT); + setState(2862); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,369,_ctx) ) { + case 1: + { + setState(2861); + complexColTypeList(); + } + break; + } + setState(2864); + match(GT); + } + break; + case NEQ: + { + setState(2865); + match(NEQ); + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + case 4: + _localctx = new YearMonthIntervalDataTypeContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(2868); + match(INTERVAL); + setState(2869); + ((YearMonthIntervalDataTypeContext)_localctx).from = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==MONTH || _la==YEAR) ) { + ((YearMonthIntervalDataTypeContext)_localctx).from = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2872); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,371,_ctx) ) { + case 1: + { + setState(2870); + match(TO); + setState(2871); + ((YearMonthIntervalDataTypeContext)_localctx).to = match(MONTH); + } + break; + } + } + break; + case 5: + _localctx = new DayTimeIntervalDataTypeContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(2874); + match(INTERVAL); + setState(2875); + ((DayTimeIntervalDataTypeContext)_localctx).from = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==DAY || _la==HOUR || _la==MINUTE || _la==SECOND) ) { + ((DayTimeIntervalDataTypeContext)_localctx).from = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2878); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,372,_ctx) ) { + case 1: + { + setState(2876); + match(TO); + setState(2877); + ((DayTimeIntervalDataTypeContext)_localctx).to = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==HOUR || _la==MINUTE || _la==SECOND) ) { + ((DayTimeIntervalDataTypeContext)_localctx).to = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + } + break; + case 6: + _localctx = new PrimitiveDataTypeContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(2880); + identifier(); + setState(2891); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,374,_ctx) ) { + case 1: + { + setState(2881); + match(T__0); + setState(2882); + match(INTEGER_VALUE); + setState(2887); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2883); + match(COMMA); + setState(2884); + match(INTEGER_VALUE); + } + } + setState(2889); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2890); + match(T__1); + } + break; + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QualifiedColTypeWithPositionListContext extends ParserRuleContext { + public List qualifiedColTypeWithPosition() { + return getRuleContexts(QualifiedColTypeWithPositionContext.class); + } + public QualifiedColTypeWithPositionContext qualifiedColTypeWithPosition(int i) { + return getRuleContext(QualifiedColTypeWithPositionContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public QualifiedColTypeWithPositionListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedColTypeWithPositionList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQualifiedColTypeWithPositionList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQualifiedColTypeWithPositionList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQualifiedColTypeWithPositionList(this); + else return visitor.visitChildren(this); + } + } + + public final QualifiedColTypeWithPositionListContext qualifiedColTypeWithPositionList() throws RecognitionException { + QualifiedColTypeWithPositionListContext _localctx = new QualifiedColTypeWithPositionListContext(_ctx, getState()); + enterRule(_localctx, 238, RULE_qualifiedColTypeWithPositionList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2895); + qualifiedColTypeWithPosition(); + setState(2900); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2896); + match(COMMA); + setState(2897); + qualifiedColTypeWithPosition(); + } + } + setState(2902); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QualifiedColTypeWithPositionContext extends ParserRuleContext { + public MultipartIdentifierContext name; + public DataTypeContext dataType() { + return getRuleContext(DataTypeContext.class,0); + } + public MultipartIdentifierContext multipartIdentifier() { + return getRuleContext(MultipartIdentifierContext.class,0); + } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public CommentSpecContext commentSpec() { + return getRuleContext(CommentSpecContext.class,0); + } + public ColPositionContext colPosition() { + return getRuleContext(ColPositionContext.class,0); + } + public QualifiedColTypeWithPositionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedColTypeWithPosition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQualifiedColTypeWithPosition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQualifiedColTypeWithPosition(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQualifiedColTypeWithPosition(this); + else return visitor.visitChildren(this); + } + } + + public final QualifiedColTypeWithPositionContext qualifiedColTypeWithPosition() throws RecognitionException { + QualifiedColTypeWithPositionContext _localctx = new QualifiedColTypeWithPositionContext(_ctx, getState()); + enterRule(_localctx, 240, RULE_qualifiedColTypeWithPosition); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2903); + ((QualifiedColTypeWithPositionContext)_localctx).name = multipartIdentifier(); + setState(2904); + dataType(); + setState(2907); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2905); + match(NOT); + setState(2906); + match(NULL); + } + } + + setState(2910); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMENT) { + { + setState(2909); + commentSpec(); + } + } + + setState(2913); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AFTER || _la==FIRST) { + { + setState(2912); + colPosition(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ColTypeListContext extends ParserRuleContext { + public List colType() { + return getRuleContexts(ColTypeContext.class); + } + public ColTypeContext colType(int i) { + return getRuleContext(ColTypeContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public ColTypeListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_colTypeList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterColTypeList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitColTypeList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitColTypeList(this); + else return visitor.visitChildren(this); + } + } + + public final ColTypeListContext colTypeList() throws RecognitionException { + ColTypeListContext _localctx = new ColTypeListContext(_ctx, getState()); + enterRule(_localctx, 242, RULE_colTypeList); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2915); + colType(); + setState(2920); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,380,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2916); + match(COMMA); + setState(2917); + colType(); + } + } + } + setState(2922); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,380,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ColTypeContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext colName; + public DataTypeContext dataType() { + return getRuleContext(DataTypeContext.class,0); + } + public ErrorCapturingIdentifierContext errorCapturingIdentifier() { + return getRuleContext(ErrorCapturingIdentifierContext.class,0); + } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public CommentSpecContext commentSpec() { + return getRuleContext(CommentSpecContext.class,0); + } + public ColTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_colType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterColType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitColType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitColType(this); + else return visitor.visitChildren(this); + } + } + + public final ColTypeContext colType() throws RecognitionException { + ColTypeContext _localctx = new ColTypeContext(_ctx, getState()); + enterRule(_localctx, 244, RULE_colType); + try { + enterOuterAlt(_localctx, 1); + { + setState(2923); + ((ColTypeContext)_localctx).colName = errorCapturingIdentifier(); + setState(2924); + dataType(); + setState(2927); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,381,_ctx) ) { + case 1: + { + setState(2925); + match(NOT); + setState(2926); + match(NULL); + } + break; + } + setState(2930); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,382,_ctx) ) { + case 1: + { + setState(2929); + commentSpec(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ComplexColTypeListContext extends ParserRuleContext { + public List complexColType() { + return getRuleContexts(ComplexColTypeContext.class); + } + public ComplexColTypeContext complexColType(int i) { + return getRuleContext(ComplexColTypeContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public ComplexColTypeListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_complexColTypeList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterComplexColTypeList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitComplexColTypeList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitComplexColTypeList(this); + else return visitor.visitChildren(this); + } + } + + public final ComplexColTypeListContext complexColTypeList() throws RecognitionException { + ComplexColTypeListContext _localctx = new ComplexColTypeListContext(_ctx, getState()); + enterRule(_localctx, 246, RULE_complexColTypeList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2932); + complexColType(); + setState(2937); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2933); + match(COMMA); + setState(2934); + complexColType(); + } + } + setState(2939); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ComplexColTypeContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public DataTypeContext dataType() { + return getRuleContext(DataTypeContext.class,0); + } + public TerminalNode COLON() { return getToken(SQLParser.COLON, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public CommentSpecContext commentSpec() { + return getRuleContext(CommentSpecContext.class,0); + } + public ComplexColTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_complexColType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterComplexColType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitComplexColType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitComplexColType(this); + else return visitor.visitChildren(this); + } + } + + public final ComplexColTypeContext complexColType() throws RecognitionException { + ComplexColTypeContext _localctx = new ComplexColTypeContext(_ctx, getState()); + enterRule(_localctx, 248, RULE_complexColType); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2940); + identifier(); + setState(2942); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,384,_ctx) ) { + case 1: + { + setState(2941); + match(COLON); + } + break; + } + setState(2944); + dataType(); + setState(2947); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(2945); + match(NOT); + setState(2946); + match(NULL); + } + } + + setState(2950); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMENT) { + { + setState(2949); + commentSpec(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class WhenClauseContext extends ParserRuleContext { + public ExpressionContext condition; + public ExpressionContext result; + public TerminalNode WHEN() { return getToken(SQLParser.WHEN, 0); } + public TerminalNode THEN() { return getToken(SQLParser.THEN, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public WhenClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_whenClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterWhenClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitWhenClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitWhenClause(this); + else return visitor.visitChildren(this); + } + } + + public final WhenClauseContext whenClause() throws RecognitionException { + WhenClauseContext _localctx = new WhenClauseContext(_ctx, getState()); + enterRule(_localctx, 250, RULE_whenClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(2952); + match(WHEN); + setState(2953); + ((WhenClauseContext)_localctx).condition = expression(); + setState(2954); + match(THEN); + setState(2955); + ((WhenClauseContext)_localctx).result = expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class WindowClauseContext extends ParserRuleContext { + public TerminalNode WINDOW() { return getToken(SQLParser.WINDOW, 0); } + public List namedWindow() { + return getRuleContexts(NamedWindowContext.class); + } + public NamedWindowContext namedWindow(int i) { + return getRuleContext(NamedWindowContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public WindowClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_windowClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterWindowClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitWindowClause(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitWindowClause(this); + else return visitor.visitChildren(this); + } + } + + public final WindowClauseContext windowClause() throws RecognitionException { + WindowClauseContext _localctx = new WindowClauseContext(_ctx, getState()); + enterRule(_localctx, 252, RULE_windowClause); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2957); + match(WINDOW); + setState(2958); + namedWindow(); + setState(2963); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,387,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2959); + match(COMMA); + setState(2960); + namedWindow(); + } + } + } + setState(2965); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,387,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NamedWindowContext extends ParserRuleContext { + public ErrorCapturingIdentifierContext name; + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public WindowSpecContext windowSpec() { + return getRuleContext(WindowSpecContext.class,0); + } + public ErrorCapturingIdentifierContext errorCapturingIdentifier() { + return getRuleContext(ErrorCapturingIdentifierContext.class,0); + } + public NamedWindowContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namedWindow; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNamedWindow(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNamedWindow(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNamedWindow(this); + else return visitor.visitChildren(this); + } + } + + public final NamedWindowContext namedWindow() throws RecognitionException { + NamedWindowContext _localctx = new NamedWindowContext(_ctx, getState()); + enterRule(_localctx, 254, RULE_namedWindow); + try { + enterOuterAlt(_localctx, 1); + { + setState(2966); + ((NamedWindowContext)_localctx).name = errorCapturingIdentifier(); + setState(2967); + match(AS); + setState(2968); + windowSpec(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class WindowSpecContext extends ParserRuleContext { + public WindowSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_windowSpec; } + + public WindowSpecContext() { } + public void copyFrom(WindowSpecContext ctx) { + super.copyFrom(ctx); + } + } + public static class WindowRefContext extends WindowSpecContext { + public ErrorCapturingIdentifierContext name; + public ErrorCapturingIdentifierContext errorCapturingIdentifier() { + return getRuleContext(ErrorCapturingIdentifierContext.class,0); + } + public WindowRefContext(WindowSpecContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterWindowRef(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitWindowRef(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitWindowRef(this); + else return visitor.visitChildren(this); + } + } + public static class WindowDefContext extends WindowSpecContext { + public ExpressionContext expression; + public List partition = new ArrayList(); + public TerminalNode CLUSTER() { return getToken(SQLParser.CLUSTER, 0); } + public List BY() { return getTokens(SQLParser.BY); } + public TerminalNode BY(int i) { + return getToken(SQLParser.BY, i); + } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public WindowFrameContext windowFrame() { + return getRuleContext(WindowFrameContext.class,0); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public List sortItem() { + return getRuleContexts(SortItemContext.class); + } + public SortItemContext sortItem(int i) { + return getRuleContext(SortItemContext.class,i); + } + public TerminalNode PARTITION() { return getToken(SQLParser.PARTITION, 0); } + public TerminalNode DISTRIBUTE() { return getToken(SQLParser.DISTRIBUTE, 0); } + public TerminalNode ORDER() { return getToken(SQLParser.ORDER, 0); } + public TerminalNode SORT() { return getToken(SQLParser.SORT, 0); } + public WindowDefContext(WindowSpecContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterWindowDef(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitWindowDef(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitWindowDef(this); + else return visitor.visitChildren(this); + } + } + + public final WindowSpecContext windowSpec() throws RecognitionException { + WindowSpecContext _localctx = new WindowSpecContext(_ctx, getState()); + enterRule(_localctx, 256, RULE_windowSpec); + int _la; + try { + setState(3016); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,395,_ctx) ) { + case 1: + _localctx = new WindowRefContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(2970); + ((WindowRefContext)_localctx).name = errorCapturingIdentifier(); + } + break; + case 2: + _localctx = new WindowRefContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(2971); + match(T__0); + setState(2972); + ((WindowRefContext)_localctx).name = errorCapturingIdentifier(); + setState(2973); + match(T__1); + } + break; + case 3: + _localctx = new WindowDefContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(2975); + match(T__0); + setState(3010); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CLUSTER: + { + setState(2976); + match(CLUSTER); + setState(2977); + match(BY); + setState(2978); + ((WindowDefContext)_localctx).expression = expression(); + ((WindowDefContext)_localctx).partition.add(((WindowDefContext)_localctx).expression); + setState(2983); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2979); + match(COMMA); + setState(2980); + ((WindowDefContext)_localctx).expression = expression(); + ((WindowDefContext)_localctx).partition.add(((WindowDefContext)_localctx).expression); + } + } + setState(2985); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + case T__1: + case DISTRIBUTE: + case ORDER: + case PARTITION: + case RANGE: + case ROWS: + case SORT: + { + setState(2996); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==DISTRIBUTE || _la==PARTITION) { + { + setState(2986); + _la = _input.LA(1); + if ( !(_la==DISTRIBUTE || _la==PARTITION) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2987); + match(BY); + setState(2988); + ((WindowDefContext)_localctx).expression = expression(); + ((WindowDefContext)_localctx).partition.add(((WindowDefContext)_localctx).expression); + setState(2993); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2989); + match(COMMA); + setState(2990); + ((WindowDefContext)_localctx).expression = expression(); + ((WindowDefContext)_localctx).partition.add(((WindowDefContext)_localctx).expression); + } + } + setState(2995); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(3008); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ORDER || _la==SORT) { + { + setState(2998); + _la = _input.LA(1); + if ( !(_la==ORDER || _la==SORT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(2999); + match(BY); + setState(3000); + sortItem(); + setState(3005); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(3001); + match(COMMA); + setState(3002); + sortItem(); + } + } + setState(3007); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + } + break; + default: + throw new NoViableAltException(this); + } + setState(3013); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==RANGE || _la==ROWS) { + { + setState(3012); + windowFrame(); + } + } + + setState(3015); + match(T__1); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class WindowFrameContext extends ParserRuleContext { + public Token frameType; + public FrameBoundContext start; + public FrameBoundContext end; + public TerminalNode RANGE() { return getToken(SQLParser.RANGE, 0); } + public List frameBound() { + return getRuleContexts(FrameBoundContext.class); + } + public FrameBoundContext frameBound(int i) { + return getRuleContext(FrameBoundContext.class,i); + } + public TerminalNode ROWS() { return getToken(SQLParser.ROWS, 0); } + public TerminalNode BETWEEN() { return getToken(SQLParser.BETWEEN, 0); } + public TerminalNode AND() { return getToken(SQLParser.AND, 0); } + public WindowFrameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_windowFrame; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterWindowFrame(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitWindowFrame(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitWindowFrame(this); + else return visitor.visitChildren(this); + } + } + + public final WindowFrameContext windowFrame() throws RecognitionException { + WindowFrameContext _localctx = new WindowFrameContext(_ctx, getState()); + enterRule(_localctx, 258, RULE_windowFrame); + try { + setState(3034); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,396,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(3018); + ((WindowFrameContext)_localctx).frameType = match(RANGE); + setState(3019); + ((WindowFrameContext)_localctx).start = frameBound(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(3020); + ((WindowFrameContext)_localctx).frameType = match(ROWS); + setState(3021); + ((WindowFrameContext)_localctx).start = frameBound(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(3022); + ((WindowFrameContext)_localctx).frameType = match(RANGE); + setState(3023); + match(BETWEEN); + setState(3024); + ((WindowFrameContext)_localctx).start = frameBound(); + setState(3025); + match(AND); + setState(3026); + ((WindowFrameContext)_localctx).end = frameBound(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(3028); + ((WindowFrameContext)_localctx).frameType = match(ROWS); + setState(3029); + match(BETWEEN); + setState(3030); + ((WindowFrameContext)_localctx).start = frameBound(); + setState(3031); + match(AND); + setState(3032); + ((WindowFrameContext)_localctx).end = frameBound(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FrameBoundContext extends ParserRuleContext { + public Token boundType; + public TerminalNode UNBOUNDED() { return getToken(SQLParser.UNBOUNDED, 0); } + public TerminalNode PRECEDING() { return getToken(SQLParser.PRECEDING, 0); } + public TerminalNode FOLLOWING() { return getToken(SQLParser.FOLLOWING, 0); } + public TerminalNode ROW() { return getToken(SQLParser.ROW, 0); } + public TerminalNode CURRENT() { return getToken(SQLParser.CURRENT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public FrameBoundContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_frameBound; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFrameBound(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFrameBound(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFrameBound(this); + else return visitor.visitChildren(this); + } + } + + public final FrameBoundContext frameBound() throws RecognitionException { + FrameBoundContext _localctx = new FrameBoundContext(_ctx, getState()); + enterRule(_localctx, 260, RULE_frameBound); + int _la; + try { + setState(3043); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,397,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(3036); + match(UNBOUNDED); + setState(3037); + ((FrameBoundContext)_localctx).boundType = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==FOLLOWING || _la==PRECEDING) ) { + ((FrameBoundContext)_localctx).boundType = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(3038); + ((FrameBoundContext)_localctx).boundType = match(CURRENT); + setState(3039); + match(ROW); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(3040); + expression(); + setState(3041); + ((FrameBoundContext)_localctx).boundType = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==FOLLOWING || _la==PRECEDING) ) { + ((FrameBoundContext)_localctx).boundType = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QualifiedNameListContext extends ParserRuleContext { + public List qualifiedName() { + return getRuleContexts(QualifiedNameContext.class); + } + public QualifiedNameContext qualifiedName(int i) { + return getRuleContext(QualifiedNameContext.class,i); + } + public List COMMA() { return getTokens(SQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(SQLParser.COMMA, i); + } + public QualifiedNameListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedNameList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQualifiedNameList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQualifiedNameList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQualifiedNameList(this); + else return visitor.visitChildren(this); + } + } + + public final QualifiedNameListContext qualifiedNameList() throws RecognitionException { + QualifiedNameListContext _localctx = new QualifiedNameListContext(_ctx, getState()); + enterRule(_localctx, 262, RULE_qualifiedNameList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(3045); + qualifiedName(); + setState(3050); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(3046); + match(COMMA); + setState(3047); + qualifiedName(); + } + } + setState(3052); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FunctionNameContext extends ParserRuleContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public TerminalNode FILTER() { return getToken(SQLParser.FILTER, 0); } + public TerminalNode LEFT() { return getToken(SQLParser.LEFT, 0); } + public TerminalNode RIGHT() { return getToken(SQLParser.RIGHT, 0); } + public FunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFunctionName(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFunctionName(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionNameContext functionName() throws RecognitionException { + FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState()); + enterRule(_localctx, 264, RULE_functionName); + try { + setState(3057); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,399,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(3053); + qualifiedName(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(3054); + match(FILTER); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(3055); + match(LEFT); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(3056); + match(RIGHT); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QualifiedNameContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public List POINT() { return getTokens(SQLParser.POINT); } + public TerminalNode POINT(int i) { + return getToken(SQLParser.POINT, i); + } + public QualifiedNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQualifiedName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQualifiedName(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQualifiedName(this); + else return visitor.visitChildren(this); + } + } + + public final QualifiedNameContext qualifiedName() throws RecognitionException { + QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); + enterRule(_localctx, 266, RULE_qualifiedName); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(3059); + identifier(); + setState(3064); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,400,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(3060); + match(POINT); + setState(3061); + identifier(); + } + } + } + setState(3066); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,400,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ErrorCapturingIdentifierContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public ErrorCapturingIdentifierExtraContext errorCapturingIdentifierExtra() { + return getRuleContext(ErrorCapturingIdentifierExtraContext.class,0); + } + public ErrorCapturingIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_errorCapturingIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterErrorCapturingIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitErrorCapturingIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitErrorCapturingIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final ErrorCapturingIdentifierContext errorCapturingIdentifier() throws RecognitionException { + ErrorCapturingIdentifierContext _localctx = new ErrorCapturingIdentifierContext(_ctx, getState()); + enterRule(_localctx, 268, RULE_errorCapturingIdentifier); + try { + enterOuterAlt(_localctx, 1); + { + setState(3067); + identifier(); + setState(3068); + errorCapturingIdentifierExtra(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ErrorCapturingIdentifierExtraContext extends ParserRuleContext { + public ErrorCapturingIdentifierExtraContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_errorCapturingIdentifierExtra; } + + public ErrorCapturingIdentifierExtraContext() { } + public void copyFrom(ErrorCapturingIdentifierExtraContext ctx) { + super.copyFrom(ctx); + } + } + public static class ErrorIdentContext extends ErrorCapturingIdentifierExtraContext { + public List MINUS() { return getTokens(SQLParser.MINUS); } + public TerminalNode MINUS(int i) { + return getToken(SQLParser.MINUS, i); + } + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public ErrorIdentContext(ErrorCapturingIdentifierExtraContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterErrorIdent(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitErrorIdent(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitErrorIdent(this); + else return visitor.visitChildren(this); + } + } + public static class RealIdentContext extends ErrorCapturingIdentifierExtraContext { + public RealIdentContext(ErrorCapturingIdentifierExtraContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterRealIdent(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitRealIdent(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitRealIdent(this); + else return visitor.visitChildren(this); + } + } + + public final ErrorCapturingIdentifierExtraContext errorCapturingIdentifierExtra() throws RecognitionException { + ErrorCapturingIdentifierExtraContext _localctx = new ErrorCapturingIdentifierExtraContext(_ctx, getState()); + enterRule(_localctx, 270, RULE_errorCapturingIdentifierExtra); + try { + int _alt; + setState(3077); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,402,_ctx) ) { + case 1: + _localctx = new ErrorIdentContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(3072); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(3070); + match(MINUS); + setState(3071); + identifier(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(3074); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,401,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + break; + case 2: + _localctx = new RealIdentContext(_localctx); + enterOuterAlt(_localctx, 2); + { + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IdentifierContext extends ParserRuleContext { + public StrictIdentifierContext strictIdentifier() { + return getRuleContext(StrictIdentifierContext.class,0); + } + public StrictNonReservedContext strictNonReserved() { + return getRuleContext(StrictNonReservedContext.class,0); + } + public IdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final IdentifierContext identifier() throws RecognitionException { + IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); + enterRule(_localctx, 272, RULE_identifier); + try { + setState(3082); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,403,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(3079); + strictIdentifier(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(3080); + if (!(!SQL_standard_keyword_behavior)) throw new FailedPredicateException(this, "!SQL_standard_keyword_behavior"); + setState(3081); + strictNonReserved(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class StrictIdentifierContext extends ParserRuleContext { + public StrictIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_strictIdentifier; } + + public StrictIdentifierContext() { } + public void copyFrom(StrictIdentifierContext ctx) { + super.copyFrom(ctx); + } + } + public static class QuotedIdentifierAlternativeContext extends StrictIdentifierContext { + public QuotedIdentifierContext quotedIdentifier() { + return getRuleContext(QuotedIdentifierContext.class,0); + } + public QuotedIdentifierAlternativeContext(StrictIdentifierContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQuotedIdentifierAlternative(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQuotedIdentifierAlternative(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQuotedIdentifierAlternative(this); + else return visitor.visitChildren(this); + } + } + public static class UnquotedIdentifierContext extends StrictIdentifierContext { + public TerminalNode IDENTIFIER() { return getToken(SQLParser.IDENTIFIER, 0); } + public AnsiNonReservedContext ansiNonReserved() { + return getRuleContext(AnsiNonReservedContext.class,0); + } + public NonReservedContext nonReserved() { + return getRuleContext(NonReservedContext.class,0); + } + public UnquotedIdentifierContext(StrictIdentifierContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterUnquotedIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitUnquotedIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitUnquotedIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final StrictIdentifierContext strictIdentifier() throws RecognitionException { + StrictIdentifierContext _localctx = new StrictIdentifierContext(_ctx, getState()); + enterRule(_localctx, 274, RULE_strictIdentifier); + try { + setState(3090); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,404,_ctx) ) { + case 1: + _localctx = new UnquotedIdentifierContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(3084); + match(IDENTIFIER); + } + break; + case 2: + _localctx = new QuotedIdentifierAlternativeContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(3085); + quotedIdentifier(); + } + break; + case 3: + _localctx = new UnquotedIdentifierContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(3086); + if (!(SQL_standard_keyword_behavior)) throw new FailedPredicateException(this, "SQL_standard_keyword_behavior"); + setState(3087); + ansiNonReserved(); + } + break; + case 4: + _localctx = new UnquotedIdentifierContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(3088); + if (!(!SQL_standard_keyword_behavior)) throw new FailedPredicateException(this, "!SQL_standard_keyword_behavior"); + setState(3089); + nonReserved(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QuotedIdentifierContext extends ParserRuleContext { + public TerminalNode BACKQUOTED_IDENTIFIER() { return getToken(SQLParser.BACKQUOTED_IDENTIFIER, 0); } + public QuotedIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_quotedIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterQuotedIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitQuotedIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitQuotedIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final QuotedIdentifierContext quotedIdentifier() throws RecognitionException { + QuotedIdentifierContext _localctx = new QuotedIdentifierContext(_ctx, getState()); + enterRule(_localctx, 276, RULE_quotedIdentifier); + try { + enterOuterAlt(_localctx, 1); + { + setState(3092); + match(BACKQUOTED_IDENTIFIER); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NumberContext extends ParserRuleContext { + public NumberContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_number; } + + public NumberContext() { } + public void copyFrom(NumberContext ctx) { + super.copyFrom(ctx); + } + } + public static class DecimalLiteralContext extends NumberContext { + public TerminalNode DECIMAL_VALUE() { return getToken(SQLParser.DECIMAL_VALUE, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public DecimalLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDecimalLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDecimalLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDecimalLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class BigIntLiteralContext extends NumberContext { + public TerminalNode BIGINT_LITERAL() { return getToken(SQLParser.BIGINT_LITERAL, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public BigIntLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterBigIntLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitBigIntLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitBigIntLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class TinyIntLiteralContext extends NumberContext { + public TerminalNode TINYINT_LITERAL() { return getToken(SQLParser.TINYINT_LITERAL, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public TinyIntLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterTinyIntLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitTinyIntLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitTinyIntLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class LegacyDecimalLiteralContext extends NumberContext { + public TerminalNode EXPONENT_VALUE() { return getToken(SQLParser.EXPONENT_VALUE, 0); } + public TerminalNode DECIMAL_VALUE() { return getToken(SQLParser.DECIMAL_VALUE, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public LegacyDecimalLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterLegacyDecimalLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitLegacyDecimalLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitLegacyDecimalLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class BigDecimalLiteralContext extends NumberContext { + public TerminalNode BIGDECIMAL_LITERAL() { return getToken(SQLParser.BIGDECIMAL_LITERAL, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public BigDecimalLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterBigDecimalLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitBigDecimalLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitBigDecimalLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class ExponentLiteralContext extends NumberContext { + public TerminalNode EXPONENT_VALUE() { return getToken(SQLParser.EXPONENT_VALUE, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public ExponentLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterExponentLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitExponentLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitExponentLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class DoubleLiteralContext extends NumberContext { + public TerminalNode DOUBLE_LITERAL() { return getToken(SQLParser.DOUBLE_LITERAL, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public DoubleLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterDoubleLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitDoubleLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitDoubleLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class IntegerLiteralContext extends NumberContext { + public TerminalNode INTEGER_VALUE() { return getToken(SQLParser.INTEGER_VALUE, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public IntegerLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterIntegerLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitIntegerLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitIntegerLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class FloatLiteralContext extends NumberContext { + public TerminalNode FLOAT_LITERAL() { return getToken(SQLParser.FLOAT_LITERAL, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public FloatLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterFloatLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitFloatLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitFloatLiteral(this); + else return visitor.visitChildren(this); + } + } + public static class SmallIntLiteralContext extends NumberContext { + public TerminalNode SMALLINT_LITERAL() { return getToken(SQLParser.SMALLINT_LITERAL, 0); } + public TerminalNode MINUS() { return getToken(SQLParser.MINUS, 0); } + public SmallIntLiteralContext(NumberContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterSmallIntLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitSmallIntLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitSmallIntLiteral(this); + else return visitor.visitChildren(this); + } + } + + public final NumberContext number() throws RecognitionException { + NumberContext _localctx = new NumberContext(_ctx, getState()); + enterRule(_localctx, 278, RULE_number); + int _la; + try { + setState(3137); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,415,_ctx) ) { + case 1: + _localctx = new ExponentLiteralContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(3094); + if (!(!legacy_exponent_literal_as_decimal_enabled)) throw new FailedPredicateException(this, "!legacy_exponent_literal_as_decimal_enabled"); + setState(3096); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3095); + match(MINUS); + } + } + + setState(3098); + match(EXPONENT_VALUE); + } + break; + case 2: + _localctx = new DecimalLiteralContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(3099); + if (!(!legacy_exponent_literal_as_decimal_enabled)) throw new FailedPredicateException(this, "!legacy_exponent_literal_as_decimal_enabled"); + setState(3101); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3100); + match(MINUS); + } + } + + setState(3103); + match(DECIMAL_VALUE); + } + break; + case 3: + _localctx = new LegacyDecimalLiteralContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(3104); + if (!(legacy_exponent_literal_as_decimal_enabled)) throw new FailedPredicateException(this, "legacy_exponent_literal_as_decimal_enabled"); + setState(3106); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3105); + match(MINUS); + } + } + + setState(3108); + _la = _input.LA(1); + if ( !(_la==EXPONENT_VALUE || _la==DECIMAL_VALUE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + case 4: + _localctx = new IntegerLiteralContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(3110); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3109); + match(MINUS); + } + } + + setState(3112); + match(INTEGER_VALUE); + } + break; + case 5: + _localctx = new BigIntLiteralContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(3114); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3113); + match(MINUS); + } + } + + setState(3116); + match(BIGINT_LITERAL); + } + break; + case 6: + _localctx = new SmallIntLiteralContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(3118); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3117); + match(MINUS); + } + } + + setState(3120); + match(SMALLINT_LITERAL); + } + break; + case 7: + _localctx = new TinyIntLiteralContext(_localctx); + enterOuterAlt(_localctx, 7); + { + setState(3122); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3121); + match(MINUS); + } + } + + setState(3124); + match(TINYINT_LITERAL); + } + break; + case 8: + _localctx = new DoubleLiteralContext(_localctx); + enterOuterAlt(_localctx, 8); + { + setState(3126); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3125); + match(MINUS); + } + } + + setState(3128); + match(DOUBLE_LITERAL); + } + break; + case 9: + _localctx = new FloatLiteralContext(_localctx); + enterOuterAlt(_localctx, 9); + { + setState(3130); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3129); + match(MINUS); + } + } + + setState(3132); + match(FLOAT_LITERAL); + } + break; + case 10: + _localctx = new BigDecimalLiteralContext(_localctx); + enterOuterAlt(_localctx, 10); + { + setState(3134); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==MINUS) { + { + setState(3133); + match(MINUS); + } + } + + setState(3136); + match(BIGDECIMAL_LITERAL); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AlterColumnActionContext extends ParserRuleContext { + public Token setOrDrop; + public TerminalNode TYPE() { return getToken(SQLParser.TYPE, 0); } + public DataTypeContext dataType() { + return getRuleContext(DataTypeContext.class,0); + } + public CommentSpecContext commentSpec() { + return getRuleContext(CommentSpecContext.class,0); + } + public ColPositionContext colPosition() { + return getRuleContext(ColPositionContext.class,0); + } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public AlterColumnActionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_alterColumnAction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAlterColumnAction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAlterColumnAction(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAlterColumnAction(this); + else return visitor.visitChildren(this); + } + } + + public final AlterColumnActionContext alterColumnAction() throws RecognitionException { + AlterColumnActionContext _localctx = new AlterColumnActionContext(_ctx, getState()); + enterRule(_localctx, 280, RULE_alterColumnAction); + int _la; + try { + setState(3146); + _errHandler.sync(this); + switch (_input.LA(1)) { + case TYPE: + enterOuterAlt(_localctx, 1); + { + setState(3139); + match(TYPE); + setState(3140); + dataType(); + } + break; + case COMMENT: + enterOuterAlt(_localctx, 2); + { + setState(3141); + commentSpec(); + } + break; + case AFTER: + case FIRST: + enterOuterAlt(_localctx, 3); + { + setState(3142); + colPosition(); + } + break; + case DROP: + case SET: + enterOuterAlt(_localctx, 4); + { + setState(3143); + ((AlterColumnActionContext)_localctx).setOrDrop = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==DROP || _la==SET) ) { + ((AlterColumnActionContext)_localctx).setOrDrop = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(3144); + match(NOT); + setState(3145); + match(NULL); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AnsiNonReservedContext extends ParserRuleContext { + public TerminalNode ADD() { return getToken(SQLParser.ADD, 0); } + public TerminalNode AFTER() { return getToken(SQLParser.AFTER, 0); } + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode ANALYZE() { return getToken(SQLParser.ANALYZE, 0); } + public TerminalNode ANTI() { return getToken(SQLParser.ANTI, 0); } + public TerminalNode ARCHIVE() { return getToken(SQLParser.ARCHIVE, 0); } + public TerminalNode ARRAY() { return getToken(SQLParser.ARRAY, 0); } + public TerminalNode ASC() { return getToken(SQLParser.ASC, 0); } + public TerminalNode AT() { return getToken(SQLParser.AT, 0); } + public TerminalNode BETWEEN() { return getToken(SQLParser.BETWEEN, 0); } + public TerminalNode BUCKET() { return getToken(SQLParser.BUCKET, 0); } + public TerminalNode BUCKETS() { return getToken(SQLParser.BUCKETS, 0); } + public TerminalNode BY() { return getToken(SQLParser.BY, 0); } + public TerminalNode CACHE() { return getToken(SQLParser.CACHE, 0); } + public TerminalNode CASCADE() { return getToken(SQLParser.CASCADE, 0); } + public TerminalNode CHANGE() { return getToken(SQLParser.CHANGE, 0); } + public TerminalNode CLEAR() { return getToken(SQLParser.CLEAR, 0); } + public TerminalNode CLUSTER() { return getToken(SQLParser.CLUSTER, 0); } + public TerminalNode CLUSTERED() { return getToken(SQLParser.CLUSTERED, 0); } + public TerminalNode CODEGEN() { return getToken(SQLParser.CODEGEN, 0); } + public TerminalNode COLLECTION() { return getToken(SQLParser.COLLECTION, 0); } + public TerminalNode COLUMNS() { return getToken(SQLParser.COLUMNS, 0); } + public TerminalNode COMMENT() { return getToken(SQLParser.COMMENT, 0); } + public TerminalNode COMMIT() { return getToken(SQLParser.COMMIT, 0); } + public TerminalNode COMPACT() { return getToken(SQLParser.COMPACT, 0); } + public TerminalNode COMPACTIONS() { return getToken(SQLParser.COMPACTIONS, 0); } + public TerminalNode COMPUTE() { return getToken(SQLParser.COMPUTE, 0); } + public TerminalNode CONCATENATE() { return getToken(SQLParser.CONCATENATE, 0); } + public TerminalNode COST() { return getToken(SQLParser.COST, 0); } + public TerminalNode CUBE() { return getToken(SQLParser.CUBE, 0); } + public TerminalNode CURRENT() { return getToken(SQLParser.CURRENT, 0); } + public TerminalNode DATA() { return getToken(SQLParser.DATA, 0); } + public TerminalNode DATABASE() { return getToken(SQLParser.DATABASE, 0); } + public TerminalNode DATABASES() { return getToken(SQLParser.DATABASES, 0); } + public TerminalNode DAY() { return getToken(SQLParser.DAY, 0); } + public TerminalNode DBPROPERTIES() { return getToken(SQLParser.DBPROPERTIES, 0); } + public TerminalNode DEFINED() { return getToken(SQLParser.DEFINED, 0); } + public TerminalNode DELETE() { return getToken(SQLParser.DELETE, 0); } + public TerminalNode DELIMITED() { return getToken(SQLParser.DELIMITED, 0); } + public TerminalNode DESC() { return getToken(SQLParser.DESC, 0); } + public TerminalNode DESCRIBE() { return getToken(SQLParser.DESCRIBE, 0); } + public TerminalNode DFS() { return getToken(SQLParser.DFS, 0); } + public TerminalNode DIRECTORIES() { return getToken(SQLParser.DIRECTORIES, 0); } + public TerminalNode DIRECTORY() { return getToken(SQLParser.DIRECTORY, 0); } + public TerminalNode DISTRIBUTE() { return getToken(SQLParser.DISTRIBUTE, 0); } + public TerminalNode DIV() { return getToken(SQLParser.DIV, 0); } + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public TerminalNode ESCAPED() { return getToken(SQLParser.ESCAPED, 0); } + public TerminalNode EXCHANGE() { return getToken(SQLParser.EXCHANGE, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public TerminalNode EXPLAIN() { return getToken(SQLParser.EXPLAIN, 0); } + public TerminalNode EXPORT() { return getToken(SQLParser.EXPORT, 0); } + public TerminalNode EXTENDED() { return getToken(SQLParser.EXTENDED, 0); } + public TerminalNode EXTERNAL() { return getToken(SQLParser.EXTERNAL, 0); } + public TerminalNode EXTRACT() { return getToken(SQLParser.EXTRACT, 0); } + public TerminalNode FIELDS() { return getToken(SQLParser.FIELDS, 0); } + public TerminalNode FILEFORMAT() { return getToken(SQLParser.FILEFORMAT, 0); } + public TerminalNode FIRST() { return getToken(SQLParser.FIRST, 0); } + public TerminalNode FOLLOWING() { return getToken(SQLParser.FOLLOWING, 0); } + public TerminalNode FORMAT() { return getToken(SQLParser.FORMAT, 0); } + public TerminalNode FORMATTED() { return getToken(SQLParser.FORMATTED, 0); } + public TerminalNode FUNCTION() { return getToken(SQLParser.FUNCTION, 0); } + public TerminalNode FUNCTIONS() { return getToken(SQLParser.FUNCTIONS, 0); } + public TerminalNode GLOBAL() { return getToken(SQLParser.GLOBAL, 0); } + public TerminalNode GROUPING() { return getToken(SQLParser.GROUPING, 0); } + public TerminalNode HOUR() { return getToken(SQLParser.HOUR, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode IGNORE() { return getToken(SQLParser.IGNORE, 0); } + public TerminalNode IMPORT() { return getToken(SQLParser.IMPORT, 0); } + public TerminalNode INDEX() { return getToken(SQLParser.INDEX, 0); } + public TerminalNode INDEXES() { return getToken(SQLParser.INDEXES, 0); } + public TerminalNode INPATH() { return getToken(SQLParser.INPATH, 0); } + public TerminalNode INPUTFORMAT() { return getToken(SQLParser.INPUTFORMAT, 0); } + public TerminalNode INSERT() { return getToken(SQLParser.INSERT, 0); } + public TerminalNode INTERVAL() { return getToken(SQLParser.INTERVAL, 0); } + public TerminalNode ITEMS() { return getToken(SQLParser.ITEMS, 0); } + public TerminalNode KEYS() { return getToken(SQLParser.KEYS, 0); } + public TerminalNode LAST() { return getToken(SQLParser.LAST, 0); } + public TerminalNode LAZY() { return getToken(SQLParser.LAZY, 0); } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public TerminalNode LIMIT() { return getToken(SQLParser.LIMIT, 0); } + public TerminalNode LINES() { return getToken(SQLParser.LINES, 0); } + public TerminalNode LIST() { return getToken(SQLParser.LIST, 0); } + public TerminalNode LOAD() { return getToken(SQLParser.LOAD, 0); } + public TerminalNode LOCAL() { return getToken(SQLParser.LOCAL, 0); } + public TerminalNode LOCATION() { return getToken(SQLParser.LOCATION, 0); } + public TerminalNode LOCK() { return getToken(SQLParser.LOCK, 0); } + public TerminalNode LOCKS() { return getToken(SQLParser.LOCKS, 0); } + public TerminalNode LOGICAL() { return getToken(SQLParser.LOGICAL, 0); } + public TerminalNode MACRO() { return getToken(SQLParser.MACRO, 0); } + public TerminalNode MAP() { return getToken(SQLParser.MAP, 0); } + public TerminalNode MATCHED() { return getToken(SQLParser.MATCHED, 0); } + public TerminalNode MERGE() { return getToken(SQLParser.MERGE, 0); } + public TerminalNode MINUTE() { return getToken(SQLParser.MINUTE, 0); } + public TerminalNode MONTH() { return getToken(SQLParser.MONTH, 0); } + public TerminalNode MSCK() { return getToken(SQLParser.MSCK, 0); } + public TerminalNode NAMESPACE() { return getToken(SQLParser.NAMESPACE, 0); } + public TerminalNode NAMESPACES() { return getToken(SQLParser.NAMESPACES, 0); } + public TerminalNode NO() { return getToken(SQLParser.NO, 0); } + public TerminalNode NULLS() { return getToken(SQLParser.NULLS, 0); } + public TerminalNode OF() { return getToken(SQLParser.OF, 0); } + public TerminalNode OPTION() { return getToken(SQLParser.OPTION, 0); } + public TerminalNode OPTIONS() { return getToken(SQLParser.OPTIONS, 0); } + public TerminalNode OUT() { return getToken(SQLParser.OUT, 0); } + public TerminalNode OUTPUTFORMAT() { return getToken(SQLParser.OUTPUTFORMAT, 0); } + public TerminalNode OVER() { return getToken(SQLParser.OVER, 0); } + public TerminalNode OVERLAY() { return getToken(SQLParser.OVERLAY, 0); } + public TerminalNode OVERWRITE() { return getToken(SQLParser.OVERWRITE, 0); } + public TerminalNode PARTITION() { return getToken(SQLParser.PARTITION, 0); } + public TerminalNode PARTITIONED() { return getToken(SQLParser.PARTITIONED, 0); } + public TerminalNode PARTITIONS() { return getToken(SQLParser.PARTITIONS, 0); } + public TerminalNode PERCENTLIT() { return getToken(SQLParser.PERCENTLIT, 0); } + public TerminalNode PIVOT() { return getToken(SQLParser.PIVOT, 0); } + public TerminalNode PLACING() { return getToken(SQLParser.PLACING, 0); } + public TerminalNode POSITION() { return getToken(SQLParser.POSITION, 0); } + public TerminalNode PRECEDING() { return getToken(SQLParser.PRECEDING, 0); } + public TerminalNode PRINCIPALS() { return getToken(SQLParser.PRINCIPALS, 0); } + public TerminalNode PROPERTIES() { return getToken(SQLParser.PROPERTIES, 0); } + public TerminalNode PURGE() { return getToken(SQLParser.PURGE, 0); } + public TerminalNode QUERY() { return getToken(SQLParser.QUERY, 0); } + public TerminalNode RANGE() { return getToken(SQLParser.RANGE, 0); } + public TerminalNode RECORDREADER() { return getToken(SQLParser.RECORDREADER, 0); } + public TerminalNode RECORDWRITER() { return getToken(SQLParser.RECORDWRITER, 0); } + public TerminalNode RECOVER() { return getToken(SQLParser.RECOVER, 0); } + public TerminalNode REDUCE() { return getToken(SQLParser.REDUCE, 0); } + public TerminalNode REFRESH() { return getToken(SQLParser.REFRESH, 0); } + public TerminalNode RENAME() { return getToken(SQLParser.RENAME, 0); } + public TerminalNode REPAIR() { return getToken(SQLParser.REPAIR, 0); } + public TerminalNode REPLACE() { return getToken(SQLParser.REPLACE, 0); } + public TerminalNode RESET() { return getToken(SQLParser.RESET, 0); } + public TerminalNode RESPECT() { return getToken(SQLParser.RESPECT, 0); } + public TerminalNode RESTRICT() { return getToken(SQLParser.RESTRICT, 0); } + public TerminalNode REVOKE() { return getToken(SQLParser.REVOKE, 0); } + public TerminalNode RLIKE() { return getToken(SQLParser.RLIKE, 0); } + public TerminalNode ROLE() { return getToken(SQLParser.ROLE, 0); } + public TerminalNode ROLES() { return getToken(SQLParser.ROLES, 0); } + public TerminalNode ROLLBACK() { return getToken(SQLParser.ROLLBACK, 0); } + public TerminalNode ROLLUP() { return getToken(SQLParser.ROLLUP, 0); } + public TerminalNode ROW() { return getToken(SQLParser.ROW, 0); } + public TerminalNode ROWS() { return getToken(SQLParser.ROWS, 0); } + public TerminalNode SCHEMA() { return getToken(SQLParser.SCHEMA, 0); } + public TerminalNode SECOND() { return getToken(SQLParser.SECOND, 0); } + public TerminalNode SEMI() { return getToken(SQLParser.SEMI, 0); } + public TerminalNode SEPARATED() { return getToken(SQLParser.SEPARATED, 0); } + public TerminalNode SERDE() { return getToken(SQLParser.SERDE, 0); } + public TerminalNode SERDEPROPERTIES() { return getToken(SQLParser.SERDEPROPERTIES, 0); } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode SETMINUS() { return getToken(SQLParser.SETMINUS, 0); } + public TerminalNode SETS() { return getToken(SQLParser.SETS, 0); } + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode SKEWED() { return getToken(SQLParser.SKEWED, 0); } + public TerminalNode SORT() { return getToken(SQLParser.SORT, 0); } + public TerminalNode SORTED() { return getToken(SQLParser.SORTED, 0); } + public TerminalNode START() { return getToken(SQLParser.START, 0); } + public TerminalNode STATISTICS() { return getToken(SQLParser.STATISTICS, 0); } + public TerminalNode STORED() { return getToken(SQLParser.STORED, 0); } + public TerminalNode STRATIFY() { return getToken(SQLParser.STRATIFY, 0); } + public TerminalNode STRUCT() { return getToken(SQLParser.STRUCT, 0); } + public TerminalNode SUBSTR() { return getToken(SQLParser.SUBSTR, 0); } + public TerminalNode SUBSTRING() { return getToken(SQLParser.SUBSTRING, 0); } + public TerminalNode SYNC() { return getToken(SQLParser.SYNC, 0); } + public TerminalNode TABLES() { return getToken(SQLParser.TABLES, 0); } + public TerminalNode TABLESAMPLE() { return getToken(SQLParser.TABLESAMPLE, 0); } + public TerminalNode TBLPROPERTIES() { return getToken(SQLParser.TBLPROPERTIES, 0); } + public TerminalNode TEMPORARY() { return getToken(SQLParser.TEMPORARY, 0); } + public TerminalNode TERMINATED() { return getToken(SQLParser.TERMINATED, 0); } + public TerminalNode TOUCH() { return getToken(SQLParser.TOUCH, 0); } + public TerminalNode TRANSACTION() { return getToken(SQLParser.TRANSACTION, 0); } + public TerminalNode TRANSACTIONS() { return getToken(SQLParser.TRANSACTIONS, 0); } + public TerminalNode TRANSFORM() { return getToken(SQLParser.TRANSFORM, 0); } + public TerminalNode TRIM() { return getToken(SQLParser.TRIM, 0); } + public TerminalNode TRUE() { return getToken(SQLParser.TRUE, 0); } + public TerminalNode TRUNCATE() { return getToken(SQLParser.TRUNCATE, 0); } + public TerminalNode TRY_CAST() { return getToken(SQLParser.TRY_CAST, 0); } + public TerminalNode TYPE() { return getToken(SQLParser.TYPE, 0); } + public TerminalNode UNARCHIVE() { return getToken(SQLParser.UNARCHIVE, 0); } + public TerminalNode UNBOUNDED() { return getToken(SQLParser.UNBOUNDED, 0); } + public TerminalNode UNCACHE() { return getToken(SQLParser.UNCACHE, 0); } + public TerminalNode UNLOCK() { return getToken(SQLParser.UNLOCK, 0); } + public TerminalNode UNSET() { return getToken(SQLParser.UNSET, 0); } + public TerminalNode UPDATE() { return getToken(SQLParser.UPDATE, 0); } + public TerminalNode USE() { return getToken(SQLParser.USE, 0); } + public TerminalNode VALUES() { return getToken(SQLParser.VALUES, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public TerminalNode VIEWS() { return getToken(SQLParser.VIEWS, 0); } + public TerminalNode WINDOW() { return getToken(SQLParser.WINDOW, 0); } + public TerminalNode YEAR() { return getToken(SQLParser.YEAR, 0); } + public TerminalNode ZONE() { return getToken(SQLParser.ZONE, 0); } + public AnsiNonReservedContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ansiNonReserved; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterAnsiNonReserved(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitAnsiNonReserved(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitAnsiNonReserved(this); + else return visitor.visitChildren(this); + } + } + + public final AnsiNonReservedContext ansiNonReserved() throws RecognitionException { + AnsiNonReservedContext _localctx = new AnsiNonReservedContext(_ctx, getState()); + enterRule(_localctx, 282, RULE_ansiNonReserved); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(3148); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << AFTER) | (1L << ALTER) | (1L << ANALYZE) | (1L << ANTI) | (1L << ARCHIVE) | (1L << ARRAY) | (1L << ASC) | (1L << AT) | (1L << BETWEEN) | (1L << BUCKET) | (1L << BUCKETS) | (1L << BY) | (1L << CACHE) | (1L << CASCADE) | (1L << CHANGE) | (1L << CLEAR) | (1L << CLUSTER) | (1L << CLUSTERED) | (1L << CODEGEN) | (1L << COLLECTION) | (1L << COLUMNS) | (1L << COMMENT) | (1L << COMMIT) | (1L << COMPACT) | (1L << COMPACTIONS) | (1L << COMPUTE) | (1L << CONCATENATE) | (1L << COST) | (1L << CUBE) | (1L << CURRENT) | (1L << DAY) | (1L << DATA) | (1L << DATABASE) | (1L << DATABASES) | (1L << DBPROPERTIES) | (1L << DEFINED) | (1L << DELETE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (DELIMITED - 64)) | (1L << (DESC - 64)) | (1L << (DESCRIBE - 64)) | (1L << (DFS - 64)) | (1L << (DIRECTORIES - 64)) | (1L << (DIRECTORY - 64)) | (1L << (DISTRIBUTE - 64)) | (1L << (DIV - 64)) | (1L << (DROP - 64)) | (1L << (ESCAPED - 64)) | (1L << (EXCHANGE - 64)) | (1L << (EXISTS - 64)) | (1L << (EXPLAIN - 64)) | (1L << (EXPORT - 64)) | (1L << (EXTENDED - 64)) | (1L << (EXTERNAL - 64)) | (1L << (EXTRACT - 64)) | (1L << (FIELDS - 64)) | (1L << (FILEFORMAT - 64)) | (1L << (FIRST - 64)) | (1L << (FOLLOWING - 64)) | (1L << (FORMAT - 64)) | (1L << (FORMATTED - 64)) | (1L << (FUNCTION - 64)) | (1L << (FUNCTIONS - 64)) | (1L << (GLOBAL - 64)) | (1L << (GROUPING - 64)) | (1L << (HOUR - 64)) | (1L << (IF - 64)) | (1L << (IGNORE - 64)) | (1L << (IMPORT - 64)) | (1L << (INDEX - 64)) | (1L << (INDEXES - 64)) | (1L << (INPATH - 64)) | (1L << (INPUTFORMAT - 64)) | (1L << (INSERT - 64)) | (1L << (INTERVAL - 64)) | (1L << (ITEMS - 64)) | (1L << (KEYS - 64)) | (1L << (LAST - 64)) | (1L << (LAZY - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (LIKE - 129)) | (1L << (LIMIT - 129)) | (1L << (LINES - 129)) | (1L << (LIST - 129)) | (1L << (LOAD - 129)) | (1L << (LOCAL - 129)) | (1L << (LOCATION - 129)) | (1L << (LOCK - 129)) | (1L << (LOCKS - 129)) | (1L << (LOGICAL - 129)) | (1L << (MACRO - 129)) | (1L << (MAP - 129)) | (1L << (MATCHED - 129)) | (1L << (MERGE - 129)) | (1L << (MINUTE - 129)) | (1L << (MONTH - 129)) | (1L << (MSCK - 129)) | (1L << (NAMESPACE - 129)) | (1L << (NAMESPACES - 129)) | (1L << (NO - 129)) | (1L << (NULLS - 129)) | (1L << (OF - 129)) | (1L << (OPTION - 129)) | (1L << (OPTIONS - 129)) | (1L << (OUT - 129)) | (1L << (OUTPUTFORMAT - 129)) | (1L << (OVER - 129)) | (1L << (OVERLAY - 129)) | (1L << (OVERWRITE - 129)) | (1L << (PARTITION - 129)) | (1L << (PARTITIONED - 129)) | (1L << (PARTITIONS - 129)) | (1L << (PERCENTLIT - 129)) | (1L << (PIVOT - 129)) | (1L << (PLACING - 129)) | (1L << (POSITION - 129)) | (1L << (PRECEDING - 129)) | (1L << (PRINCIPALS - 129)) | (1L << (PROPERTIES - 129)) | (1L << (PURGE - 129)) | (1L << (QUERY - 129)) | (1L << (RANGE - 129)) | (1L << (RECORDREADER - 129)) | (1L << (RECORDWRITER - 129)) | (1L << (RECOVER - 129)) | (1L << (REDUCE - 129)) | (1L << (REFRESH - 129)) | (1L << (RENAME - 129)) | (1L << (REPAIR - 129)) | (1L << (REPLACE - 129)) | (1L << (RESET - 129)) | (1L << (RESPECT - 129)))) != 0) || ((((_la - 193)) & ~0x3f) == 0 && ((1L << (_la - 193)) & ((1L << (RESTRICT - 193)) | (1L << (REVOKE - 193)) | (1L << (RLIKE - 193)) | (1L << (ROLE - 193)) | (1L << (ROLES - 193)) | (1L << (ROLLBACK - 193)) | (1L << (ROLLUP - 193)) | (1L << (ROW - 193)) | (1L << (ROWS - 193)) | (1L << (SECOND - 193)) | (1L << (SCHEMA - 193)) | (1L << (SEMI - 193)) | (1L << (SEPARATED - 193)) | (1L << (SERDE - 193)) | (1L << (SERDEPROPERTIES - 193)) | (1L << (SET - 193)) | (1L << (SETMINUS - 193)) | (1L << (SETS - 193)) | (1L << (SHOW - 193)) | (1L << (SKEWED - 193)) | (1L << (SORT - 193)) | (1L << (SORTED - 193)) | (1L << (START - 193)) | (1L << (STATISTICS - 193)) | (1L << (STORED - 193)) | (1L << (STRATIFY - 193)) | (1L << (STRUCT - 193)) | (1L << (SUBSTR - 193)) | (1L << (SUBSTRING - 193)) | (1L << (SYNC - 193)) | (1L << (TABLES - 193)) | (1L << (TABLESAMPLE - 193)) | (1L << (TBLPROPERTIES - 193)) | (1L << (TEMPORARY - 193)) | (1L << (TERMINATED - 193)) | (1L << (TOUCH - 193)) | (1L << (TRANSACTION - 193)) | (1L << (TRANSACTIONS - 193)) | (1L << (TRANSFORM - 193)) | (1L << (TRIM - 193)) | (1L << (TRUE - 193)) | (1L << (TRUNCATE - 193)) | (1L << (TRY_CAST - 193)) | (1L << (TYPE - 193)) | (1L << (UNARCHIVE - 193)) | (1L << (UNBOUNDED - 193)) | (1L << (UNCACHE - 193)) | (1L << (UNLOCK - 193)) | (1L << (UNSET - 193)) | (1L << (UPDATE - 193)) | (1L << (USE - 193)))) != 0) || ((((_la - 258)) & ~0x3f) == 0 && ((1L << (_la - 258)) & ((1L << (VALUES - 258)) | (1L << (VIEW - 258)) | (1L << (VIEWS - 258)) | (1L << (WINDOW - 258)) | (1L << (YEAR - 258)) | (1L << (ZONE - 258)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class StrictNonReservedContext extends ParserRuleContext { + public TerminalNode ANTI() { return getToken(SQLParser.ANTI, 0); } + public TerminalNode CROSS() { return getToken(SQLParser.CROSS, 0); } + public TerminalNode EXCEPT() { return getToken(SQLParser.EXCEPT, 0); } + public TerminalNode FULL() { return getToken(SQLParser.FULL, 0); } + public TerminalNode INNER() { return getToken(SQLParser.INNER, 0); } + public TerminalNode INTERSECT() { return getToken(SQLParser.INTERSECT, 0); } + public TerminalNode JOIN() { return getToken(SQLParser.JOIN, 0); } + public TerminalNode LATERAL() { return getToken(SQLParser.LATERAL, 0); } + public TerminalNode LEFT() { return getToken(SQLParser.LEFT, 0); } + public TerminalNode NATURAL() { return getToken(SQLParser.NATURAL, 0); } + public TerminalNode ON() { return getToken(SQLParser.ON, 0); } + public TerminalNode RIGHT() { return getToken(SQLParser.RIGHT, 0); } + public TerminalNode SEMI() { return getToken(SQLParser.SEMI, 0); } + public TerminalNode SETMINUS() { return getToken(SQLParser.SETMINUS, 0); } + public TerminalNode UNION() { return getToken(SQLParser.UNION, 0); } + public TerminalNode USING() { return getToken(SQLParser.USING, 0); } + public StrictNonReservedContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_strictNonReserved; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterStrictNonReserved(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitStrictNonReserved(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitStrictNonReserved(this); + else return visitor.visitChildren(this); + } + } + + public final StrictNonReservedContext strictNonReserved() throws RecognitionException { + StrictNonReservedContext _localctx = new StrictNonReservedContext(_ctx, getState()); + enterRule(_localctx, 284, RULE_strictNonReserved); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(3150); + _la = _input.LA(1); + if ( !(_la==ANTI || _la==CROSS || ((((_la - 78)) & ~0x3f) == 0 && ((1L << (_la - 78)) & ((1L << (EXCEPT - 78)) | (1L << (FULL - 78)) | (1L << (INNER - 78)) | (1L << (INTERSECT - 78)) | (1L << (JOIN - 78)) | (1L << (LATERAL - 78)) | (1L << (LEFT - 78)))) != 0) || ((((_la - 148)) & ~0x3f) == 0 && ((1L << (_la - 148)) & ((1L << (NATURAL - 148)) | (1L << (ON - 148)) | (1L << (RIGHT - 148)) | (1L << (SEMI - 148)))) != 0) || ((((_la - 212)) & ~0x3f) == 0 && ((1L << (_la - 212)) & ((1L << (SETMINUS - 212)) | (1L << (UNION - 212)) | (1L << (USING - 212)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NonReservedContext extends ParserRuleContext { + public TerminalNode ADD() { return getToken(SQLParser.ADD, 0); } + public TerminalNode AFTER() { return getToken(SQLParser.AFTER, 0); } + public TerminalNode ALL() { return getToken(SQLParser.ALL, 0); } + public TerminalNode ALTER() { return getToken(SQLParser.ALTER, 0); } + public TerminalNode ANALYZE() { return getToken(SQLParser.ANALYZE, 0); } + public TerminalNode AND() { return getToken(SQLParser.AND, 0); } + public TerminalNode ANY() { return getToken(SQLParser.ANY, 0); } + public TerminalNode ARCHIVE() { return getToken(SQLParser.ARCHIVE, 0); } + public TerminalNode ARRAY() { return getToken(SQLParser.ARRAY, 0); } + public TerminalNode AS() { return getToken(SQLParser.AS, 0); } + public TerminalNode ASC() { return getToken(SQLParser.ASC, 0); } + public TerminalNode AT() { return getToken(SQLParser.AT, 0); } + public TerminalNode AUTHORIZATION() { return getToken(SQLParser.AUTHORIZATION, 0); } + public TerminalNode BETWEEN() { return getToken(SQLParser.BETWEEN, 0); } + public TerminalNode BOTH() { return getToken(SQLParser.BOTH, 0); } + public TerminalNode BUCKET() { return getToken(SQLParser.BUCKET, 0); } + public TerminalNode BUCKETS() { return getToken(SQLParser.BUCKETS, 0); } + public TerminalNode BY() { return getToken(SQLParser.BY, 0); } + public TerminalNode CACHE() { return getToken(SQLParser.CACHE, 0); } + public TerminalNode CASCADE() { return getToken(SQLParser.CASCADE, 0); } + public TerminalNode CASE() { return getToken(SQLParser.CASE, 0); } + public TerminalNode CAST() { return getToken(SQLParser.CAST, 0); } + public TerminalNode CHANGE() { return getToken(SQLParser.CHANGE, 0); } + public TerminalNode CHECK() { return getToken(SQLParser.CHECK, 0); } + public TerminalNode CLEAR() { return getToken(SQLParser.CLEAR, 0); } + public TerminalNode CLUSTER() { return getToken(SQLParser.CLUSTER, 0); } + public TerminalNode CLUSTERED() { return getToken(SQLParser.CLUSTERED, 0); } + public TerminalNode CODEGEN() { return getToken(SQLParser.CODEGEN, 0); } + public TerminalNode COLLATE() { return getToken(SQLParser.COLLATE, 0); } + public TerminalNode COLLECTION() { return getToken(SQLParser.COLLECTION, 0); } + public TerminalNode COLUMN() { return getToken(SQLParser.COLUMN, 0); } + public TerminalNode COLUMNS() { return getToken(SQLParser.COLUMNS, 0); } + public TerminalNode COMMENT() { return getToken(SQLParser.COMMENT, 0); } + public TerminalNode COMMIT() { return getToken(SQLParser.COMMIT, 0); } + public TerminalNode COMPACT() { return getToken(SQLParser.COMPACT, 0); } + public TerminalNode COMPACTIONS() { return getToken(SQLParser.COMPACTIONS, 0); } + public TerminalNode COMPUTE() { return getToken(SQLParser.COMPUTE, 0); } + public TerminalNode CONCATENATE() { return getToken(SQLParser.CONCATENATE, 0); } + public TerminalNode CONSTRAINT() { return getToken(SQLParser.CONSTRAINT, 0); } + public TerminalNode COST() { return getToken(SQLParser.COST, 0); } + public TerminalNode CREATE() { return getToken(SQLParser.CREATE, 0); } + public TerminalNode CUBE() { return getToken(SQLParser.CUBE, 0); } + public TerminalNode CURRENT() { return getToken(SQLParser.CURRENT, 0); } + public TerminalNode CURRENT_DATE() { return getToken(SQLParser.CURRENT_DATE, 0); } + public TerminalNode CURRENT_TIME() { return getToken(SQLParser.CURRENT_TIME, 0); } + public TerminalNode CURRENT_TIMESTAMP() { return getToken(SQLParser.CURRENT_TIMESTAMP, 0); } + public TerminalNode CURRENT_USER() { return getToken(SQLParser.CURRENT_USER, 0); } + public TerminalNode DATA() { return getToken(SQLParser.DATA, 0); } + public TerminalNode DATABASE() { return getToken(SQLParser.DATABASE, 0); } + public TerminalNode DATABASES() { return getToken(SQLParser.DATABASES, 0); } + public TerminalNode DAY() { return getToken(SQLParser.DAY, 0); } + public TerminalNode DBPROPERTIES() { return getToken(SQLParser.DBPROPERTIES, 0); } + public TerminalNode DEFINED() { return getToken(SQLParser.DEFINED, 0); } + public TerminalNode DELETE() { return getToken(SQLParser.DELETE, 0); } + public TerminalNode DELIMITED() { return getToken(SQLParser.DELIMITED, 0); } + public TerminalNode DESC() { return getToken(SQLParser.DESC, 0); } + public TerminalNode DESCRIBE() { return getToken(SQLParser.DESCRIBE, 0); } + public TerminalNode DFS() { return getToken(SQLParser.DFS, 0); } + public TerminalNode DIRECTORIES() { return getToken(SQLParser.DIRECTORIES, 0); } + public TerminalNode DIRECTORY() { return getToken(SQLParser.DIRECTORY, 0); } + public TerminalNode DISTINCT() { return getToken(SQLParser.DISTINCT, 0); } + public TerminalNode DISTRIBUTE() { return getToken(SQLParser.DISTRIBUTE, 0); } + public TerminalNode DIV() { return getToken(SQLParser.DIV, 0); } + public TerminalNode DROP() { return getToken(SQLParser.DROP, 0); } + public TerminalNode ELSE() { return getToken(SQLParser.ELSE, 0); } + public TerminalNode END() { return getToken(SQLParser.END, 0); } + public TerminalNode ESCAPE() { return getToken(SQLParser.ESCAPE, 0); } + public TerminalNode ESCAPED() { return getToken(SQLParser.ESCAPED, 0); } + public TerminalNode EXCHANGE() { return getToken(SQLParser.EXCHANGE, 0); } + public TerminalNode EXISTS() { return getToken(SQLParser.EXISTS, 0); } + public TerminalNode EXPLAIN() { return getToken(SQLParser.EXPLAIN, 0); } + public TerminalNode EXPORT() { return getToken(SQLParser.EXPORT, 0); } + public TerminalNode EXTENDED() { return getToken(SQLParser.EXTENDED, 0); } + public TerminalNode EXTERNAL() { return getToken(SQLParser.EXTERNAL, 0); } + public TerminalNode EXTRACT() { return getToken(SQLParser.EXTRACT, 0); } + public TerminalNode FALSE() { return getToken(SQLParser.FALSE, 0); } + public TerminalNode FETCH() { return getToken(SQLParser.FETCH, 0); } + public TerminalNode FILTER() { return getToken(SQLParser.FILTER, 0); } + public TerminalNode FIELDS() { return getToken(SQLParser.FIELDS, 0); } + public TerminalNode FILEFORMAT() { return getToken(SQLParser.FILEFORMAT, 0); } + public TerminalNode FIRST() { return getToken(SQLParser.FIRST, 0); } + public TerminalNode FOLLOWING() { return getToken(SQLParser.FOLLOWING, 0); } + public TerminalNode FOR() { return getToken(SQLParser.FOR, 0); } + public TerminalNode FOREIGN() { return getToken(SQLParser.FOREIGN, 0); } + public TerminalNode FORMAT() { return getToken(SQLParser.FORMAT, 0); } + public TerminalNode FORMATTED() { return getToken(SQLParser.FORMATTED, 0); } + public TerminalNode FROM() { return getToken(SQLParser.FROM, 0); } + public TerminalNode FUNCTION() { return getToken(SQLParser.FUNCTION, 0); } + public TerminalNode FUNCTIONS() { return getToken(SQLParser.FUNCTIONS, 0); } + public TerminalNode GLOBAL() { return getToken(SQLParser.GLOBAL, 0); } + public TerminalNode GRANT() { return getToken(SQLParser.GRANT, 0); } + public TerminalNode GROUP() { return getToken(SQLParser.GROUP, 0); } + public TerminalNode GROUPING() { return getToken(SQLParser.GROUPING, 0); } + public TerminalNode HAVING() { return getToken(SQLParser.HAVING, 0); } + public TerminalNode HOUR() { return getToken(SQLParser.HOUR, 0); } + public TerminalNode IF() { return getToken(SQLParser.IF, 0); } + public TerminalNode IGNORE() { return getToken(SQLParser.IGNORE, 0); } + public TerminalNode IMPORT() { return getToken(SQLParser.IMPORT, 0); } + public TerminalNode IN() { return getToken(SQLParser.IN, 0); } + public TerminalNode INDEX() { return getToken(SQLParser.INDEX, 0); } + public TerminalNode INDEXES() { return getToken(SQLParser.INDEXES, 0); } + public TerminalNode INPATH() { return getToken(SQLParser.INPATH, 0); } + public TerminalNode INPUTFORMAT() { return getToken(SQLParser.INPUTFORMAT, 0); } + public TerminalNode INSERT() { return getToken(SQLParser.INSERT, 0); } + public TerminalNode INTERVAL() { return getToken(SQLParser.INTERVAL, 0); } + public TerminalNode INTO() { return getToken(SQLParser.INTO, 0); } + public TerminalNode IS() { return getToken(SQLParser.IS, 0); } + public TerminalNode ITEMS() { return getToken(SQLParser.ITEMS, 0); } + public TerminalNode KEYS() { return getToken(SQLParser.KEYS, 0); } + public TerminalNode LAST() { return getToken(SQLParser.LAST, 0); } + public TerminalNode LAZY() { return getToken(SQLParser.LAZY, 0); } + public TerminalNode LEADING() { return getToken(SQLParser.LEADING, 0); } + public TerminalNode LIKE() { return getToken(SQLParser.LIKE, 0); } + public TerminalNode LIMIT() { return getToken(SQLParser.LIMIT, 0); } + public TerminalNode LINES() { return getToken(SQLParser.LINES, 0); } + public TerminalNode LIST() { return getToken(SQLParser.LIST, 0); } + public TerminalNode LOAD() { return getToken(SQLParser.LOAD, 0); } + public TerminalNode LOCAL() { return getToken(SQLParser.LOCAL, 0); } + public TerminalNode LOCATION() { return getToken(SQLParser.LOCATION, 0); } + public TerminalNode LOCK() { return getToken(SQLParser.LOCK, 0); } + public TerminalNode LOCKS() { return getToken(SQLParser.LOCKS, 0); } + public TerminalNode LOGICAL() { return getToken(SQLParser.LOGICAL, 0); } + public TerminalNode MACRO() { return getToken(SQLParser.MACRO, 0); } + public TerminalNode MAP() { return getToken(SQLParser.MAP, 0); } + public TerminalNode MATCHED() { return getToken(SQLParser.MATCHED, 0); } + public TerminalNode MERGE() { return getToken(SQLParser.MERGE, 0); } + public TerminalNode MINUTE() { return getToken(SQLParser.MINUTE, 0); } + public TerminalNode MONTH() { return getToken(SQLParser.MONTH, 0); } + public TerminalNode MSCK() { return getToken(SQLParser.MSCK, 0); } + public TerminalNode NAMESPACE() { return getToken(SQLParser.NAMESPACE, 0); } + public TerminalNode NAMESPACES() { return getToken(SQLParser.NAMESPACES, 0); } + public TerminalNode NO() { return getToken(SQLParser.NO, 0); } + public TerminalNode NOT() { return getToken(SQLParser.NOT, 0); } + public TerminalNode NULL() { return getToken(SQLParser.NULL, 0); } + public TerminalNode NULLS() { return getToken(SQLParser.NULLS, 0); } + public TerminalNode OF() { return getToken(SQLParser.OF, 0); } + public TerminalNode OFFSET() { return getToken(SQLParser.OFFSET, 0); } + public TerminalNode ONLY() { return getToken(SQLParser.ONLY, 0); } + public TerminalNode OPTION() { return getToken(SQLParser.OPTION, 0); } + public TerminalNode OPTIONS() { return getToken(SQLParser.OPTIONS, 0); } + public TerminalNode OR() { return getToken(SQLParser.OR, 0); } + public TerminalNode ORDER() { return getToken(SQLParser.ORDER, 0); } + public TerminalNode OUT() { return getToken(SQLParser.OUT, 0); } + public TerminalNode OUTER() { return getToken(SQLParser.OUTER, 0); } + public TerminalNode OUTPUTFORMAT() { return getToken(SQLParser.OUTPUTFORMAT, 0); } + public TerminalNode OVER() { return getToken(SQLParser.OVER, 0); } + public TerminalNode OVERLAPS() { return getToken(SQLParser.OVERLAPS, 0); } + public TerminalNode OVERLAY() { return getToken(SQLParser.OVERLAY, 0); } + public TerminalNode OVERWRITE() { return getToken(SQLParser.OVERWRITE, 0); } + public TerminalNode PARTITION() { return getToken(SQLParser.PARTITION, 0); } + public TerminalNode PARTITIONED() { return getToken(SQLParser.PARTITIONED, 0); } + public TerminalNode PARTITIONS() { return getToken(SQLParser.PARTITIONS, 0); } + public TerminalNode PERCENTLIT() { return getToken(SQLParser.PERCENTLIT, 0); } + public TerminalNode PIVOT() { return getToken(SQLParser.PIVOT, 0); } + public TerminalNode PLACING() { return getToken(SQLParser.PLACING, 0); } + public TerminalNode POSITION() { return getToken(SQLParser.POSITION, 0); } + public TerminalNode PRECEDING() { return getToken(SQLParser.PRECEDING, 0); } + public TerminalNode PRIMARY() { return getToken(SQLParser.PRIMARY, 0); } + public TerminalNode PRINCIPALS() { return getToken(SQLParser.PRINCIPALS, 0); } + public TerminalNode PROPERTIES() { return getToken(SQLParser.PROPERTIES, 0); } + public TerminalNode PURGE() { return getToken(SQLParser.PURGE, 0); } + public TerminalNode QUERY() { return getToken(SQLParser.QUERY, 0); } + public TerminalNode RANGE() { return getToken(SQLParser.RANGE, 0); } + public TerminalNode RECORDREADER() { return getToken(SQLParser.RECORDREADER, 0); } + public TerminalNode RECORDWRITER() { return getToken(SQLParser.RECORDWRITER, 0); } + public TerminalNode RECOVER() { return getToken(SQLParser.RECOVER, 0); } + public TerminalNode REDUCE() { return getToken(SQLParser.REDUCE, 0); } + public TerminalNode REFERENCES() { return getToken(SQLParser.REFERENCES, 0); } + public TerminalNode REFRESH() { return getToken(SQLParser.REFRESH, 0); } + public TerminalNode RENAME() { return getToken(SQLParser.RENAME, 0); } + public TerminalNode REPAIR() { return getToken(SQLParser.REPAIR, 0); } + public TerminalNode REPLACE() { return getToken(SQLParser.REPLACE, 0); } + public TerminalNode RESET() { return getToken(SQLParser.RESET, 0); } + public TerminalNode RESPECT() { return getToken(SQLParser.RESPECT, 0); } + public TerminalNode RESTRICT() { return getToken(SQLParser.RESTRICT, 0); } + public TerminalNode REVOKE() { return getToken(SQLParser.REVOKE, 0); } + public TerminalNode RLIKE() { return getToken(SQLParser.RLIKE, 0); } + public TerminalNode ROLE() { return getToken(SQLParser.ROLE, 0); } + public TerminalNode ROLES() { return getToken(SQLParser.ROLES, 0); } + public TerminalNode ROLLBACK() { return getToken(SQLParser.ROLLBACK, 0); } + public TerminalNode ROLLUP() { return getToken(SQLParser.ROLLUP, 0); } + public TerminalNode ROW() { return getToken(SQLParser.ROW, 0); } + public TerminalNode ROWS() { return getToken(SQLParser.ROWS, 0); } + public TerminalNode SCHEMA() { return getToken(SQLParser.SCHEMA, 0); } + public TerminalNode SECOND() { return getToken(SQLParser.SECOND, 0); } + public TerminalNode SELECT() { return getToken(SQLParser.SELECT, 0); } + public TerminalNode SEPARATED() { return getToken(SQLParser.SEPARATED, 0); } + public TerminalNode SERDE() { return getToken(SQLParser.SERDE, 0); } + public TerminalNode SERDEPROPERTIES() { return getToken(SQLParser.SERDEPROPERTIES, 0); } + public TerminalNode SESSION_USER() { return getToken(SQLParser.SESSION_USER, 0); } + public TerminalNode SET() { return getToken(SQLParser.SET, 0); } + public TerminalNode SETS() { return getToken(SQLParser.SETS, 0); } + public TerminalNode SHOW() { return getToken(SQLParser.SHOW, 0); } + public TerminalNode SKEWED() { return getToken(SQLParser.SKEWED, 0); } + public TerminalNode SOME() { return getToken(SQLParser.SOME, 0); } + public TerminalNode SORT() { return getToken(SQLParser.SORT, 0); } + public TerminalNode SORTED() { return getToken(SQLParser.SORTED, 0); } + public TerminalNode START() { return getToken(SQLParser.START, 0); } + public TerminalNode STATISTICS() { return getToken(SQLParser.STATISTICS, 0); } + public TerminalNode STORED() { return getToken(SQLParser.STORED, 0); } + public TerminalNode STRATIFY() { return getToken(SQLParser.STRATIFY, 0); } + public TerminalNode STRUCT() { return getToken(SQLParser.STRUCT, 0); } + public TerminalNode SUBSTR() { return getToken(SQLParser.SUBSTR, 0); } + public TerminalNode SUBSTRING() { return getToken(SQLParser.SUBSTRING, 0); } + public TerminalNode SYNC() { return getToken(SQLParser.SYNC, 0); } + public TerminalNode TABLE() { return getToken(SQLParser.TABLE, 0); } + public TerminalNode TABLES() { return getToken(SQLParser.TABLES, 0); } + public TerminalNode TABLESAMPLE() { return getToken(SQLParser.TABLESAMPLE, 0); } + public TerminalNode TBLPROPERTIES() { return getToken(SQLParser.TBLPROPERTIES, 0); } + public TerminalNode TEMPORARY() { return getToken(SQLParser.TEMPORARY, 0); } + public TerminalNode TERMINATED() { return getToken(SQLParser.TERMINATED, 0); } + public TerminalNode THEN() { return getToken(SQLParser.THEN, 0); } + public TerminalNode TIME() { return getToken(SQLParser.TIME, 0); } + public TerminalNode TO() { return getToken(SQLParser.TO, 0); } + public TerminalNode TOUCH() { return getToken(SQLParser.TOUCH, 0); } + public TerminalNode TRAILING() { return getToken(SQLParser.TRAILING, 0); } + public TerminalNode TRANSACTION() { return getToken(SQLParser.TRANSACTION, 0); } + public TerminalNode TRANSACTIONS() { return getToken(SQLParser.TRANSACTIONS, 0); } + public TerminalNode TRANSFORM() { return getToken(SQLParser.TRANSFORM, 0); } + public TerminalNode TRIM() { return getToken(SQLParser.TRIM, 0); } + public TerminalNode TRUE() { return getToken(SQLParser.TRUE, 0); } + public TerminalNode TRUNCATE() { return getToken(SQLParser.TRUNCATE, 0); } + public TerminalNode TRY_CAST() { return getToken(SQLParser.TRY_CAST, 0); } + public TerminalNode TYPE() { return getToken(SQLParser.TYPE, 0); } + public TerminalNode UNARCHIVE() { return getToken(SQLParser.UNARCHIVE, 0); } + public TerminalNode UNBOUNDED() { return getToken(SQLParser.UNBOUNDED, 0); } + public TerminalNode UNCACHE() { return getToken(SQLParser.UNCACHE, 0); } + public TerminalNode UNIQUE() { return getToken(SQLParser.UNIQUE, 0); } + public TerminalNode UNKNOWN() { return getToken(SQLParser.UNKNOWN, 0); } + public TerminalNode UNLOCK() { return getToken(SQLParser.UNLOCK, 0); } + public TerminalNode UNSET() { return getToken(SQLParser.UNSET, 0); } + public TerminalNode UPDATE() { return getToken(SQLParser.UPDATE, 0); } + public TerminalNode USE() { return getToken(SQLParser.USE, 0); } + public TerminalNode USER() { return getToken(SQLParser.USER, 0); } + public TerminalNode VALUES() { return getToken(SQLParser.VALUES, 0); } + public TerminalNode VIEW() { return getToken(SQLParser.VIEW, 0); } + public TerminalNode VIEWS() { return getToken(SQLParser.VIEWS, 0); } + public TerminalNode WHEN() { return getToken(SQLParser.WHEN, 0); } + public TerminalNode WHERE() { return getToken(SQLParser.WHERE, 0); } + public TerminalNode WINDOW() { return getToken(SQLParser.WINDOW, 0); } + public TerminalNode WITH() { return getToken(SQLParser.WITH, 0); } + public TerminalNode YEAR() { return getToken(SQLParser.YEAR, 0); } + public TerminalNode ZONE() { return getToken(SQLParser.ZONE, 0); } + public NonReservedContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nonReserved; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).enterNonReserved(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SQLListener ) ((SQLListener)listener).exitNonReserved(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SQLVisitor ) return ((SQLVisitor)visitor).visitNonReserved(this); + else return visitor.visitChildren(this); + } + } + + public final NonReservedContext nonReserved() throws RecognitionException { + NonReservedContext _localctx = new NonReservedContext(_ctx, getState()); + enterRule(_localctx, 286, RULE_nonReserved); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(3152); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << AFTER) | (1L << ALL) | (1L << ALTER) | (1L << ANALYZE) | (1L << AND) | (1L << ANY) | (1L << ARCHIVE) | (1L << ARRAY) | (1L << AS) | (1L << ASC) | (1L << AT) | (1L << AUTHORIZATION) | (1L << BETWEEN) | (1L << BOTH) | (1L << BUCKET) | (1L << BUCKETS) | (1L << BY) | (1L << CACHE) | (1L << CASCADE) | (1L << CASE) | (1L << CAST) | (1L << CHANGE) | (1L << CHECK) | (1L << CLEAR) | (1L << CLUSTER) | (1L << CLUSTERED) | (1L << CODEGEN) | (1L << COLLATE) | (1L << COLLECTION) | (1L << COLUMN) | (1L << COLUMNS) | (1L << COMMENT) | (1L << COMMIT) | (1L << COMPACT) | (1L << COMPACTIONS) | (1L << COMPUTE) | (1L << CONCATENATE) | (1L << CONSTRAINT) | (1L << COST) | (1L << CREATE) | (1L << CUBE) | (1L << CURRENT) | (1L << CURRENT_DATE) | (1L << CURRENT_TIME) | (1L << CURRENT_TIMESTAMP) | (1L << CURRENT_USER) | (1L << DAY) | (1L << DATA) | (1L << DATABASE) | (1L << DATABASES) | (1L << DBPROPERTIES) | (1L << DEFINED) | (1L << DELETE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (DELIMITED - 64)) | (1L << (DESC - 64)) | (1L << (DESCRIBE - 64)) | (1L << (DFS - 64)) | (1L << (DIRECTORIES - 64)) | (1L << (DIRECTORY - 64)) | (1L << (DISTINCT - 64)) | (1L << (DISTRIBUTE - 64)) | (1L << (DIV - 64)) | (1L << (DROP - 64)) | (1L << (ELSE - 64)) | (1L << (END - 64)) | (1L << (ESCAPE - 64)) | (1L << (ESCAPED - 64)) | (1L << (EXCHANGE - 64)) | (1L << (EXISTS - 64)) | (1L << (EXPLAIN - 64)) | (1L << (EXPORT - 64)) | (1L << (EXTENDED - 64)) | (1L << (EXTERNAL - 64)) | (1L << (EXTRACT - 64)) | (1L << (FALSE - 64)) | (1L << (FETCH - 64)) | (1L << (FIELDS - 64)) | (1L << (FILTER - 64)) | (1L << (FILEFORMAT - 64)) | (1L << (FIRST - 64)) | (1L << (FOLLOWING - 64)) | (1L << (FOR - 64)) | (1L << (FOREIGN - 64)) | (1L << (FORMAT - 64)) | (1L << (FORMATTED - 64)) | (1L << (FROM - 64)) | (1L << (FUNCTION - 64)) | (1L << (FUNCTIONS - 64)) | (1L << (GLOBAL - 64)) | (1L << (GRANT - 64)) | (1L << (GROUP - 64)) | (1L << (GROUPING - 64)) | (1L << (HAVING - 64)) | (1L << (HOUR - 64)) | (1L << (IF - 64)) | (1L << (IGNORE - 64)) | (1L << (IMPORT - 64)) | (1L << (IN - 64)) | (1L << (INDEX - 64)) | (1L << (INDEXES - 64)) | (1L << (INPATH - 64)) | (1L << (INPUTFORMAT - 64)) | (1L << (INSERT - 64)) | (1L << (INTERVAL - 64)) | (1L << (INTO - 64)) | (1L << (IS - 64)) | (1L << (ITEMS - 64)) | (1L << (KEYS - 64)) | (1L << (LAST - 64)) | (1L << (LAZY - 64)) | (1L << (LEADING - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (LIKE - 129)) | (1L << (LIMIT - 129)) | (1L << (LINES - 129)) | (1L << (LIST - 129)) | (1L << (LOAD - 129)) | (1L << (LOCAL - 129)) | (1L << (LOCATION - 129)) | (1L << (LOCK - 129)) | (1L << (LOCKS - 129)) | (1L << (LOGICAL - 129)) | (1L << (MACRO - 129)) | (1L << (MAP - 129)) | (1L << (MATCHED - 129)) | (1L << (MERGE - 129)) | (1L << (MINUTE - 129)) | (1L << (MONTH - 129)) | (1L << (MSCK - 129)) | (1L << (NAMESPACE - 129)) | (1L << (NAMESPACES - 129)) | (1L << (NO - 129)) | (1L << (NOT - 129)) | (1L << (NULL - 129)) | (1L << (NULLS - 129)) | (1L << (OF - 129)) | (1L << (OFFSET - 129)) | (1L << (ONLY - 129)) | (1L << (OPTION - 129)) | (1L << (OPTIONS - 129)) | (1L << (OR - 129)) | (1L << (ORDER - 129)) | (1L << (OUT - 129)) | (1L << (OUTER - 129)) | (1L << (OUTPUTFORMAT - 129)) | (1L << (OVER - 129)) | (1L << (OVERLAPS - 129)) | (1L << (OVERLAY - 129)) | (1L << (OVERWRITE - 129)) | (1L << (PARTITION - 129)) | (1L << (PARTITIONED - 129)) | (1L << (PARTITIONS - 129)) | (1L << (PERCENTLIT - 129)) | (1L << (PIVOT - 129)) | (1L << (PLACING - 129)) | (1L << (POSITION - 129)) | (1L << (PRECEDING - 129)) | (1L << (PRIMARY - 129)) | (1L << (PRINCIPALS - 129)) | (1L << (PROPERTIES - 129)) | (1L << (PURGE - 129)) | (1L << (QUERY - 129)) | (1L << (RANGE - 129)) | (1L << (RECORDREADER - 129)) | (1L << (RECORDWRITER - 129)) | (1L << (RECOVER - 129)) | (1L << (REDUCE - 129)) | (1L << (REFERENCES - 129)) | (1L << (REFRESH - 129)) | (1L << (RENAME - 129)) | (1L << (REPAIR - 129)) | (1L << (REPLACE - 129)) | (1L << (RESET - 129)) | (1L << (RESPECT - 129)))) != 0) || ((((_la - 193)) & ~0x3f) == 0 && ((1L << (_la - 193)) & ((1L << (RESTRICT - 193)) | (1L << (REVOKE - 193)) | (1L << (RLIKE - 193)) | (1L << (ROLE - 193)) | (1L << (ROLES - 193)) | (1L << (ROLLBACK - 193)) | (1L << (ROLLUP - 193)) | (1L << (ROW - 193)) | (1L << (ROWS - 193)) | (1L << (SECOND - 193)) | (1L << (SCHEMA - 193)) | (1L << (SELECT - 193)) | (1L << (SEPARATED - 193)) | (1L << (SERDE - 193)) | (1L << (SERDEPROPERTIES - 193)) | (1L << (SESSION_USER - 193)) | (1L << (SET - 193)) | (1L << (SETS - 193)) | (1L << (SHOW - 193)) | (1L << (SKEWED - 193)) | (1L << (SOME - 193)) | (1L << (SORT - 193)) | (1L << (SORTED - 193)) | (1L << (START - 193)) | (1L << (STATISTICS - 193)) | (1L << (STORED - 193)) | (1L << (STRATIFY - 193)) | (1L << (STRUCT - 193)) | (1L << (SUBSTR - 193)) | (1L << (SUBSTRING - 193)) | (1L << (SYNC - 193)) | (1L << (TABLE - 193)) | (1L << (TABLES - 193)) | (1L << (TABLESAMPLE - 193)) | (1L << (TBLPROPERTIES - 193)) | (1L << (TEMPORARY - 193)) | (1L << (TERMINATED - 193)) | (1L << (THEN - 193)) | (1L << (TIME - 193)) | (1L << (TO - 193)) | (1L << (TOUCH - 193)) | (1L << (TRAILING - 193)) | (1L << (TRANSACTION - 193)) | (1L << (TRANSACTIONS - 193)) | (1L << (TRANSFORM - 193)) | (1L << (TRIM - 193)) | (1L << (TRUE - 193)) | (1L << (TRUNCATE - 193)) | (1L << (TRY_CAST - 193)) | (1L << (TYPE - 193)) | (1L << (UNARCHIVE - 193)) | (1L << (UNBOUNDED - 193)) | (1L << (UNCACHE - 193)) | (1L << (UNIQUE - 193)) | (1L << (UNKNOWN - 193)) | (1L << (UNLOCK - 193)) | (1L << (UNSET - 193)) | (1L << (UPDATE - 193)) | (1L << (USE - 193)) | (1L << (USER - 193)))) != 0) || ((((_la - 258)) & ~0x3f) == 0 && ((1L << (_la - 258)) & ((1L << (VALUES - 258)) | (1L << (VIEW - 258)) | (1L << (VIEWS - 258)) | (1L << (WHEN - 258)) | (1L << (WHERE - 258)) | (1L << (WINDOW - 258)) | (1L << (WITH - 258)) | (1L << (YEAR - 258)) | (1L << (ZONE - 258)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 42: + return queryTerm_sempred((QueryTermContext)_localctx, predIndex); + case 101: + return booleanExpression_sempred((BooleanExpressionContext)_localctx, predIndex); + case 103: + return valueExpression_sempred((ValueExpressionContext)_localctx, predIndex); + case 104: + return primaryExpression_sempred((PrimaryExpressionContext)_localctx, predIndex); + case 136: + return identifier_sempred((IdentifierContext)_localctx, predIndex); + case 137: + return strictIdentifier_sempred((StrictIdentifierContext)_localctx, predIndex); + case 139: + return number_sempred((NumberContext)_localctx, predIndex); + } + return true; + } + private boolean queryTerm_sempred(QueryTermContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return precpred(_ctx, 3); + case 1: + return legacy_setops_precedence_enabled; + case 2: + return precpred(_ctx, 2); + case 3: + return !legacy_setops_precedence_enabled; + case 4: + return precpred(_ctx, 1); + case 5: + return !legacy_setops_precedence_enabled; + } + return true; + } + private boolean booleanExpression_sempred(BooleanExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 6: + return precpred(_ctx, 2); + case 7: + return precpred(_ctx, 1); + } + return true; + } + private boolean valueExpression_sempred(ValueExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 8: + return precpred(_ctx, 6); + case 9: + return precpred(_ctx, 5); + case 10: + return precpred(_ctx, 4); + case 11: + return precpred(_ctx, 3); + case 12: + return precpred(_ctx, 2); + case 13: + return precpred(_ctx, 1); + } + return true; + } + private boolean primaryExpression_sempred(PrimaryExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 14: + return precpred(_ctx, 8); + case 15: + return precpred(_ctx, 6); + } + return true; + } + private boolean identifier_sempred(IdentifierContext _localctx, int predIndex) { + switch (predIndex) { + case 16: + return !SQL_standard_keyword_behavior; + } + return true; + } + private boolean strictIdentifier_sempred(StrictIdentifierContext _localctx, int predIndex) { + switch (predIndex) { + case 17: + return SQL_standard_keyword_behavior; + case 18: + return !SQL_standard_keyword_behavior; + } + return true; + } + private boolean number_sempred(NumberContext _localctx, int predIndex) { + switch (predIndex) { + case 19: + return !legacy_exponent_literal_as_decimal_enabled; + case 20: + return !legacy_exponent_literal_as_decimal_enabled; + case 21: + return legacy_exponent_literal_as_decimal_enabled; + } + return true; + } + + private static final int _serializedATNSegments = 2; + private static final String _serializedATNSegment0 = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0134\u0c55\4\2\t"+ + "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ + "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ + "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ + "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ + "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ + ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ + "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ + "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ + "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ + "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ + "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+ + "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ + "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080"+ + "\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084\4\u0085"+ + "\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089"+ + "\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e"+ + "\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\3\2\3\2\7\2\u0125"+ + "\n\2\f\2\16\2\u0128\13\2\3\2\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\5\3\5\3\5\3"+ + "\6\3\6\3\6\3\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\5\t\u0140\n\t\3\t\3\t\3\t\5"+ + "\t\u0145\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u014d\n\t\3\t\3\t\3\t\3\t\3\t"+ + "\3\t\7\t\u0155\n\t\f\t\16\t\u0158\13\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t"+ + "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u016b\n\t\3\t\3\t\5\t\u016f\n"+ + "\t\3\t\3\t\3\t\3\t\5\t\u0175\n\t\3\t\5\t\u0178\n\t\3\t\5\t\u017b\n\t\3"+ + "\t\3\t\3\t\3\t\3\t\5\t\u0182\n\t\3\t\5\t\u0185\n\t\3\t\3\t\5\t\u0189\n"+ + "\t\3\t\5\t\u018c\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0193\n\t\3\t\3\t\3\t\3\t"+ + "\3\t\3\t\3\t\3\t\3\t\7\t\u019e\n\t\f\t\16\t\u01a1\13\t\3\t\3\t\3\t\3\t"+ + "\3\t\5\t\u01a8\n\t\3\t\5\t\u01ab\n\t\3\t\3\t\5\t\u01af\n\t\3\t\5\t\u01b2"+ + "\n\t\3\t\3\t\3\t\3\t\5\t\u01b8\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t"+ + "\5\t\u01c3\n\t\3\t\3\t\3\t\3\t\5\t\u01c9\n\t\3\t\3\t\3\t\5\t\u01ce\n\t"+ + "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3"+ + "\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t"+ + "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3"+ + "\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u020e\n\t\3\t\3\t\3\t\3\t\3"+ + "\t\3\t\3\t\5\t\u0217\n\t\3\t\3\t\5\t\u021b\n\t\3\t\3\t\3\t\3\t\5\t\u0221"+ + "\n\t\3\t\3\t\5\t\u0225\n\t\3\t\3\t\3\t\5\t\u022a\n\t\3\t\3\t\3\t\3\t\5"+ + "\t\u0230\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u023c\n\t\3\t"+ + "\3\t\3\t\3\t\3\t\3\t\5\t\u0244\n\t\3\t\3\t\3\t\3\t\5\t\u024a\n\t\3\t\3"+ + "\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0257\n\t\3\t\6\t\u025a\n\t"+ + "\r\t\16\t\u025b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3"+ + "\t\5\t\u026c\n\t\3\t\3\t\3\t\7\t\u0271\n\t\f\t\16\t\u0274\13\t\3\t\5\t"+ + "\u0277\n\t\3\t\3\t\3\t\3\t\5\t\u027d\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3"+ + "\t\3\t\3\t\3\t\3\t\3\t\5\t\u028c\n\t\3\t\3\t\5\t\u0290\n\t\3\t\3\t\3\t"+ + "\3\t\5\t\u0296\n\t\3\t\3\t\3\t\3\t\5\t\u029c\n\t\3\t\5\t\u029f\n\t\3\t"+ + "\5\t\u02a2\n\t\3\t\3\t\3\t\3\t\5\t\u02a8\n\t\3\t\3\t\5\t\u02ac\n\t\3\t"+ + "\3\t\3\t\3\t\3\t\3\t\7\t\u02b4\n\t\f\t\16\t\u02b7\13\t\3\t\3\t\3\t\3\t"+ + "\3\t\3\t\5\t\u02bf\n\t\3\t\5\t\u02c2\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5"+ + "\t\u02cb\n\t\3\t\3\t\3\t\5\t\u02d0\n\t\3\t\3\t\3\t\3\t\5\t\u02d6\n\t\3"+ + "\t\3\t\3\t\3\t\3\t\5\t\u02dd\n\t\3\t\5\t\u02e0\n\t\3\t\3\t\3\t\3\t\5\t"+ + "\u02e6\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t\u02ef\n\t\f\t\16\t\u02f2\13"+ + "\t\5\t\u02f4\n\t\3\t\3\t\5\t\u02f8\n\t\3\t\3\t\3\t\5\t\u02fd\n\t\3\t\3"+ + "\t\3\t\5\t\u0302\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0309\n\t\3\t\5\t\u030c\n"+ + "\t\3\t\5\t\u030f\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0316\n\t\3\t\3\t\3\t\5\t"+ + "\u031b\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0324\n\t\3\t\3\t\3\t\3\t\3"+ + "\t\3\t\5\t\u032c\n\t\3\t\3\t\3\t\3\t\5\t\u0332\n\t\3\t\5\t\u0335\n\t\3"+ + "\t\5\t\u0338\n\t\3\t\3\t\3\t\3\t\5\t\u033e\n\t\3\t\3\t\5\t\u0342\n\t\3"+ + "\t\3\t\5\t\u0346\n\t\3\t\3\t\5\t\u034a\n\t\5\t\u034c\n\t\3\t\3\t\3\t\3"+ + "\t\3\t\3\t\5\t\u0354\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u035c\n\t\3\t\3\t"+ + "\3\t\3\t\5\t\u0362\n\t\3\t\3\t\3\t\3\t\5\t\u0368\n\t\3\t\5\t\u036b\n\t"+ + "\3\t\3\t\5\t\u036f\n\t\3\t\5\t\u0372\n\t\3\t\3\t\5\t\u0376\n\t\3\t\3\t"+ + "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3"+ + "\t\3\t\3\t\3\t\3\t\7\t\u0390\n\t\f\t\16\t\u0393\13\t\5\t\u0395\n\t\3\t"+ + "\3\t\5\t\u0399\n\t\3\t\3\t\3\t\3\t\5\t\u039f\n\t\3\t\5\t\u03a2\n\t\3\t"+ + "\5\t\u03a5\n\t\3\t\3\t\3\t\3\t\5\t\u03ab\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5"+ + "\t\u03b3\n\t\3\t\3\t\3\t\5\t\u03b8\n\t\3\t\3\t\3\t\3\t\5\t\u03be\n\t\3"+ + "\t\3\t\3\t\3\t\5\t\u03c4\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u03cc\n\t\3\t"+ + "\3\t\3\t\7\t\u03d1\n\t\f\t\16\t\u03d4\13\t\3\t\3\t\3\t\7\t\u03d9\n\t\f"+ + "\t\16\t\u03dc\13\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t"+ + "\u03ea\n\t\f\t\16\t\u03ed\13\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t"+ + "\u03f8\n\t\f\t\16\t\u03fb\13\t\5\t\u03fd\n\t\3\t\3\t\7\t\u0401\n\t\f\t"+ + "\16\t\u0404\13\t\3\t\3\t\3\t\3\t\7\t\u040a\n\t\f\t\16\t\u040d\13\t\3\t"+ + "\3\t\3\t\3\t\7\t\u0413\n\t\f\t\16\t\u0416\13\t\3\t\3\t\7\t\u041a\n\t\f"+ + "\t\16\t\u041d\13\t\5\t\u041f\n\t\3\n\3\n\3\13\3\13\3\f\3\f\3\f\3\f\3\f"+ + "\3\f\5\f\u042b\n\f\3\f\3\f\5\f\u042f\n\f\3\f\3\f\3\f\3\f\3\f\5\f\u0436"+ + "\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3"+ + "\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+ + "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3"+ + "\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+ + "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3"+ + "\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+ + "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u04aa\n\f\3\f\3\f\3\f\3\f"+ + "\3\f\3\f\5\f\u04b2\n\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u04ba\n\f\3\f\3\f\3"+ + "\f\3\f\3\f\3\f\3\f\5\f\u04c3\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u04cd"+ + "\n\f\3\r\3\r\5\r\u04d1\n\r\3\r\5\r\u04d4\n\r\3\r\3\r\3\r\3\r\5\r\u04da"+ + "\n\r\3\r\3\r\3\16\3\16\5\16\u04e0\n\16\3\16\3\16\3\16\3\16\3\17\3\17\3"+ + "\17\3\17\3\17\3\17\5\17\u04ec\n\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20"+ + "\3\20\3\20\3\20\5\20\u04f8\n\20\3\20\3\20\3\20\5\20\u04fd\n\20\3\21\3"+ + "\21\3\21\3\22\3\22\3\22\3\23\5\23\u0506\n\23\3\23\3\23\3\23\3\24\3\24"+ + "\3\24\5\24\u050e\n\24\3\24\3\24\3\24\3\24\3\24\5\24\u0515\n\24\5\24\u0517"+ + "\n\24\3\24\5\24\u051a\n\24\3\24\3\24\3\24\5\24\u051f\n\24\3\24\3\24\5"+ + "\24\u0523\n\24\3\24\3\24\3\24\5\24\u0528\n\24\3\24\5\24\u052b\n\24\3\24"+ + "\3\24\3\24\5\24\u0530\n\24\3\24\3\24\3\24\5\24\u0535\n\24\3\24\5\24\u0538"+ + "\n\24\3\24\3\24\3\24\5\24\u053d\n\24\3\24\3\24\5\24\u0541\n\24\3\24\3"+ + "\24\3\24\5\24\u0546\n\24\5\24\u0548\n\24\3\25\3\25\5\25\u054c\n\25\3\26"+ + "\3\26\3\26\3\26\3\26\7\26\u0553\n\26\f\26\16\26\u0556\13\26\3\26\3\26"+ + "\3\27\3\27\3\27\5\27\u055d\n\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31\5\31"+ + "\u0566\n\31\3\32\3\32\3\32\7\32\u056b\n\32\f\32\16\32\u056e\13\32\3\33"+ + "\3\33\3\33\3\33\7\33\u0574\n\33\f\33\16\33\u0577\13\33\3\34\3\34\5\34"+ + "\u057b\n\34\3\34\5\34\u057e\n\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3"+ + "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0594"+ + "\n\36\f\36\16\36\u0597\13\36\3\37\3\37\3\37\3\37\7\37\u059d\n\37\f\37"+ + "\16\37\u05a0\13\37\3\37\3\37\3 \3 \5 \u05a6\n \3 \5 \u05a9\n \3!\3!\3"+ + "!\7!\u05ae\n!\f!\16!\u05b1\13!\3!\5!\u05b4\n!\3\"\3\"\3\"\3\"\5\"\u05ba"+ + "\n\"\3#\3#\3#\3#\7#\u05c0\n#\f#\16#\u05c3\13#\3#\3#\3$\3$\3$\3$\7$\u05cb"+ + "\n$\f$\16$\u05ce\13$\3$\3$\3%\3%\3%\3%\3%\3%\5%\u05d8\n%\3&\3&\3&\3&\3"+ + "&\5&\u05df\n&\3\'\3\'\3\'\3\'\5\'\u05e5\n\'\3(\3(\3(\3)\3)\3)\3)\3)\3"+ + ")\6)\u05f0\n)\r)\16)\u05f1\3)\3)\3)\3)\3)\5)\u05f9\n)\3)\3)\3)\3)\3)\5"+ + ")\u0600\n)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u060c\n)\3)\3)\3)\3)\7)\u0612"+ + "\n)\f)\16)\u0615\13)\3)\7)\u0618\n)\f)\16)\u061b\13)\5)\u061d\n)\3*\3"+ + "*\3*\3*\3*\7*\u0624\n*\f*\16*\u0627\13*\5*\u0629\n*\3*\3*\3*\3*\3*\7*"+ + "\u0630\n*\f*\16*\u0633\13*\5*\u0635\n*\3*\3*\3*\3*\3*\7*\u063c\n*\f*\16"+ + "*\u063f\13*\5*\u0641\n*\3*\3*\3*\3*\3*\7*\u0648\n*\f*\16*\u064b\13*\5"+ + "*\u064d\n*\3*\5*\u0650\n*\3*\3*\3*\5*\u0655\n*\5*\u0657\n*\3+\3+\3+\3"+ + ",\3,\3,\3,\3,\3,\3,\5,\u0663\n,\3,\3,\3,\3,\3,\5,\u066a\n,\3,\3,\3,\3"+ + ",\3,\5,\u0671\n,\3,\7,\u0674\n,\f,\16,\u0677\13,\3-\3-\3-\3-\3-\3-\3-"+ + "\3-\3-\5-\u0682\n-\3.\3.\5.\u0686\n.\3.\3.\5.\u068a\n.\3/\3/\6/\u068e"+ + "\n/\r/\16/\u068f\3\60\3\60\5\60\u0694\n\60\3\60\3\60\3\60\3\60\7\60\u069a"+ + "\n\60\f\60\16\60\u069d\13\60\3\60\5\60\u06a0\n\60\3\60\5\60\u06a3\n\60"+ + "\3\60\5\60\u06a6\n\60\3\60\5\60\u06a9\n\60\3\60\3\60\5\60\u06ad\n\60\3"+ + "\61\3\61\5\61\u06b1\n\61\3\61\7\61\u06b4\n\61\f\61\16\61\u06b7\13\61\3"+ + "\61\5\61\u06ba\n\61\3\61\5\61\u06bd\n\61\3\61\5\61\u06c0\n\61\3\61\5\61"+ + "\u06c3\n\61\3\61\3\61\5\61\u06c7\n\61\3\61\7\61\u06ca\n\61\f\61\16\61"+ + "\u06cd\13\61\3\61\5\61\u06d0\n\61\3\61\5\61\u06d3\n\61\3\61\5\61\u06d6"+ + "\n\61\3\61\5\61\u06d9\n\61\5\61\u06db\n\61\3\62\3\62\3\62\3\62\5\62\u06e1"+ + "\n\62\3\62\3\62\3\62\3\62\3\62\5\62\u06e8\n\62\3\62\3\62\3\62\5\62\u06ed"+ + "\n\62\3\62\5\62\u06f0\n\62\3\62\5\62\u06f3\n\62\3\62\3\62\5\62\u06f7\n"+ + "\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u0701\n\62\3\62\3\62"+ + "\5\62\u0705\n\62\5\62\u0707\n\62\3\62\5\62\u070a\n\62\3\62\3\62\5\62\u070e"+ + "\n\62\3\63\3\63\7\63\u0712\n\63\f\63\16\63\u0715\13\63\3\63\5\63\u0718"+ + "\n\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\65\5\65\u0723\n\65\3\65"+ + "\3\65\3\65\3\66\3\66\3\66\3\66\3\66\5\66\u072d\n\66\3\66\3\66\3\66\3\67"+ + "\3\67\3\67\3\67\3\67\3\67\3\67\5\67\u0739\n\67\38\38\38\38\38\38\38\3"+ + "8\38\38\38\78\u0746\n8\f8\168\u0749\138\38\38\58\u074d\n8\39\39\39\79"+ + "\u0752\n9\f9\169\u0755\139\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3=\3=\3=\5=\u0764"+ + "\n=\3=\7=\u0767\n=\f=\16=\u076a\13=\3=\3=\3>\3>\3>\3>\3>\3>\7>\u0774\n"+ + ">\f>\16>\u0777\13>\3>\3>\5>\u077b\n>\3?\3?\3?\3?\7?\u0781\n?\f?\16?\u0784"+ + "\13?\3?\7?\u0787\n?\f?\16?\u078a\13?\3?\5?\u078d\n?\3@\3@\3@\3@\3@\7@"+ + "\u0794\n@\f@\16@\u0797\13@\3@\3@\3@\3@\3@\7@\u079e\n@\f@\16@\u07a1\13"+ + "@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\7@\u07ad\n@\f@\16@\u07b0\13@\3@\3@\5@"+ + "\u07b4\n@\5@\u07b6\n@\3A\3A\5A\u07ba\nA\3B\3B\3B\3B\3B\7B\u07c1\nB\fB"+ + "\16B\u07c4\13B\3B\3B\3B\3B\3B\3B\3B\3B\7B\u07ce\nB\fB\16B\u07d1\13B\3"+ + "B\3B\5B\u07d5\nB\3C\3C\5C\u07d9\nC\3D\3D\3D\3D\7D\u07df\nD\fD\16D\u07e2"+ + "\13D\5D\u07e4\nD\3D\3D\5D\u07e8\nD\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\7E\u07f4"+ + "\nE\fE\16E\u07f7\13E\3E\3E\3E\3F\3F\3F\3F\3F\7F\u0801\nF\fF\16F\u0804"+ + "\13F\3F\3F\5F\u0808\nF\3G\3G\5G\u080c\nG\3G\5G\u080f\nG\3H\3H\3H\5H\u0814"+ + "\nH\3H\3H\3H\3H\3H\7H\u081b\nH\fH\16H\u081e\13H\5H\u0820\nH\3H\3H\3H\5"+ + "H\u0825\nH\3H\3H\3H\7H\u082a\nH\fH\16H\u082d\13H\5H\u082f\nH\3I\3I\3J"+ + "\5J\u0834\nJ\3J\3J\7J\u0838\nJ\fJ\16J\u083b\13J\3K\3K\3K\5K\u0840\nK\3"+ + "K\3K\5K\u0844\nK\3K\3K\3K\3K\5K\u084a\nK\3K\3K\5K\u084e\nK\3L\5L\u0851"+ + "\nL\3L\3L\3L\5L\u0856\nL\3L\5L\u0859\nL\3L\3L\3L\5L\u085e\nL\3L\3L\5L"+ + "\u0862\nL\3L\5L\u0865\nL\3L\5L\u0868\nL\3M\3M\3M\3M\5M\u086e\nM\3N\3N"+ + "\3N\5N\u0873\nN\3N\3N\3O\5O\u0878\nO\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O"+ + "\3O\3O\3O\3O\3O\5O\u088a\nO\5O\u088c\nO\3O\5O\u088f\nO\3P\3P\3P\3P\3Q"+ + "\3Q\3Q\7Q\u0898\nQ\fQ\16Q\u089b\13Q\3R\3R\3R\3R\7R\u08a1\nR\fR\16R\u08a4"+ + "\13R\3R\3R\3S\3S\5S\u08aa\nS\3T\3T\3T\3T\7T\u08b0\nT\fT\16T\u08b3\13T"+ + "\3T\3T\3U\3U\5U\u08b9\nU\3V\3V\5V\u08bd\nV\3V\3V\3V\3V\3V\3V\5V\u08c5"+ + "\nV\3V\3V\3V\3V\3V\3V\5V\u08cd\nV\3V\3V\3V\3V\5V\u08d3\nV\3W\3W\3W\3W"+ + "\7W\u08d9\nW\fW\16W\u08dc\13W\3W\3W\3X\3X\3X\3X\3X\7X\u08e5\nX\fX\16X"+ + "\u08e8\13X\5X\u08ea\nX\3X\3X\3X\3Y\5Y\u08f0\nY\3Y\3Y\5Y\u08f4\nY\5Y\u08f6"+ + "\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z\u08ff\nZ\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z"+ + "\u090b\nZ\5Z\u090d\nZ\3Z\3Z\3Z\3Z\3Z\5Z\u0914\nZ\3Z\3Z\3Z\3Z\3Z\5Z\u091b"+ + "\nZ\3Z\3Z\3Z\3Z\5Z\u0921\nZ\3Z\3Z\3Z\3Z\5Z\u0927\nZ\5Z\u0929\nZ\3[\3["+ + "\3[\7[\u092e\n[\f[\16[\u0931\13[\3\\\3\\\3\\\7\\\u0936\n\\\f\\\16\\\u0939"+ + "\13\\\3]\3]\3]\5]\u093e\n]\3]\3]\3^\3^\3^\5^\u0945\n^\3^\3^\3_\3_\5_\u094b"+ + "\n_\3_\3_\5_\u094f\n_\5_\u0951\n_\3`\3`\3`\7`\u0956\n`\f`\16`\u0959\13"+ + "`\3a\3a\3a\3a\7a\u095f\na\fa\16a\u0962\13a\3a\3a\3b\3b\5b\u0968\nb\3c"+ + "\3c\3c\3c\3c\3c\7c\u0970\nc\fc\16c\u0973\13c\3c\3c\5c\u0977\nc\3d\3d\5"+ + "d\u097b\nd\3e\3e\3f\3f\3f\7f\u0982\nf\ff\16f\u0985\13f\3g\3g\3g\3g\3g"+ + "\3g\3g\3g\3g\3g\5g\u0991\ng\5g\u0993\ng\3g\3g\3g\3g\3g\3g\7g\u099b\ng"+ + "\fg\16g\u099e\13g\3h\5h\u09a1\nh\3h\3h\3h\3h\3h\3h\5h\u09a9\nh\3h\3h\3"+ + "h\3h\3h\7h\u09b0\nh\fh\16h\u09b3\13h\3h\3h\3h\5h\u09b8\nh\3h\3h\3h\3h"+ + "\3h\3h\5h\u09c0\nh\3h\3h\3h\5h\u09c5\nh\3h\3h\3h\3h\3h\3h\3h\3h\7h\u09cf"+ + "\nh\fh\16h\u09d2\13h\3h\3h\5h\u09d6\nh\3h\5h\u09d9\nh\3h\3h\3h\3h\5h\u09df"+ + "\nh\3h\3h\5h\u09e3\nh\3h\3h\3h\5h\u09e8\nh\3h\3h\3h\5h\u09ed\nh\3h\3h"+ + "\3h\5h\u09f2\nh\3i\3i\3i\3i\5i\u09f8\ni\3i\3i\3i\3i\3i\3i\3i\3i\3i\3i"+ + "\3i\3i\3i\3i\3i\3i\3i\3i\3i\7i\u0a0d\ni\fi\16i\u0a10\13i\3j\3j\3j\3j\6"+ + "j\u0a16\nj\rj\16j\u0a17\3j\3j\5j\u0a1c\nj\3j\3j\3j\3j\3j\6j\u0a23\nj\r"+ + "j\16j\u0a24\3j\3j\5j\u0a29\nj\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3"+ + "j\7j\u0a39\nj\fj\16j\u0a3c\13j\5j\u0a3e\nj\3j\3j\3j\3j\3j\3j\5j\u0a46"+ + "\nj\3j\3j\3j\3j\3j\3j\3j\5j\u0a4f\nj\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j"+ + "\3j\3j\3j\3j\3j\3j\3j\3j\6j\u0a64\nj\rj\16j\u0a65\3j\3j\3j\3j\3j\3j\3"+ + "j\3j\3j\5j\u0a71\nj\3j\3j\3j\7j\u0a76\nj\fj\16j\u0a79\13j\5j\u0a7b\nj"+ + "\3j\3j\3j\3j\3j\3j\3j\5j\u0a84\nj\3j\3j\5j\u0a88\nj\3j\3j\5j\u0a8c\nj"+ + "\3j\3j\3j\3j\3j\3j\3j\3j\6j\u0a96\nj\rj\16j\u0a97\3j\3j\3j\3j\3j\3j\3"+ + "j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\5j\u0ab1\nj\3j\3j\3"+ + "j\3j\3j\5j\u0ab8\nj\3j\5j\u0abb\nj\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3"+ + "j\3j\5j\u0aca\nj\3j\3j\5j\u0ace\nj\3j\3j\3j\3j\3j\3j\3j\3j\7j\u0ad8\n"+ + "j\fj\16j\u0adb\13j\3k\3k\5k\u0adf\nk\3k\3k\3k\3k\3k\5k\u0ae6\nk\3l\3l"+ + "\3l\3l\3l\3l\3l\3l\6l\u0af0\nl\rl\16l\u0af1\5l\u0af4\nl\3m\3m\3n\3n\3"+ + "o\3o\3p\3p\3q\3q\3q\5q\u0b01\nq\3r\3r\5r\u0b05\nr\3s\3s\3s\6s\u0b0a\n"+ + "s\rs\16s\u0b0b\3t\3t\3t\5t\u0b11\nt\3u\3u\3u\3u\3u\3v\5v\u0b19\nv\3v\3"+ + "v\3w\3w\3w\5w\u0b20\nw\3x\3x\3x\3x\3x\3x\3x\3x\3x\3x\3x\3x\3x\3x\3x\5"+ + "x\u0b31\nx\3x\3x\5x\u0b35\nx\3x\3x\3x\3x\5x\u0b3b\nx\3x\3x\3x\3x\5x\u0b41"+ + "\nx\3x\3x\3x\3x\3x\7x\u0b48\nx\fx\16x\u0b4b\13x\3x\5x\u0b4e\nx\5x\u0b50"+ + "\nx\3y\3y\3y\7y\u0b55\ny\fy\16y\u0b58\13y\3z\3z\3z\3z\5z\u0b5e\nz\3z\5"+ + "z\u0b61\nz\3z\5z\u0b64\nz\3{\3{\3{\7{\u0b69\n{\f{\16{\u0b6c\13{\3|\3|"+ + "\3|\3|\5|\u0b72\n|\3|\5|\u0b75\n|\3}\3}\3}\7}\u0b7a\n}\f}\16}\u0b7d\13"+ + "}\3~\3~\5~\u0b81\n~\3~\3~\3~\5~\u0b86\n~\3~\5~\u0b89\n~\3\177\3\177\3"+ + "\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0080\7\u0080\u0b94\n\u0080"+ + "\f\u0080\16\u0080\u0b97\13\u0080\3\u0081\3\u0081\3\u0081\3\u0081\3\u0082"+ + "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+ + "\3\u0082\7\u0082\u0ba8\n\u0082\f\u0082\16\u0082\u0bab\13\u0082\3\u0082"+ + "\3\u0082\3\u0082\3\u0082\3\u0082\7\u0082\u0bb2\n\u0082\f\u0082\16\u0082"+ + "\u0bb5\13\u0082\5\u0082\u0bb7\n\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+ + "\3\u0082\7\u0082\u0bbe\n\u0082\f\u0082\16\u0082\u0bc1\13\u0082\5\u0082"+ + "\u0bc3\n\u0082\5\u0082\u0bc5\n\u0082\3\u0082\5\u0082\u0bc8\n\u0082\3\u0082"+ + "\5\u0082\u0bcb\n\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083"+ + "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083"+ + "\3\u0083\5\u0083\u0bdd\n\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084"+ + "\3\u0084\3\u0084\5\u0084\u0be6\n\u0084\3\u0085\3\u0085\3\u0085\7\u0085"+ + "\u0beb\n\u0085\f\u0085\16\u0085\u0bee\13\u0085\3\u0086\3\u0086\3\u0086"+ + "\3\u0086\5\u0086\u0bf4\n\u0086\3\u0087\3\u0087\3\u0087\7\u0087\u0bf9\n"+ + "\u0087\f\u0087\16\u0087\u0bfc\13\u0087\3\u0088\3\u0088\3\u0088\3\u0089"+ + "\3\u0089\6\u0089\u0c03\n\u0089\r\u0089\16\u0089\u0c04\3\u0089\5\u0089"+ + "\u0c08\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u0c0d\n\u008a\3\u008b\3"+ + "\u008b\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0c15\n\u008b\3\u008c\3"+ + "\u008c\3\u008d\3\u008d\5\u008d\u0c1b\n\u008d\3\u008d\3\u008d\3\u008d\5"+ + "\u008d\u0c20\n\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u0c25\n\u008d\3\u008d"+ + "\3\u008d\5\u008d\u0c29\n\u008d\3\u008d\3\u008d\5\u008d\u0c2d\n\u008d\3"+ + "\u008d\3\u008d\5\u008d\u0c31\n\u008d\3\u008d\3\u008d\5\u008d\u0c35\n\u008d"+ + "\3\u008d\3\u008d\5\u008d\u0c39\n\u008d\3\u008d\3\u008d\5\u008d\u0c3d\n"+ + "\u008d\3\u008d\3\u008d\5\u008d\u0c41\n\u008d\3\u008d\5\u008d\u0c44\n\u008d"+ + "\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\5\u008e\u0c4d"+ + "\n\u008e\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\13\u0391"+ + "\u03d2\u03da\u03eb\u03f9\u0402\u040b\u0414\u041b\6V\u00cc\u00d0\u00d2"+ + "\u0092\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<"+ + ">@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a"+ + "\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2"+ + "\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba"+ + "\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2"+ + "\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea"+ + "\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102"+ + "\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a"+ + "\u011c\u011e\u0120\2\65\4\2??\u00b4\u00b4\4\2\36\36\u00c3\u00c3\4\2>>"+ + "\u0095\u0095\4\2ccpp\3\2)*\4\2\u00e5\u00e5\u0105\u0105\4\2\r\r!!\7\2&"+ + "&\62\62UUbb\u008c\u008c\3\2CD\4\2UUbb\4\2\u0099\u0099\u0125\u0125\5\2"+ + "\n\nKK\u00e4\u00e4\4\2\n\n\u0086\u0086\4\2\u0088\u0088\u0125\u0125\5\2"+ + "==\u0094\u0094\u00ce\u00ce\6\2PPww\u00d6\u00d6\u00fb\u00fb\5\2PP\u00d6"+ + "\u00d6\u00fb\u00fb\4\2\25\25CC\4\2]]~~\4\2\65\65\u00ca\u00ca\4\2\f\fH"+ + "H\4\2\u0129\u0129\u012b\u012b\5\2\f\f\21\21\u00da\u00da\5\2XX\u00f4\u00f4"+ + "\u00fd\u00fd\4\2\u0115\u0116\u011a\u011a\4\2JJ\u0117\u0119\4\2\u0115\u0116"+ + "\u011d\u011d\4\2\67\679:\4\2 \u00f6\u00f6\4\2nn\u00c2\u00c2\3\2\u00e2"+ + "\u00e3\4\2cc\u0122\u0122\4\2__\u0122\u0122\5\2\31\31\u0081\u0081\u00ef"+ + "\u00ef\3\2\u010d\u0114\4\2JJ\u0115\u011e\6\2\17\17pp\u0098\u0098\u00a1"+ + "\u00a1\4\2XX\u00f4\u00f4\3\2\u0115\u0116\5\2\u0125\u0125\u0129\u0129\u012b"+ + "\u012b\4\2\u0092\u0092\u010b\u010b\6\2;;ll\u0091\u0091\u00cd\u00cd\5\2"+ + "ll\u0091\u0091\u00cd\u00cd\4\2II\u00aa\u00aa\4\2\u00a2\u00a2\u00db\u00db"+ + "\4\2^^\u00b1\u00b1\3\2\u012a\u012b\4\2KK\u00d5\u00d5\63\2\n\13\r\16\20"+ + "\20\22\23\25\26\30\30\32\36!!#&((*\60\62\62\65\66;GIKOOQWZZ\\^abegjjl"+ + "oqrtvxx{{}~\u0080\u0080\u0083\u0095\u0097\u0097\u009a\u009b\u009f\u00a0"+ + "\u00a3\u00a3\u00a5\u00a6\u00a8\u00b1\u00b3\u00bb\u00bd\u00c4\u00c6\u00ce"+ + "\u00d0\u00d3\u00d5\u00d9\u00db\u00e4\u00e6\u00ea\u00ee\u00ee\u00f0\u00fa"+ + "\u00fe\u0101\u0104\u0106\u0109\u0109\u010b\u010c\22\2\20\20\64\64PPdd"+ + "ssww||\177\177\u0082\u0082\u0096\u0096\u009d\u009d\u00c5\u00c5\u00d0\u00d0"+ + "\u00d6\u00d6\u00fb\u00fb\u0103\u0103\23\2\n\17\21\63\65OQcertvx{}~\u0080"+ + "\u0081\u0083\u0095\u0097\u009c\u009e\u00c4\u00c6\u00cf\u00d1\u00d5\u00d7"+ + "\u00fa\u00fc\u0102\u0104\u010c\2\u0e40\2\u0122\3\2\2\2\4\u012b\3\2\2\2"+ + "\6\u012e\3\2\2\2\b\u0131\3\2\2\2\n\u0134\3\2\2\2\f\u0137\3\2\2\2\16\u013a"+ + "\3\2\2\2\20\u041e\3\2\2\2\22\u0420\3\2\2\2\24\u0422\3\2\2\2\26\u04cc\3"+ + "\2\2\2\30\u04ce\3\2\2\2\32\u04df\3\2\2\2\34\u04e5\3\2\2\2\36\u04f1\3\2"+ + "\2\2 \u04fe\3\2\2\2\"\u0501\3\2\2\2$\u0505\3\2\2\2&\u0547\3\2\2\2(\u0549"+ + "\3\2\2\2*\u054d\3\2\2\2,\u0559\3\2\2\2.\u055e\3\2\2\2\60\u0565\3\2\2\2"+ + "\62\u0567\3\2\2\2\64\u056f\3\2\2\2\66\u0578\3\2\2\28\u0583\3\2\2\2:\u0595"+ + "\3\2\2\2<\u0598\3\2\2\2>\u05a3\3\2\2\2@\u05b3\3\2\2\2B\u05b9\3\2\2\2D"+ + "\u05bb\3\2\2\2F\u05c6\3\2\2\2H\u05d7\3\2\2\2J\u05de\3\2\2\2L\u05e0\3\2"+ + "\2\2N\u05e6\3\2\2\2P\u061c\3\2\2\2R\u0628\3\2\2\2T\u0658\3\2\2\2V\u065b"+ + "\3\2\2\2X\u0681\3\2\2\2Z\u0683\3\2\2\2\\\u068b\3\2\2\2^\u06ac\3\2\2\2"+ + "`\u06da\3\2\2\2b\u06ef\3\2\2\2d\u070f\3\2\2\2f\u071b\3\2\2\2h\u071e\3"+ + "\2\2\2j\u0727\3\2\2\2l\u0738\3\2\2\2n\u074c\3\2\2\2p\u074e\3\2\2\2r\u0756"+ + "\3\2\2\2t\u075a\3\2\2\2v\u075d\3\2\2\2x\u0760\3\2\2\2z\u077a\3\2\2\2|"+ + "\u077c\3\2\2\2~\u07b5\3\2\2\2\u0080\u07b9\3\2\2\2\u0082\u07d4\3\2\2\2"+ + "\u0084\u07d8\3\2\2\2\u0086\u07e7\3\2\2\2\u0088\u07e9\3\2\2\2\u008a\u0807"+ + "\3\2\2\2\u008c\u0809\3\2\2\2\u008e\u0810\3\2\2\2\u0090\u0830\3\2\2\2\u0092"+ + "\u0833\3\2\2\2\u0094\u084d\3\2\2\2\u0096\u0867\3\2\2\2\u0098\u086d\3\2"+ + "\2\2\u009a\u086f\3\2\2\2\u009c\u088e\3\2\2\2\u009e\u0890\3\2\2\2\u00a0"+ + "\u0894\3\2\2\2\u00a2\u089c\3\2\2\2\u00a4\u08a7\3\2\2\2\u00a6\u08ab\3\2"+ + "\2\2\u00a8\u08b6\3\2\2\2\u00aa\u08d2\3\2\2\2\u00ac\u08d4\3\2\2\2\u00ae"+ + "\u08df\3\2\2\2\u00b0\u08f5\3\2\2\2\u00b2\u0928\3\2\2\2\u00b4\u092a\3\2"+ + "\2\2\u00b6\u0932\3\2\2\2\u00b8\u093d\3\2\2\2\u00ba\u0944\3\2\2\2\u00bc"+ + "\u0948\3\2\2\2\u00be\u0952\3\2\2\2\u00c0\u095a\3\2\2\2\u00c2\u0967\3\2"+ + "\2\2\u00c4\u0976\3\2\2\2\u00c6\u097a\3\2\2\2\u00c8\u097c\3\2\2\2\u00ca"+ + "\u097e\3\2\2\2\u00cc\u0992\3\2\2\2\u00ce\u09f1\3\2\2\2\u00d0\u09f7\3\2"+ + "\2\2\u00d2\u0acd\3\2\2\2\u00d4\u0ae5\3\2\2\2\u00d6\u0af3\3\2\2\2\u00d8"+ + "\u0af5\3\2\2\2\u00da\u0af7\3\2\2\2\u00dc\u0af9\3\2\2\2\u00de\u0afb\3\2"+ + "\2\2\u00e0\u0afd\3\2\2\2\u00e2\u0b02\3\2\2\2\u00e4\u0b09\3\2\2\2\u00e6"+ + "\u0b0d\3\2\2\2\u00e8\u0b12\3\2\2\2\u00ea\u0b18\3\2\2\2\u00ec\u0b1f\3\2"+ + "\2\2\u00ee\u0b4f\3\2\2\2\u00f0\u0b51\3\2\2\2\u00f2\u0b59\3\2\2\2\u00f4"+ + "\u0b65\3\2\2\2\u00f6\u0b6d\3\2\2\2\u00f8\u0b76\3\2\2\2\u00fa\u0b7e\3\2"+ + "\2\2\u00fc\u0b8a\3\2\2\2\u00fe\u0b8f\3\2\2\2\u0100\u0b98\3\2\2\2\u0102"+ + "\u0bca\3\2\2\2\u0104\u0bdc\3\2\2\2\u0106\u0be5\3\2\2\2\u0108\u0be7\3\2"+ + "\2\2\u010a\u0bf3\3\2\2\2\u010c\u0bf5\3\2\2\2\u010e\u0bfd\3\2\2\2\u0110"+ + "\u0c07\3\2\2\2\u0112\u0c0c\3\2\2\2\u0114\u0c14\3\2\2\2\u0116\u0c16\3\2"+ + "\2\2\u0118\u0c43\3\2\2\2\u011a\u0c4c\3\2\2\2\u011c\u0c4e\3\2\2\2\u011e"+ + "\u0c50\3\2\2\2\u0120\u0c52\3\2\2\2\u0122\u0126\5\20\t\2\u0123\u0125\7"+ + "\u0124\2\2\u0124\u0123\3\2\2\2\u0125\u0128\3\2\2\2\u0126\u0124\3\2\2\2"+ + "\u0126\u0127\3\2\2\2\u0127\u0129\3\2\2\2\u0128\u0126\3\2\2\2\u0129\u012a"+ + "\7\2\2\3\u012a\3\3\2\2\2\u012b\u012c\5\u00bc_\2\u012c\u012d\7\2\2\3\u012d"+ + "\5\3\2\2\2\u012e\u012f\5\u00b8]\2\u012f\u0130\7\2\2\3\u0130\7\3\2\2\2"+ + "\u0131\u0132\5\u00b6\\\2\u0132\u0133\7\2\2\3\u0133\t\3\2\2\2\u0134\u0135"+ + "\5\u00ba^\2\u0135\u0136\7\2\2\3\u0136\13\3\2\2\2\u0137\u0138\5\u00eex"+ + "\2\u0138\u0139\7\2\2\3\u0139\r\3\2\2\2\u013a\u013b\5\u00f4{\2\u013b\u013c"+ + "\7\2\2\3\u013c\17\3\2\2\2\u013d\u041f\5$\23\2\u013e\u0140\5\64\33\2\u013f"+ + "\u013e\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u0141\3\2\2\2\u0141\u041f\5P"+ + ")\2\u0142\u0144\7\u0101\2\2\u0143\u0145\7\u0094\2\2\u0144\u0143\3\2\2"+ + "\2\u0144\u0145\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u041f\5\u00b6\\\2\u0147"+ + "\u0148\7\63\2\2\u0148\u014c\5.\30\2\u0149\u014a\7m\2\2\u014a\u014b\7\u0098"+ + "\2\2\u014b\u014d\7R\2\2\u014c\u0149\3\2\2\2\u014c\u014d\3\2\2\2\u014d"+ + "\u014e\3\2\2\2\u014e\u0156\5\u00b6\\\2\u014f\u0155\5\"\22\2\u0150\u0155"+ + "\5 \21\2\u0151\u0152\7\u010a\2\2\u0152\u0153\t\2\2\2\u0153\u0155\5<\37"+ + "\2\u0154\u014f\3\2\2\2\u0154\u0150\3\2\2\2\u0154\u0151\3\2\2\2\u0155\u0158"+ + "\3\2\2\2\u0156\u0154\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u041f\3\2\2\2\u0158"+ + "\u0156\3\2\2\2\u0159\u015a\7\r\2\2\u015a\u015b\5.\30\2\u015b\u015c\5\u00b6"+ + "\\\2\u015c\u015d\7\u00d5\2\2\u015d\u015e\t\2\2\2\u015e\u015f\5<\37\2\u015f"+ + "\u041f\3\2\2\2\u0160\u0161\7\r\2\2\u0161\u0162\5.\30\2\u0162\u0163\5\u00b6"+ + "\\\2\u0163\u0164\7\u00d5\2\2\u0164\u0165\5 \21\2\u0165\u041f\3\2\2\2\u0166"+ + "\u0167\7K\2\2\u0167\u016a\5.\30\2\u0168\u0169\7m\2\2\u0169\u016b\7R\2"+ + "\2\u016a\u0168\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016c\3\2\2\2\u016c\u016e"+ + "\5\u00b6\\\2\u016d\u016f\t\3\2\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2"+ + "\2\u016f\u041f\3\2\2\2\u0170\u0171\7\u00d8\2\2\u0171\u0174\t\4\2\2\u0172"+ + "\u0173\t\5\2\2\u0173\u0175\5\u00b6\\\2\u0174\u0172\3\2\2\2\u0174\u0175"+ + "\3\2\2\2\u0175\u017a\3\2\2\2\u0176\u0178\7\u0083\2\2\u0177\u0176\3\2\2"+ + "\2\u0177\u0178\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u017b\7\u0125\2\2\u017a"+ + "\u0177\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u041f\3\2\2\2\u017c\u0181\5\30"+ + "\r\2\u017d\u017e\7\3\2\2\u017e\u017f\5\u00f4{\2\u017f\u0180\7\4\2\2\u0180"+ + "\u0182\3\2\2\2\u0181\u017d\3\2\2\2\u0181\u0182\3\2\2\2\u0182\u0184\3\2"+ + "\2\2\u0183\u0185\58\35\2\u0184\u0183\3\2\2\2\u0184\u0185\3\2\2\2\u0185"+ + "\u0186\3\2\2\2\u0186\u018b\5:\36\2\u0187\u0189\7\24\2\2\u0188\u0187\3"+ + "\2\2\2\u0188\u0189\3\2\2\2\u0189\u018a\3\2\2\2\u018a\u018c\5$\23\2\u018b"+ + "\u0188\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u041f\3\2\2\2\u018d\u018e\7\63"+ + "\2\2\u018e\u0192\7\u00e5\2\2\u018f\u0190\7m\2\2\u0190\u0191\7\u0098\2"+ + "\2\u0191\u0193\7R\2\2\u0192\u018f\3\2\2\2\u0192\u0193\3\2\2\2\u0193\u0194"+ + "\3\2\2\2\u0194\u0195\5\u00b8]\2\u0195\u0196\7\u0083\2\2\u0196\u019f\5"+ + "\u00b8]\2\u0197\u019e\58\35\2\u0198\u019e\5\u00b2Z\2\u0199\u019e\5H%\2"+ + "\u019a\u019e\5 \21\2\u019b\u019c\7\u00e8\2\2\u019c\u019e\5<\37\2\u019d"+ + "\u0197\3\2\2\2\u019d\u0198\3\2\2\2\u019d\u0199\3\2\2\2\u019d\u019a\3\2"+ + "\2\2\u019d\u019b\3\2\2\2\u019e\u01a1\3\2\2\2\u019f\u019d\3\2\2\2\u019f"+ + "\u01a0\3\2\2\2\u01a0\u041f\3\2\2\2\u01a1\u019f\3\2\2\2\u01a2\u01a7\5\32"+ + "\16\2\u01a3\u01a4\7\3\2\2\u01a4\u01a5\5\u00f4{\2\u01a5\u01a6\7\4\2\2\u01a6"+ + "\u01a8\3\2\2\2\u01a7\u01a3\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01aa\3\2"+ + "\2\2\u01a9\u01ab\58\35\2\u01aa\u01a9\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab"+ + "\u01ac\3\2\2\2\u01ac\u01b1\5:\36\2\u01ad\u01af\7\24\2\2\u01ae\u01ad\3"+ + "\2\2\2\u01ae\u01af\3\2\2\2\u01af\u01b0\3\2\2\2\u01b0\u01b2\5$\23\2\u01b1"+ + "\u01ae\3\2\2\2\u01b1\u01b2\3\2\2\2\u01b2\u041f\3\2\2\2\u01b3\u01b4\7\16"+ + "\2\2\u01b4\u01b5\7\u00e5\2\2\u01b5\u01b7\5\u00b6\\\2\u01b6\u01b8\5*\26"+ + "\2\u01b7\u01b6\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8\u01b9\3\2\2\2\u01b9\u01ba"+ + "\7/\2\2\u01ba\u01c2\7\u00de\2\2\u01bb\u01c3\5\u0112\u008a\2\u01bc\u01bd"+ + "\7_\2\2\u01bd\u01be\7*\2\2\u01be\u01c3\5\u00a0Q\2\u01bf\u01c0\7_\2\2\u01c0"+ + "\u01c1\7\f\2\2\u01c1\u01c3\7*\2\2\u01c2\u01bb\3\2\2\2\u01c2\u01bc\3\2"+ + "\2\2\u01c2\u01bf\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u041f\3\2\2\2\u01c4"+ + "\u01c5\7\16\2\2\u01c5\u01c8\7\u00e6\2\2\u01c6\u01c7\t\5\2\2\u01c7\u01c9"+ + "\5\u00b6\\\2\u01c8\u01c6\3\2\2\2\u01c8\u01c9\3\2\2\2\u01c9\u01ca\3\2\2"+ + "\2\u01ca\u01cb\7/\2\2\u01cb\u01cd\7\u00de\2\2\u01cc\u01ce\5\u0112\u008a"+ + "\2\u01cd\u01cc\3\2\2\2\u01cd\u01ce\3\2\2\2\u01ce\u041f\3\2\2\2\u01cf\u01d0"+ + "\7\r\2\2\u01d0\u01d1\7\u00e5\2\2\u01d1\u01d2\5\u00b6\\\2\u01d2\u01d3\7"+ + "\n\2\2\u01d3\u01d4\t\6\2\2\u01d4\u01d5\5\u00f0y\2\u01d5\u041f\3\2\2\2"+ + "\u01d6\u01d7\7\r\2\2\u01d7\u01d8\7\u00e5\2\2\u01d8\u01d9\5\u00b6\\\2\u01d9"+ + "\u01da\7\n\2\2\u01da\u01db\t\6\2\2\u01db\u01dc\7\3\2\2\u01dc\u01dd\5\u00f0"+ + "y\2\u01dd\u01de\7\4\2\2\u01de\u041f\3\2\2\2\u01df\u01e0\7\r\2\2\u01e0"+ + "\u01e1\7\u00e5\2\2\u01e1\u01e2\5\u00b6\\\2\u01e2\u01e3\7\u00be\2\2\u01e3"+ + "\u01e4\7)\2\2\u01e4\u01e5\5\u00b6\\\2\u01e5\u01e6\7\u00ed\2\2\u01e6\u01e7"+ + "\5\u010e\u0088\2\u01e7\u041f\3\2\2\2\u01e8\u01e9\7\r\2\2\u01e9\u01ea\7"+ + "\u00e5\2\2\u01ea\u01eb\5\u00b6\\\2\u01eb\u01ec\7K\2\2\u01ec\u01ed\t\6"+ + "\2\2\u01ed\u01ee\7\3\2\2\u01ee\u01ef\5\u00b4[\2\u01ef\u01f0\7\4\2\2\u01f0"+ + "\u041f\3\2\2\2\u01f1\u01f2\7\r\2\2\u01f2\u01f3\7\u00e5\2\2\u01f3\u01f4"+ + "\5\u00b6\\\2\u01f4\u01f5\7K\2\2\u01f5\u01f6\t\6\2\2\u01f6\u01f7\5\u00b4"+ + "[\2\u01f7\u041f\3\2\2\2\u01f8\u01f9\7\r\2\2\u01f9\u01fa\t\7\2\2\u01fa"+ + "\u01fb\5\u00b6\\\2\u01fb\u01fc\7\u00be\2\2\u01fc\u01fd\7\u00ed\2\2\u01fd"+ + "\u01fe\5\u00b6\\\2\u01fe\u041f\3\2\2\2\u01ff\u0200\7\r\2\2\u0200\u0201"+ + "\t\7\2\2\u0201\u0202\5\u00b6\\\2\u0202\u0203\7\u00d5\2\2\u0203\u0204\7"+ + "\u00e8\2\2\u0204\u0205\5<\37\2\u0205\u041f\3\2\2\2\u0206\u0207\7\r\2\2"+ + "\u0207\u0208\t\7\2\2\u0208\u0209\5\u00b6\\\2\u0209\u020a\7\u00ff\2\2\u020a"+ + "\u020d\7\u00e8\2\2\u020b\u020c\7m\2\2\u020c\u020e\7R\2\2\u020d\u020b\3"+ + "\2\2\2\u020d\u020e\3\2\2\2\u020e\u020f\3\2\2\2\u020f\u0210\5<\37\2\u0210"+ + "\u041f\3\2\2\2\u0211\u0212\7\r\2\2\u0212\u0213\7\u00e5\2\2\u0213\u0214"+ + "\5\u00b6\\\2\u0214\u0216\t\b\2\2\u0215\u0217\7)\2\2\u0216\u0215\3\2\2"+ + "\2\u0216\u0217\3\2\2\2\u0217\u0218\3\2\2\2\u0218\u021a\5\u00b6\\\2\u0219"+ + "\u021b\5\u011a\u008e\2\u021a\u0219\3\2\2\2\u021a\u021b\3\2\2\2\u021b\u041f"+ + "\3\2\2\2\u021c\u021d\7\r\2\2\u021d\u021e\7\u00e5\2\2\u021e\u0220\5\u00b6"+ + "\\\2\u021f\u0221\5*\26\2\u0220\u021f\3\2\2\2\u0220\u0221\3\2\2\2\u0221"+ + "\u0222\3\2\2\2\u0222\u0224\7!\2\2\u0223\u0225\7)\2\2\u0224\u0223\3\2\2"+ + "\2\u0224\u0225\3\2\2\2\u0225\u0226\3\2\2\2\u0226\u0227\5\u00b6\\\2\u0227"+ + "\u0229\5\u00f6|\2\u0228\u022a\5\u00ecw\2\u0229\u0228\3\2\2\2\u0229\u022a"+ + "\3\2\2\2\u022a\u041f\3\2\2\2\u022b\u022c\7\r\2\2\u022c\u022d\7\u00e5\2"+ + "\2\u022d\u022f\5\u00b6\\\2\u022e\u0230\5*\26\2\u022f\u022e\3\2\2\2\u022f"+ + "\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232\7\u00c0\2\2\u0232\u0233"+ + "\7*\2\2\u0233\u0234\7\3\2\2\u0234\u0235\5\u00f0y\2\u0235\u0236\7\4\2\2"+ + "\u0236\u041f\3\2\2\2\u0237\u0238\7\r\2\2\u0238\u0239\7\u00e5\2\2\u0239"+ + "\u023b\5\u00b6\\\2\u023a\u023c\5*\26\2\u023b\u023a\3\2\2\2\u023b\u023c"+ + "\3\2\2\2\u023c\u023d\3\2\2\2\u023d\u023e\7\u00d5\2\2\u023e\u023f\7\u00d2"+ + "\2\2\u023f\u0243\7\u0125\2\2\u0240\u0241\7\u010a\2\2\u0241\u0242\7\u00d3"+ + "\2\2\u0242\u0244\5<\37\2\u0243\u0240\3\2\2\2\u0243\u0244\3\2\2\2\u0244"+ + "\u041f\3\2\2\2\u0245\u0246\7\r\2\2\u0246\u0247\7\u00e5\2\2\u0247\u0249"+ + "\5\u00b6\\\2\u0248\u024a\5*\26\2\u0249\u0248\3\2\2\2\u0249\u024a\3\2\2"+ + "\2\u024a\u024b\3\2\2\2\u024b\u024c\7\u00d5\2\2\u024c\u024d\7\u00d3\2\2"+ + "\u024d\u024e\5<\37\2\u024e\u041f\3\2\2\2\u024f\u0250\7\r\2\2\u0250\u0251"+ + "\t\7\2\2\u0251\u0252\5\u00b6\\\2\u0252\u0256\7\n\2\2\u0253\u0254\7m\2"+ + "\2\u0254\u0255\7\u0098\2\2\u0255\u0257\7R\2\2\u0256\u0253\3\2\2\2\u0256"+ + "\u0257\3\2\2\2\u0257\u0259\3\2\2\2\u0258\u025a\5(\25\2\u0259\u0258\3\2"+ + "\2\2\u025a\u025b\3\2\2\2\u025b\u0259\3\2\2\2\u025b\u025c\3\2\2\2\u025c"+ + "\u041f\3\2\2\2\u025d\u025e\7\r\2\2\u025e\u025f\7\u00e5\2\2\u025f\u0260"+ + "\5\u00b6\\\2\u0260\u0261\5*\26\2\u0261\u0262\7\u00be\2\2\u0262\u0263\7"+ + "\u00ed\2\2\u0263\u0264\5*\26\2\u0264\u041f\3\2\2\2\u0265\u0266\7\r\2\2"+ + "\u0266\u0267\t\7\2\2\u0267\u0268\5\u00b6\\\2\u0268\u026b\7K\2\2\u0269"+ + "\u026a\7m\2\2\u026a\u026c\7R\2\2\u026b\u0269\3\2\2\2\u026b\u026c\3\2\2"+ + "\2\u026c\u026d\3\2\2\2\u026d\u0272\5*\26\2\u026e\u026f\7\u0122\2\2\u026f"+ + "\u0271\5*\26\2\u0270\u026e\3\2\2\2\u0271\u0274\3\2\2\2\u0272\u0270\3\2"+ + "\2\2\u0272\u0273\3\2\2\2\u0273\u0276\3\2\2\2\u0274\u0272\3\2\2\2\u0275"+ + "\u0277\7\u00b5\2\2\u0276\u0275\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u041f"+ + "\3\2\2\2\u0278\u0279\7\r\2\2\u0279\u027a\7\u00e5\2\2\u027a\u027c\5\u00b6"+ + "\\\2\u027b\u027d\5*\26\2\u027c\u027b\3\2\2\2\u027c\u027d\3\2\2\2\u027d"+ + "\u027e\3\2\2\2\u027e\u027f\7\u00d5\2\2\u027f\u0280\5 \21\2\u0280\u041f"+ + "\3\2\2\2\u0281\u0282\7\r\2\2\u0282\u0283\7\u00e5\2\2\u0283\u0284\5\u00b6"+ + "\\\2\u0284\u0285\7\u00ba\2\2\u0285\u0286\7\u00ac\2\2\u0286\u041f\3\2\2"+ + "\2\u0287\u0288\7K\2\2\u0288\u028b\7\u00e5\2\2\u0289\u028a\7m\2\2\u028a"+ + "\u028c\7R\2\2\u028b\u0289\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u028d\3\2"+ + "\2\2\u028d\u028f\5\u00b6\\\2\u028e\u0290\7\u00b5\2\2\u028f\u028e\3\2\2"+ + "\2\u028f\u0290\3\2\2\2\u0290\u041f\3\2\2\2\u0291\u0292\7K\2\2\u0292\u0295"+ + "\7\u0105\2\2\u0293\u0294\7m\2\2\u0294\u0296\7R\2\2\u0295\u0293\3\2\2\2"+ + "\u0295\u0296\3\2\2\2\u0296\u0297\3\2\2\2\u0297\u041f\5\u00b6\\\2\u0298"+ + "\u029b\7\63\2\2\u0299\u029a\7\u00a1\2\2\u029a\u029c\7\u00c0\2\2\u029b"+ + "\u0299\3\2\2\2\u029b\u029c\3\2\2\2\u029c\u02a1\3\2\2\2\u029d\u029f\7g"+ + "\2\2\u029e\u029d\3\2\2\2\u029e\u029f\3\2\2\2\u029f\u02a0\3\2\2\2\u02a0"+ + "\u02a2\7\u00e9\2\2\u02a1\u029e\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2\u02a3"+ + "\3\2\2\2\u02a3\u02a7\7\u0105\2\2\u02a4\u02a5\7m\2\2\u02a5\u02a6\7\u0098"+ + "\2\2\u02a6\u02a8\7R\2\2\u02a7\u02a4\3\2\2\2\u02a7\u02a8\3\2\2\2\u02a8"+ + "\u02a9\3\2\2\2\u02a9\u02ab\5\u00b6\\\2\u02aa\u02ac\5\u00a6T\2\u02ab\u02aa"+ + "\3\2\2\2\u02ab\u02ac\3\2\2\2\u02ac\u02b5\3\2\2\2\u02ad\u02b4\5\"\22\2"+ + "\u02ae\u02af\7\u00ab\2\2\u02af\u02b0\7\u009d\2\2\u02b0\u02b4\5\u009eP"+ + "\2\u02b1\u02b2\7\u00e8\2\2\u02b2\u02b4\5<\37\2\u02b3\u02ad\3\2\2\2\u02b3"+ + "\u02ae\3\2\2\2\u02b3\u02b1\3\2\2\2\u02b4\u02b7\3\2\2\2\u02b5\u02b3\3\2"+ + "\2\2\u02b5\u02b6\3\2\2\2\u02b6\u02b8\3\2\2\2\u02b7\u02b5\3\2\2\2\u02b8"+ + "\u02b9\7\24\2\2\u02b9\u02ba\5$\23\2\u02ba\u041f\3\2\2\2\u02bb\u02be\7"+ + "\63\2\2\u02bc\u02bd\7\u00a1\2\2\u02bd\u02bf\7\u00c0\2\2\u02be\u02bc\3"+ + "\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02c2\7g\2\2\u02c1"+ + "\u02c0\3\2\2\2\u02c1\u02c2\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c4\7\u00e9"+ + "\2\2\u02c4\u02c5\7\u0105\2\2\u02c5\u02ca\5\u00b8]\2\u02c6\u02c7\7\3\2"+ + "\2\u02c7\u02c8\5\u00f4{\2\u02c8\u02c9\7\4\2\2\u02c9\u02cb\3\2\2\2\u02ca"+ + "\u02c6\3\2\2\2\u02ca\u02cb\3\2\2\2\u02cb\u02cc\3\2\2\2\u02cc\u02cf\58"+ + "\35\2\u02cd\u02ce\7\u00a0\2\2\u02ce\u02d0\5<\37\2\u02cf\u02cd\3\2\2\2"+ + "\u02cf\u02d0\3\2\2\2\u02d0\u041f\3\2\2\2\u02d1\u02d2\7\r\2\2\u02d2\u02d3"+ + "\7\u0105\2\2\u02d3\u02d5\5\u00b6\\\2\u02d4\u02d6\7\24\2\2\u02d5\u02d4"+ + "\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6\u02d7\3\2\2\2\u02d7\u02d8\5$\23\2\u02d8"+ + "\u041f\3\2\2\2\u02d9\u02dc\7\63\2\2\u02da\u02db\7\u00a1\2\2\u02db\u02dd"+ + "\7\u00c0\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd\u02df\3\2\2"+ + "\2\u02de\u02e0\7\u00e9\2\2\u02df\u02de\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0"+ + "\u02e1\3\2\2\2\u02e1\u02e5\7e\2\2\u02e2\u02e3\7m\2\2\u02e3\u02e4\7\u0098"+ + "\2\2\u02e4\u02e6\7R\2\2\u02e5\u02e2\3\2\2\2\u02e5\u02e6\3\2\2\2\u02e6"+ + "\u02e7\3\2\2\2\u02e7\u02e8\5\u00b6\\\2\u02e8\u02e9\7\24\2\2\u02e9\u02f3"+ + "\7\u0125\2\2\u02ea\u02eb\7\u0103\2\2\u02eb\u02f0\5N(\2\u02ec\u02ed\7\u0122"+ + "\2\2\u02ed\u02ef\5N(\2\u02ee\u02ec\3\2\2\2\u02ef\u02f2\3\2\2\2\u02f0\u02ee"+ + "\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f3"+ + "\u02ea\3\2\2\2\u02f3\u02f4\3\2\2\2\u02f4\u041f\3\2\2\2\u02f5\u02f7\7K"+ + "\2\2\u02f6\u02f8\7\u00e9\2\2\u02f7\u02f6\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f8"+ + "\u02f9\3\2\2\2\u02f9\u02fc\7e\2\2\u02fa\u02fb\7m\2\2\u02fb\u02fd\7R\2"+ + "\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02fe\3\2\2\2\u02fe\u041f"+ + "\5\u00b6\\\2\u02ff\u0301\7S\2\2\u0300\u0302\t\t\2\2\u0301\u0300\3\2\2"+ + "\2\u0301\u0302\3\2\2\2\u0302\u0303\3\2\2\2\u0303\u041f\5\20\t\2\u0304"+ + "\u0305\7\u00d8\2\2\u0305\u0308\7\u00e6\2\2\u0306\u0307\t\5\2\2\u0307\u0309"+ + "\5\u00b6\\\2\u0308\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u030e\3\2\2"+ + "\2\u030a\u030c\7\u0083\2\2\u030b\u030a\3\2\2\2\u030b\u030c\3\2\2\2\u030c"+ + "\u030d\3\2\2\2\u030d\u030f\7\u0125\2\2\u030e\u030b\3\2\2\2\u030e\u030f"+ + "\3\2\2\2\u030f\u041f\3\2\2\2\u0310\u0311\7\u00d8\2\2\u0311\u0312\7\u00e5"+ + "\2\2\u0312\u0315\7U\2\2\u0313\u0314\t\5\2\2\u0314\u0316\5\u00b6\\\2\u0315"+ + "\u0313\3\2\2\2\u0315\u0316\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0318\7\u0083"+ + "\2\2\u0318\u031a\7\u0125\2\2\u0319\u031b\5*\26\2\u031a\u0319\3\2\2\2\u031a"+ + "\u031b\3\2\2\2\u031b\u041f\3\2\2\2\u031c\u031d\7\u00d8\2\2\u031d\u031e"+ + "\7\u00e8\2\2\u031e\u0323\5\u00b6\\\2\u031f\u0320\7\3\2\2\u0320\u0321\5"+ + "@!\2\u0321\u0322\7\4\2\2\u0322\u0324\3\2\2\2\u0323\u031f\3\2\2\2\u0323"+ + "\u0324\3\2\2\2\u0324\u041f\3\2\2\2\u0325\u0326\7\u00d8\2\2\u0326\u0327"+ + "\7*\2\2\u0327\u0328\t\5\2\2\u0328\u032b\5\u00b6\\\2\u0329\u032a\t\5\2"+ + "\2\u032a\u032c\5\u00b6\\\2\u032b\u0329\3\2\2\2\u032b\u032c\3\2\2\2\u032c"+ + "\u041f\3\2\2\2\u032d\u032e\7\u00d8\2\2\u032e\u0331\7\u0106\2\2\u032f\u0330"+ + "\t\5\2\2\u0330\u0332\5\u00b6\\\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2"+ + "\2\u0332\u0337\3\2\2\2\u0333\u0335\7\u0083\2\2\u0334\u0333\3\2\2\2\u0334"+ + "\u0335\3\2\2\2\u0335\u0336\3\2\2\2\u0336\u0338\7\u0125\2\2\u0337\u0334"+ + "\3\2\2\2\u0337\u0338\3\2\2\2\u0338\u041f\3\2\2\2\u0339\u033a\7\u00d8\2"+ + "\2\u033a\u033b\7\u00ac\2\2\u033b\u033d\5\u00b6\\\2\u033c\u033e\5*\26\2"+ + "\u033d\u033c\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u041f\3\2\2\2\u033f\u0341"+ + "\7\u00d8\2\2\u0340\u0342\5\u0112\u008a\2\u0341\u0340\3\2\2\2\u0341\u0342"+ + "\3\2\2\2\u0342\u0343\3\2\2\2\u0343\u034b\7f\2\2\u0344\u0346\7\u0083\2"+ + "\2\u0345\u0344\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0349\3\2\2\2\u0347\u034a"+ + "\5\u00b6\\\2\u0348\u034a\7\u0125\2\2\u0349\u0347\3\2\2\2\u0349\u0348\3"+ + "\2\2\2\u034a\u034c\3\2\2\2\u034b\u0345\3\2\2\2\u034b\u034c\3\2\2\2\u034c"+ + "\u041f\3\2\2\2\u034d\u034e\7\u00d8\2\2\u034e\u034f\7\63\2\2\u034f\u0350"+ + "\7\u00e5\2\2\u0350\u0353\5\u00b6\\\2\u0351\u0352\7\24\2\2\u0352\u0354"+ + "\7\u00d2\2\2\u0353\u0351\3\2\2\2\u0353\u0354\3\2\2\2\u0354\u041f\3\2\2"+ + "\2\u0355\u0356\7\u00d8\2\2\u0356\u0357\7\66\2\2\u0357\u041f\7\u0094\2"+ + "\2\u0358\u0359\t\n\2\2\u0359\u035b\7e\2\2\u035a\u035c\7U\2\2\u035b\u035a"+ + "\3\2\2\2\u035b\u035c\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u041f\5\60\31\2"+ + "\u035e\u035f\t\n\2\2\u035f\u0361\5.\30\2\u0360\u0362\7U\2\2\u0361\u0360"+ + "\3\2\2\2\u0361\u0362\3\2\2\2\u0362\u0363\3\2\2\2\u0363\u0364\5\u00b6\\"+ + "\2\u0364\u041f\3\2\2\2\u0365\u0367\t\n\2\2\u0366\u0368\7\u00e5\2\2\u0367"+ + "\u0366\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u036a\3\2\2\2\u0369\u036b\t\13"+ + "\2\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036c\3\2\2\2\u036c"+ + "\u036e\5\u00b6\\\2\u036d\u036f\5*\26\2\u036e\u036d\3\2\2\2\u036e\u036f"+ + "\3\2\2\2\u036f\u0371\3\2\2\2\u0370\u0372\5\62\32\2\u0371\u0370\3\2\2\2"+ + "\u0371\u0372\3\2\2\2\u0372\u041f\3\2\2\2\u0373\u0375\t\n\2\2\u0374\u0376"+ + "\7\u00b6\2\2\u0375\u0374\3\2\2\2\u0375\u0376\3\2\2\2\u0376\u0377\3\2\2"+ + "\2\u0377\u041f\5$\23\2\u0378\u0379\7+\2\2\u0379\u037a\7\u009d\2\2\u037a"+ + "\u037b\5.\30\2\u037b\u037c\5\u00b6\\\2\u037c\u037d\7z\2\2\u037d\u037e"+ + "\t\f\2\2\u037e\u041f\3\2\2\2\u037f\u0380\7+\2\2\u0380\u0381\7\u009d\2"+ + "\2\u0381\u0382\7\u00e5\2\2\u0382\u0383\5\u00b6\\\2\u0383\u0384\7z\2\2"+ + "\u0384\u0385\t\f\2\2\u0385\u041f\3\2\2\2\u0386\u0387\7\u00bd\2\2\u0387"+ + "\u0388\7\u00e5\2\2\u0388\u041f\5\u00b6\\\2\u0389\u038a\7\u00bd\2\2\u038a"+ + "\u038b\7e\2\2\u038b\u041f\5\u00b6\\\2\u038c\u0394\7\u00bd\2\2\u038d\u0395"+ + "\7\u0125\2\2\u038e\u0390\13\2\2\2\u038f\u038e\3\2\2\2\u0390\u0393\3\2"+ + "\2\2\u0391\u0392\3\2\2\2\u0391\u038f\3\2\2\2\u0392\u0395\3\2\2\2\u0393"+ + "\u0391\3\2\2\2\u0394\u038d\3\2\2\2\u0394\u0391\3\2\2\2\u0395\u041f\3\2"+ + "\2\2\u0396\u0398\7\35\2\2\u0397\u0399\7\u0080\2\2\u0398\u0397\3\2\2\2"+ + "\u0398\u0399\3\2\2\2\u0399\u039a\3\2\2\2\u039a\u039b\7\u00e5\2\2\u039b"+ + "\u039e\5\u00b6\\\2\u039c\u039d\7\u00a0\2\2\u039d\u039f\5<\37\2\u039e\u039c"+ + "\3\2\2\2\u039e\u039f\3\2\2\2\u039f\u03a4\3\2\2\2\u03a0\u03a2\7\24\2\2"+ + "\u03a1\u03a0\3\2\2\2\u03a1\u03a2\3\2\2\2\u03a2\u03a3\3\2\2\2\u03a3\u03a5"+ + "\5$\23\2\u03a4\u03a1\3\2\2\2\u03a4\u03a5\3\2\2\2\u03a5\u041f\3\2\2\2\u03a6"+ + "\u03a7\7\u00fa\2\2\u03a7\u03aa\7\u00e5\2\2\u03a8\u03a9\7m\2\2\u03a9\u03ab"+ + "\7R\2\2\u03aa\u03a8\3\2\2\2\u03aa\u03ab\3\2\2\2\u03ab\u03ac\3\2\2\2\u03ac"+ + "\u041f\5\u00b6\\\2\u03ad\u03ae\7#\2\2\u03ae\u041f\7\35\2\2\u03af\u03b0"+ + "\7\u0087\2\2\u03b0\u03b2\7<\2\2\u03b1\u03b3\7\u0088\2\2\u03b2\u03b1\3"+ + "\2\2\2\u03b2\u03b3\3\2\2\2\u03b3\u03b4\3\2\2\2\u03b4\u03b5\7t\2\2\u03b5"+ + "\u03b7\7\u0125\2\2\u03b6\u03b8\7\u00a9\2\2\u03b7\u03b6\3\2\2\2\u03b7\u03b8"+ + "\3\2\2\2\u03b8\u03b9\3\2\2\2\u03b9\u03ba\7y\2\2\u03ba\u03bb\7\u00e5\2"+ + "\2\u03bb\u03bd\5\u00b6\\\2\u03bc\u03be\5*\26\2\u03bd\u03bc\3\2\2\2\u03bd"+ + "\u03be\3\2\2\2\u03be\u041f\3\2\2\2\u03bf\u03c0\7\u00f5\2\2\u03c0\u03c1"+ + "\7\u00e5\2\2\u03c1\u03c3\5\u00b6\\\2\u03c2\u03c4\5*\26\2\u03c3\u03c2\3"+ + "\2\2\2\u03c3\u03c4\3\2\2\2\u03c4\u041f\3\2\2\2\u03c5\u03c6\7\u0093\2\2"+ + "\u03c6\u03c7\7\u00bf\2\2\u03c7\u03c8\7\u00e5\2\2\u03c8\u03cb\5\u00b6\\"+ + "\2\u03c9\u03ca\t\r\2\2\u03ca\u03cc\7\u00ac\2\2\u03cb\u03c9\3\2\2\2\u03cb"+ + "\u03cc\3\2\2\2\u03cc\u041f\3\2\2\2\u03cd\u03ce\t\16\2\2\u03ce\u03d2\5"+ + "\u0112\u008a\2\u03cf\u03d1\13\2\2\2\u03d0\u03cf\3\2\2\2\u03d1\u03d4\3"+ + "\2\2\2\u03d2\u03d3\3\2\2\2\u03d2\u03d0\3\2\2\2\u03d3\u041f\3\2\2\2\u03d4"+ + "\u03d2\3\2\2\2\u03d5\u03d6\7\u00d5\2\2\u03d6\u03da\7\u00c7\2\2\u03d7\u03d9"+ + "\13\2\2\2\u03d8\u03d7\3\2\2\2\u03d9\u03dc\3\2\2\2\u03da\u03db\3\2\2\2"+ + "\u03da\u03d8\3\2\2\2\u03db\u041f\3\2\2\2\u03dc\u03da\3\2\2\2\u03dd\u03de"+ + "\7\u00d5\2\2\u03de\u03df\7\u00ec\2\2\u03df\u03e0\7\u010c\2\2\u03e0\u041f"+ + "\5\u00e0q\2\u03e1\u03e2\7\u00d5\2\2\u03e2\u03e3\7\u00ec\2\2\u03e3\u03e4"+ + "\7\u010c\2\2\u03e4\u041f\t\17\2\2\u03e5\u03e6\7\u00d5\2\2\u03e6\u03e7"+ + "\7\u00ec\2\2\u03e7\u03eb\7\u010c\2\2\u03e8\u03ea\13\2\2\2\u03e9\u03e8"+ + "\3\2\2\2\u03ea\u03ed\3\2\2\2\u03eb\u03ec\3\2\2\2\u03eb\u03e9\3\2\2\2\u03ec"+ + "\u041f\3\2\2\2\u03ed\u03eb\3\2\2\2\u03ee\u03ef\7\u00d5\2\2\u03ef\u03f0"+ + "\5\22\n\2\u03f0\u03f1\7\u010d\2\2\u03f1\u03f2\5\24\13\2\u03f2\u041f\3"+ + "\2\2\2\u03f3\u03f4\7\u00d5\2\2\u03f4\u03fc\5\22\n\2\u03f5\u03f9\7\u010d"+ + "\2\2\u03f6\u03f8\13\2\2\2\u03f7\u03f6\3\2\2\2\u03f8\u03fb\3\2\2\2\u03f9"+ + "\u03fa\3\2\2\2\u03f9\u03f7\3\2\2\2\u03fa\u03fd\3\2\2\2\u03fb\u03f9\3\2"+ + "\2\2\u03fc\u03f5\3\2\2\2\u03fc\u03fd\3\2\2\2\u03fd\u041f\3\2\2\2\u03fe"+ + "\u0402\7\u00d5\2\2\u03ff\u0401\13\2\2\2\u0400\u03ff\3\2\2\2\u0401\u0404"+ + "\3\2\2\2\u0402\u0403\3\2\2\2\u0402\u0400\3\2\2\2\u0403\u0405\3\2\2\2\u0404"+ + "\u0402\3\2\2\2\u0405\u0406\7\u010d\2\2\u0406\u041f\5\24\13\2\u0407\u040b"+ + "\7\u00d5\2\2\u0408\u040a\13\2\2\2\u0409\u0408\3\2\2\2\u040a\u040d\3\2"+ + "\2\2\u040b\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c\u041f\3\2\2\2\u040d"+ + "\u040b\3\2\2\2\u040e\u040f\7\u00c1\2\2\u040f\u041f\5\22\n\2\u0410\u0414"+ + "\7\u00c1\2\2\u0411\u0413\13\2\2\2\u0412\u0411\3\2\2\2\u0413\u0416\3\2"+ + "\2\2\u0414\u0415\3\2\2\2\u0414\u0412\3\2\2\2\u0415\u041f\3\2\2\2\u0416"+ + "\u0414\3\2\2\2\u0417\u041b\5\26\f\2\u0418\u041a\13\2\2\2\u0419\u0418\3"+ + "\2\2\2\u041a\u041d\3\2\2\2\u041b\u041c\3\2\2\2\u041b\u0419\3\2\2\2\u041c"+ + "\u041f\3\2\2\2\u041d\u041b\3\2\2\2\u041e\u013d\3\2\2\2\u041e\u013f\3\2"+ + "\2\2\u041e\u0142\3\2\2\2\u041e\u0147\3\2\2\2\u041e\u0159\3\2\2\2\u041e"+ + "\u0160\3\2\2\2\u041e\u0166\3\2\2\2\u041e\u0170\3\2\2\2\u041e\u017c\3\2"+ + "\2\2\u041e\u018d\3\2\2\2\u041e\u01a2\3\2\2\2\u041e\u01b3\3\2\2\2\u041e"+ + "\u01c4\3\2\2\2\u041e\u01cf\3\2\2\2\u041e\u01d6\3\2\2\2\u041e\u01df\3\2"+ + "\2\2\u041e\u01e8\3\2\2\2\u041e\u01f1\3\2\2\2\u041e\u01f8\3\2\2\2\u041e"+ + "\u01ff\3\2\2\2\u041e\u0206\3\2\2\2\u041e\u0211\3\2\2\2\u041e\u021c\3\2"+ + "\2\2\u041e\u022b\3\2\2\2\u041e\u0237\3\2\2\2\u041e\u0245\3\2\2\2\u041e"+ + "\u024f\3\2\2\2\u041e\u025d\3\2\2\2\u041e\u0265\3\2\2\2\u041e\u0278\3\2"+ + "\2\2\u041e\u0281\3\2\2\2\u041e\u0287\3\2\2\2\u041e\u0291\3\2\2\2\u041e"+ + "\u0298\3\2\2\2\u041e\u02bb\3\2\2\2\u041e\u02d1\3\2\2\2\u041e\u02d9\3\2"+ + "\2\2\u041e\u02f5\3\2\2\2\u041e\u02ff\3\2\2\2\u041e\u0304\3\2\2\2\u041e"+ + "\u0310\3\2\2\2\u041e\u031c\3\2\2\2\u041e\u0325\3\2\2\2\u041e\u032d\3\2"+ + "\2\2\u041e\u0339\3\2\2\2\u041e\u033f\3\2\2\2\u041e\u034d\3\2\2\2\u041e"+ + "\u0355\3\2\2\2\u041e\u0358\3\2\2\2\u041e\u035e\3\2\2\2\u041e\u0365\3\2"+ + "\2\2\u041e\u0373\3\2\2\2\u041e\u0378\3\2\2\2\u041e\u037f\3\2\2\2\u041e"+ + "\u0386\3\2\2\2\u041e\u0389\3\2\2\2\u041e\u038c\3\2\2\2\u041e\u0396\3\2"+ + "\2\2\u041e\u03a6\3\2\2\2\u041e\u03ad\3\2\2\2\u041e\u03af\3\2\2\2\u041e"+ + "\u03bf\3\2\2\2\u041e\u03c5\3\2\2\2\u041e\u03cd\3\2\2\2\u041e\u03d5\3\2"+ + "\2\2\u041e\u03dd\3\2\2\2\u041e\u03e1\3\2\2\2\u041e\u03e5\3\2\2\2\u041e"+ + "\u03ee\3\2\2\2\u041e\u03f3\3\2\2\2\u041e\u03fe\3\2\2\2\u041e\u0407\3\2"+ + "\2\2\u041e\u040e\3\2\2\2\u041e\u0410\3\2\2\2\u041e\u0417\3\2\2\2\u041f"+ + "\21\3\2\2\2\u0420\u0421\5\u0116\u008c\2\u0421\23\3\2\2\2\u0422\u0423\5"+ + "\u0116\u008c\2\u0423\25\3\2\2\2\u0424\u0425\7\63\2\2\u0425\u04cd\7\u00c7"+ + "\2\2\u0426\u0427\7K\2\2\u0427\u04cd\7\u00c7\2\2\u0428\u042a\7h\2\2\u0429"+ + "\u042b\7\u00c7\2\2\u042a\u0429\3\2\2\2\u042a\u042b\3\2\2\2\u042b\u04cd"+ + "\3\2\2\2\u042c\u042e\7\u00c4\2\2\u042d\u042f\7\u00c7\2\2\u042e\u042d\3"+ + "\2\2\2\u042e\u042f\3\2\2\2\u042f\u04cd\3\2\2\2\u0430\u0431\7\u00d8\2\2"+ + "\u0431\u04cd\7h\2\2\u0432\u0433\7\u00d8\2\2\u0433\u0435\7\u00c7\2\2\u0434"+ + "\u0436\7h\2\2\u0435\u0434\3\2\2\2\u0435\u0436\3\2\2\2\u0436\u04cd\3\2"+ + "\2\2\u0437\u0438\7\u00d8\2\2\u0438\u04cd\7\u00b3\2\2\u0439\u043a\7\u00d8"+ + "\2\2\u043a\u04cd\7\u00c8\2\2\u043b\u043c\7\u00d8\2\2\u043c\u043d\7\66"+ + "\2\2\u043d\u04cd\7\u00c8\2\2\u043e\u043f\7T\2\2\u043f\u04cd\7\u00e5\2"+ + "\2\u0440\u0441\7o\2\2\u0441\u04cd\7\u00e5\2\2\u0442\u0443\7\u00d8\2\2"+ + "\u0443\u04cd\7.\2\2\u0444\u0445\7\u00d8\2\2\u0445\u0446\7\63\2\2\u0446"+ + "\u04cd\7\u00e5\2\2\u0447\u0448\7\u00d8\2\2\u0448\u04cd\7\u00f1\2\2\u0449"+ + "\u044a\7\u00d8\2\2\u044a\u04cd\7r\2\2\u044b\u044c\7\u00d8\2\2\u044c\u04cd"+ + "\7\u008b\2\2\u044d\u044e\7\63\2\2\u044e\u04cd\7q\2\2\u044f\u0450\7K\2"+ + "\2\u0450\u04cd\7q\2\2\u0451\u0452\7\r\2\2\u0452\u04cd\7q\2\2\u0453\u0454"+ + "\7\u008a\2\2\u0454\u04cd\7\u00e5\2\2\u0455\u0456\7\u008a\2\2\u0456\u04cd"+ + "\7=\2\2\u0457\u0458\7\u00fe\2\2\u0458\u04cd\7\u00e5\2\2\u0459\u045a\7"+ + "\u00fe\2\2\u045a\u04cd\7=\2\2\u045b\u045c\7\63\2\2\u045c\u045d\7\u00e9"+ + "\2\2\u045d\u04cd\7\u008d\2\2\u045e\u045f\7K\2\2\u045f\u0460\7\u00e9\2"+ + "\2\u0460\u04cd\7\u008d\2\2\u0461\u0462\7\r\2\2\u0462\u0463\7\u00e5\2\2"+ + "\u0463\u0464\5\u00b8]\2\u0464\u0465\7\u0098\2\2\u0465\u0466\7%\2\2\u0466"+ + "\u04cd\3\2\2\2\u0467\u0468\7\r\2\2\u0468\u0469\7\u00e5\2\2\u0469\u046a"+ + "\5\u00b8]\2\u046a\u046b\7%\2\2\u046b\u046c\7\34\2\2\u046c\u04cd\3\2\2"+ + "\2\u046d\u046e\7\r\2\2\u046e\u046f\7\u00e5\2\2\u046f\u0470\5\u00b8]\2"+ + "\u0470\u0471\7\u0098\2\2\u0471\u0472\7\u00dc\2\2\u0472\u04cd\3\2\2\2\u0473"+ + "\u0474\7\r\2\2\u0474\u0475\7\u00e5\2\2\u0475\u0476\5\u00b8]\2\u0476\u0477"+ + "\7\u00d9\2\2\u0477\u0478\7\34\2\2\u0478\u04cd\3\2\2\2\u0479\u047a\7\r"+ + "\2\2\u047a\u047b\7\u00e5\2\2\u047b\u047c\5\u00b8]\2\u047c\u047d\7\u0098"+ + "\2\2\u047d\u047e\7\u00d9\2\2\u047e\u04cd\3\2\2\2\u047f\u0480\7\r\2\2\u0480"+ + "\u0481\7\u00e5\2\2\u0481\u0482\5\u00b8]\2\u0482\u0483\7\u0098\2\2\u0483"+ + "\u0484\7\u00df\2\2\u0484\u0485\7\24\2\2\u0485\u0486\7F\2\2\u0486\u04cd"+ + "\3\2\2\2\u0487\u0488\7\r\2\2\u0488\u0489\7\u00e5\2\2\u0489\u048a\5\u00b8"+ + "]\2\u048a\u048b\7\u00d5\2\2\u048b\u048c\7\u00d9\2\2\u048c\u048d\7\u0089"+ + "\2\2\u048d\u04cd\3\2\2\2\u048e\u048f\7\r\2\2\u048f\u0490\7\u00e5\2\2\u0490"+ + "\u0491\5\u00b8]\2\u0491\u0492\7Q\2\2\u0492\u0493\7\u00aa\2\2\u0493\u04cd"+ + "\3\2\2\2\u0494\u0495\7\r\2\2\u0495\u0496\7\u00e5\2\2\u0496\u0497\5\u00b8"+ + "]\2\u0497\u0498\7\22\2\2\u0498\u0499\7\u00aa\2\2\u0499\u04cd\3\2\2\2\u049a"+ + "\u049b\7\r\2\2\u049b\u049c\7\u00e5\2\2\u049c\u049d\5\u00b8]\2\u049d\u049e"+ + "\7\u00f8\2\2\u049e\u049f\7\u00aa\2\2\u049f\u04cd\3\2\2\2\u04a0\u04a1\7"+ + "\r\2\2\u04a1\u04a2\7\u00e5\2\2\u04a2\u04a3\5\u00b8]\2\u04a3\u04a4\7\u00ee"+ + "\2\2\u04a4\u04cd\3\2\2\2\u04a5\u04a6\7\r\2\2\u04a6\u04a7\7\u00e5\2\2\u04a7"+ + "\u04a9\5\u00b8]\2\u04a8\u04aa\5*\26\2\u04a9\u04a8\3\2\2\2\u04a9\u04aa"+ + "\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ac\7-\2\2\u04ac\u04cd\3\2\2\2\u04ad"+ + "\u04ae\7\r\2\2\u04ae\u04af\7\u00e5\2\2\u04af\u04b1\5\u00b8]\2\u04b0\u04b2"+ + "\5*\26\2\u04b1\u04b0\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3"+ + "\u04b4\7\60\2\2\u04b4\u04cd\3\2\2\2\u04b5\u04b6\7\r\2\2\u04b6\u04b7\7"+ + "\u00e5\2\2\u04b7\u04b9\5\u00b8]\2\u04b8\u04ba\5*\26\2\u04b9\u04b8\3\2"+ + "\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bc\7\u00d5\2\2\u04bc"+ + "\u04bd\7\\\2\2\u04bd\u04cd\3\2\2\2\u04be\u04bf\7\r\2\2\u04bf\u04c0\7\u00e5"+ + "\2\2\u04c0\u04c2\5\u00b8]\2\u04c1\u04c3\5*\26\2\u04c2\u04c1\3\2\2\2\u04c2"+ + "\u04c3\3\2\2\2\u04c3\u04c4\3\2\2\2\u04c4\u04c5\7\u00c0\2\2\u04c5\u04c6"+ + "\7*\2\2\u04c6\u04cd\3\2\2\2\u04c7\u04c8\7\u00dd\2\2\u04c8\u04cd\7\u00f0"+ + "\2\2\u04c9\u04cd\7,\2\2\u04ca\u04cd\7\u00c9\2\2\u04cb\u04cd\7E\2\2\u04cc"+ + "\u0424\3\2\2\2\u04cc\u0426\3\2\2\2\u04cc\u0428\3\2\2\2\u04cc\u042c\3\2"+ + "\2\2\u04cc\u0430\3\2\2\2\u04cc\u0432\3\2\2\2\u04cc\u0437\3\2\2\2\u04cc"+ + "\u0439\3\2\2\2\u04cc\u043b\3\2\2\2\u04cc\u043e\3\2\2\2\u04cc\u0440\3\2"+ + "\2\2\u04cc\u0442\3\2\2\2\u04cc\u0444\3\2\2\2\u04cc\u0447\3\2\2\2\u04cc"+ + "\u0449\3\2\2\2\u04cc\u044b\3\2\2\2\u04cc\u044d\3\2\2\2\u04cc\u044f\3\2"+ + "\2\2\u04cc\u0451\3\2\2\2\u04cc\u0453\3\2\2\2\u04cc\u0455\3\2\2\2\u04cc"+ + "\u0457\3\2\2\2\u04cc\u0459\3\2\2\2\u04cc\u045b\3\2\2\2\u04cc\u045e\3\2"+ + "\2\2\u04cc\u0461\3\2\2\2\u04cc\u0467\3\2\2\2\u04cc\u046d\3\2\2\2\u04cc"+ + "\u0473\3\2\2\2\u04cc\u0479\3\2\2\2\u04cc\u047f\3\2\2\2\u04cc\u0487\3\2"+ + "\2\2\u04cc\u048e\3\2\2\2\u04cc\u0494\3\2\2\2\u04cc\u049a\3\2\2\2\u04cc"+ + "\u04a0\3\2\2\2\u04cc\u04a5\3\2\2\2\u04cc\u04ad\3\2\2\2\u04cc\u04b5\3\2"+ + "\2\2\u04cc\u04be\3\2\2\2\u04cc\u04c7\3\2\2\2\u04cc\u04c9\3\2\2\2\u04cc"+ + "\u04ca\3\2\2\2\u04cc\u04cb\3\2\2\2\u04cd\27\3\2\2\2\u04ce\u04d0\7\63\2"+ + "\2\u04cf\u04d1\7\u00e9\2\2\u04d0\u04cf\3\2\2\2\u04d0\u04d1\3\2\2\2\u04d1"+ + "\u04d3\3\2\2\2\u04d2\u04d4\7V\2\2\u04d3\u04d2\3\2\2\2\u04d3\u04d4\3\2"+ + "\2\2\u04d4\u04d5\3\2\2\2\u04d5\u04d9\7\u00e5\2\2\u04d6\u04d7\7m\2\2\u04d7"+ + "\u04d8\7\u0098\2\2\u04d8\u04da\7R\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04da"+ + "\3\2\2\2\u04da\u04db\3\2\2\2\u04db\u04dc\5\u00b6\\\2\u04dc\31\3\2\2\2"+ + "\u04dd\u04de\7\63\2\2\u04de\u04e0\7\u00a1\2\2\u04df\u04dd\3\2\2\2\u04df"+ + "\u04e0\3\2\2\2\u04e0\u04e1\3\2\2\2\u04e1\u04e2\7\u00c0\2\2\u04e2\u04e3"+ + "\7\u00e5\2\2\u04e3\u04e4\5\u00b6\\\2\u04e4\33\3\2\2\2\u04e5\u04e6\7%\2"+ + "\2\u04e6\u04e7\7\34\2\2\u04e7\u04eb\5\u009eP\2\u04e8\u04e9\7\u00dc\2\2"+ + "\u04e9\u04ea\7\34\2\2\u04ea\u04ec\5\u00a2R\2\u04eb\u04e8\3\2\2\2\u04eb"+ + "\u04ec\3\2\2\2\u04ec\u04ed\3\2\2\2\u04ed\u04ee\7y\2\2\u04ee\u04ef\7\u0129"+ + "\2\2\u04ef\u04f0\7\33\2\2\u04f0\35\3\2\2\2\u04f1\u04f2\7\u00d9\2\2\u04f2"+ + "\u04f3\7\34\2\2\u04f3\u04f4\5\u009eP\2\u04f4\u04f7\7\u009d\2\2\u04f5\u04f8"+ + "\5D#\2\u04f6\u04f8\5F$\2\u04f7\u04f5\3\2\2\2\u04f7\u04f6\3\2\2\2\u04f8"+ + "\u04fc\3\2\2\2\u04f9\u04fa\7\u00df\2\2\u04fa\u04fb\7\24\2\2\u04fb\u04fd"+ + "\7F\2\2\u04fc\u04f9\3\2\2\2\u04fc\u04fd\3\2\2\2\u04fd\37\3\2\2\2\u04fe"+ + "\u04ff\7\u0089\2\2\u04ff\u0500\7\u0125\2\2\u0500!\3\2\2\2\u0501\u0502"+ + "\7+\2\2\u0502\u0503\7\u0125\2\2\u0503#\3\2\2\2\u0504\u0506\5\64\33\2\u0505"+ + "\u0504\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u0507\3\2\2\2\u0507\u0508\5V"+ + ",\2\u0508\u0509\5R*\2\u0509%\3\2\2\2\u050a\u050b\7v\2\2\u050b\u050d\7"+ + "\u00a9\2\2\u050c\u050e\7\u00e5\2\2\u050d\u050c\3\2\2\2\u050d\u050e\3\2"+ + "\2\2\u050e\u050f\3\2\2\2\u050f\u0516\5\u00b6\\\2\u0510\u0514\5*\26\2\u0511"+ + "\u0512\7m\2\2\u0512\u0513\7\u0098\2\2\u0513\u0515\7R\2\2\u0514\u0511\3"+ + "\2\2\2\u0514\u0515\3\2\2\2\u0515\u0517\3\2\2\2\u0516\u0510\3\2\2\2\u0516"+ + "\u0517\3\2\2\2\u0517\u0519\3\2\2\2\u0518\u051a\5\u009eP\2\u0519\u0518"+ + "\3\2\2\2\u0519\u051a\3\2\2\2\u051a\u0548\3\2\2\2\u051b\u051c\7v\2\2\u051c"+ + "\u051e\7y\2\2\u051d\u051f\7\u00e5\2\2\u051e\u051d\3\2\2\2\u051e\u051f"+ + "\3\2\2\2\u051f\u0520\3\2\2\2\u0520\u0522\5\u00b6\\\2\u0521\u0523\5*\26"+ + "\2\u0522\u0521\3\2\2\2\u0522\u0523\3\2\2\2\u0523\u0527\3\2\2\2\u0524\u0525"+ + "\7m\2\2\u0525\u0526\7\u0098\2\2\u0526\u0528\7R\2\2\u0527\u0524\3\2\2\2"+ + "\u0527\u0528\3\2\2\2\u0528\u052a\3\2\2\2\u0529\u052b\5\u009eP\2\u052a"+ + "\u0529\3\2\2\2\u052a\u052b\3\2\2\2\u052b\u0548\3\2\2\2\u052c\u052d\7v"+ + "\2\2\u052d\u052f\7\u00a9\2\2\u052e\u0530\7\u0088\2\2\u052f\u052e\3\2\2"+ + "\2\u052f\u0530\3\2\2\2\u0530\u0531\3\2\2\2\u0531\u0532\7G\2\2\u0532\u0534"+ + "\7\u0125\2\2\u0533\u0535\5\u00b2Z\2\u0534\u0533\3\2\2\2\u0534\u0535\3"+ + "\2\2\2\u0535\u0537\3\2\2\2\u0536\u0538\5H%\2\u0537\u0536\3\2\2\2\u0537"+ + "\u0538\3\2\2\2\u0538\u0548\3\2\2\2\u0539\u053a\7v\2\2\u053a\u053c\7\u00a9"+ + "\2\2\u053b\u053d\7\u0088\2\2\u053c\u053b\3\2\2\2\u053c\u053d\3\2\2\2\u053d"+ + "\u053e\3\2\2\2\u053e\u0540\7G\2\2\u053f\u0541\7\u0125\2\2\u0540\u053f"+ + "\3\2\2\2\u0540\u0541\3\2\2\2\u0541\u0542\3\2\2\2\u0542\u0545\58\35\2\u0543"+ + "\u0544\7\u00a0\2\2\u0544\u0546\5<\37\2\u0545\u0543\3\2\2\2\u0545\u0546"+ + "\3\2\2\2\u0546\u0548\3\2\2\2\u0547\u050a\3\2\2\2\u0547\u051b\3\2\2\2\u0547"+ + "\u052c\3\2\2\2\u0547\u0539\3\2\2\2\u0548\'\3\2\2\2\u0549\u054b\5*\26\2"+ + "\u054a\u054c\5 \21\2\u054b\u054a\3\2\2\2\u054b\u054c\3\2\2\2\u054c)\3"+ + "\2\2\2\u054d\u054e\7\u00aa\2\2\u054e\u054f\7\3\2\2\u054f\u0554\5,\27\2"+ + "\u0550\u0551\7\u0122\2\2\u0551\u0553\5,\27\2\u0552\u0550\3\2\2\2\u0553"+ + "\u0556\3\2\2\2\u0554\u0552\3\2\2\2\u0554\u0555\3\2\2\2\u0555\u0557\3\2"+ + "\2\2\u0556\u0554\3\2\2\2\u0557\u0558\7\4\2\2\u0558+\3\2\2\2\u0559\u055c"+ + "\5\u0112\u008a\2\u055a\u055b\7\u010d\2\2\u055b\u055d\5\u00d6l\2\u055c"+ + "\u055a\3\2\2\2\u055c\u055d\3\2\2\2\u055d-\3\2\2\2\u055e\u055f\t\20\2\2"+ + "\u055f/\3\2\2\2\u0560\u0566\5\u010c\u0087\2\u0561\u0566\7\u0125\2\2\u0562"+ + "\u0566\5\u00d8m\2\u0563\u0566\5\u00dan\2\u0564\u0566\5\u00dco\2\u0565"+ + "\u0560\3\2\2\2\u0565\u0561\3\2\2\2\u0565\u0562\3\2\2\2\u0565\u0563\3\2"+ + "\2\2\u0565\u0564\3\2\2\2\u0566\61\3\2\2\2\u0567\u056c\5\u0112\u008a\2"+ + "\u0568\u0569\7\u0121\2\2\u0569\u056b\5\u0112\u008a\2\u056a\u0568\3\2\2"+ + "\2\u056b\u056e\3\2\2\2\u056c\u056a\3\2\2\2\u056c\u056d\3\2\2\2\u056d\63"+ + "\3\2\2\2\u056e\u056c\3\2\2\2\u056f\u0570\7\u010a\2\2\u0570\u0575\5\66"+ + "\34\2\u0571\u0572\7\u0122\2\2\u0572\u0574\5\66\34\2\u0573\u0571\3\2\2"+ + "\2\u0574\u0577\3\2\2\2\u0575\u0573\3\2\2\2\u0575\u0576\3\2\2\2\u0576\65"+ + "\3\2\2\2\u0577\u0575\3\2\2\2\u0578\u057a\5\u010e\u0088\2\u0579\u057b\5"+ + "\u009eP\2\u057a\u0579\3\2\2\2\u057a\u057b\3\2\2\2\u057b\u057d\3\2\2\2"+ + "\u057c\u057e\7\24\2\2\u057d\u057c\3\2\2\2\u057d\u057e\3\2\2\2\u057e\u057f"+ + "\3\2\2\2\u057f\u0580\7\3\2\2\u0580\u0581\5$\23\2\u0581\u0582\7\4\2\2\u0582"+ + "\67\3\2\2\2\u0583\u0584\7\u0103\2\2\u0584\u0585\5\u00b6\\\2\u05859\3\2"+ + "\2\2\u0586\u0587\7\u00a0\2\2\u0587\u0594\5<\37\2\u0588\u0589\7\u00ab\2"+ + "\2\u0589\u058a\7\34\2\2\u058a\u0594\5\u00c0a\2\u058b\u0594\5\36\20\2\u058c"+ + "\u0594\5\34\17\2\u058d\u0594\5\u00b2Z\2\u058e\u0594\5H%\2\u058f\u0594"+ + "\5 \21\2\u0590\u0594\5\"\22\2\u0591\u0592\7\u00e8\2\2\u0592\u0594\5<\37"+ + "\2\u0593\u0586\3\2\2\2\u0593\u0588\3\2\2\2\u0593\u058b\3\2\2\2\u0593\u058c"+ + "\3\2\2\2\u0593\u058d\3\2\2\2\u0593\u058e\3\2\2\2\u0593\u058f\3\2\2\2\u0593"+ + "\u0590\3\2\2\2\u0593\u0591\3\2\2\2\u0594\u0597\3\2\2\2\u0595\u0593\3\2"+ + "\2\2\u0595\u0596\3\2\2\2\u0596;\3\2\2\2\u0597\u0595\3\2\2\2\u0598\u0599"+ + "\7\3\2\2\u0599\u059e\5> \2\u059a\u059b\7\u0122\2\2\u059b\u059d\5> \2\u059c"+ + "\u059a\3\2\2\2\u059d\u05a0\3\2\2\2\u059e\u059c\3\2\2\2\u059e\u059f\3\2"+ + "\2\2\u059f\u05a1\3\2\2\2\u05a0\u059e\3\2\2\2\u05a1\u05a2\7\4\2\2\u05a2"+ + "=\3\2\2\2\u05a3\u05a8\5@!\2\u05a4\u05a6\7\u010d\2\2\u05a5\u05a4\3\2\2"+ + "\2\u05a5\u05a6\3\2\2\2\u05a6\u05a7\3\2\2\2\u05a7\u05a9\5B\"\2\u05a8\u05a5"+ + "\3\2\2\2\u05a8\u05a9\3\2\2\2\u05a9?\3\2\2\2\u05aa\u05af\5\u0112\u008a"+ + "\2\u05ab\u05ac\7\u0121\2\2\u05ac\u05ae\5\u0112\u008a\2\u05ad\u05ab\3\2"+ + "\2\2\u05ae\u05b1\3\2\2\2\u05af\u05ad\3\2\2\2\u05af\u05b0\3\2\2\2\u05b0"+ + "\u05b4\3\2\2\2\u05b1\u05af\3\2\2\2\u05b2\u05b4\7\u0125\2\2\u05b3\u05aa"+ + "\3\2\2\2\u05b3\u05b2\3\2\2\2\u05b4A\3\2\2\2\u05b5\u05ba\7\u0129\2\2\u05b6"+ + "\u05ba\7\u012b\2\2\u05b7\u05ba\5\u00dep\2\u05b8\u05ba\7\u0125\2\2\u05b9"+ + "\u05b5\3\2\2\2\u05b9\u05b6\3\2\2\2\u05b9\u05b7\3\2\2\2\u05b9\u05b8\3\2"+ + "\2\2\u05baC\3\2\2\2\u05bb\u05bc\7\3\2\2\u05bc\u05c1\5\u00d6l\2\u05bd\u05be"+ + "\7\u0122\2\2\u05be\u05c0\5\u00d6l\2\u05bf\u05bd\3\2\2\2\u05c0\u05c3\3"+ + "\2\2\2\u05c1\u05bf\3\2\2\2\u05c1\u05c2\3\2\2\2\u05c2\u05c4\3\2\2\2\u05c3"+ + "\u05c1\3\2\2\2\u05c4\u05c5\7\4\2\2\u05c5E\3\2\2\2\u05c6\u05c7\7\3\2\2"+ + "\u05c7\u05cc\5D#\2\u05c8\u05c9\7\u0122\2\2\u05c9\u05cb\5D#\2\u05ca\u05c8"+ + "\3\2\2\2\u05cb\u05ce\3\2\2\2\u05cc\u05ca\3\2\2\2\u05cc\u05cd\3\2\2\2\u05cd"+ + "\u05cf\3\2\2\2\u05ce\u05cc\3\2\2\2\u05cf\u05d0\7\4\2\2\u05d0G\3\2\2\2"+ + "\u05d1\u05d2\7\u00df\2\2\u05d2\u05d3\7\24\2\2\u05d3\u05d8\5J&\2\u05d4"+ + "\u05d5\7\u00df\2\2\u05d5\u05d6\7\34\2\2\u05d6\u05d8\5L\'\2\u05d7\u05d1"+ + "\3\2\2\2\u05d7\u05d4\3\2\2\2\u05d8I\3\2\2\2\u05d9\u05da\7u\2\2\u05da\u05db"+ + "\7\u0125\2\2\u05db\u05dc\7\u00a5\2\2\u05dc\u05df\7\u0125\2\2\u05dd\u05df"+ + "\5\u0112\u008a\2\u05de\u05d9\3\2\2\2\u05de\u05dd\3\2\2\2\u05dfK\3\2\2"+ + "\2\u05e0\u05e4\7\u0125\2\2\u05e1\u05e2\7\u010a\2\2\u05e2\u05e3\7\u00d3"+ + "\2\2\u05e3\u05e5\5<\37\2\u05e4\u05e1\3\2\2\2\u05e4\u05e5\3\2\2\2\u05e5"+ + "M\3\2\2\2\u05e6\u05e7\5\u0112\u008a\2\u05e7\u05e8\7\u0125\2\2\u05e8O\3"+ + "\2\2\2\u05e9\u05ea\5&\24\2\u05ea\u05eb\5V,\2\u05eb\u05ec\5R*\2\u05ec\u061d"+ + "\3\2\2\2\u05ed\u05ef\5|?\2\u05ee\u05f0\5T+\2\u05ef\u05ee\3\2\2\2\u05f0"+ + "\u05f1\3\2\2\2\u05f1\u05ef\3\2\2\2\u05f1\u05f2\3\2\2\2\u05f2\u061d\3\2"+ + "\2\2\u05f3\u05f4\7A\2\2\u05f4\u05f5\7c\2\2\u05f5\u05f6\5\u00b6\\\2\u05f6"+ + "\u05f8\5\u00b0Y\2\u05f7\u05f9\5t;\2\u05f8\u05f7\3\2\2\2\u05f8\u05f9\3"+ + "\2\2\2\u05f9\u061d\3\2\2\2\u05fa\u05fb\7\u0100\2\2\u05fb\u05fc\5\u00b6"+ + "\\\2\u05fc\u05fd\5\u00b0Y\2\u05fd\u05ff\5f\64\2\u05fe\u0600\5t;\2\u05ff"+ + "\u05fe\3\2\2\2\u05ff\u0600\3\2\2\2\u0600\u061d\3\2\2\2\u0601\u0602\7\u0090"+ + "\2\2\u0602\u0603\7y\2\2\u0603\u0604\5\u00b6\\\2\u0604\u0605\5\u00b0Y\2"+ + "\u0605\u060b\7\u0103\2\2\u0606\u060c\5\u00b6\\\2\u0607\u0608\7\3\2\2\u0608"+ + "\u0609\5$\23\2\u0609\u060a\7\4\2\2\u060a\u060c\3\2\2\2\u060b\u0606\3\2"+ + "\2\2\u060b\u0607\3\2\2\2\u060c\u060d\3\2\2\2\u060d\u060e\5\u00b0Y\2\u060e"+ + "\u060f\7\u009d\2\2\u060f\u0613\5\u00ccg\2\u0610\u0612\5h\65\2\u0611\u0610"+ + "\3\2\2\2\u0612\u0615\3\2\2\2\u0613\u0611\3\2\2\2\u0613\u0614\3\2\2\2\u0614"+ + "\u0619\3\2\2\2\u0615\u0613\3\2\2\2\u0616\u0618\5j\66\2\u0617\u0616\3\2"+ + "\2\2\u0618\u061b\3\2\2\2\u0619\u0617\3\2\2\2\u0619\u061a\3\2\2\2\u061a"+ + "\u061d\3\2\2\2\u061b\u0619\3\2\2\2\u061c\u05e9\3\2\2\2\u061c\u05ed\3\2"+ + "\2\2\u061c\u05f3\3\2\2\2\u061c\u05fa\3\2\2\2\u061c\u0601\3\2\2\2\u061d"+ + "Q\3\2\2\2\u061e\u061f\7\u00a2\2\2\u061f\u0620\7\34\2\2\u0620\u0625\5Z"+ + ".\2\u0621\u0622\7\u0122\2\2\u0622\u0624\5Z.\2\u0623\u0621\3\2\2\2\u0624"+ + "\u0627\3\2\2\2\u0625\u0623\3\2\2\2\u0625\u0626\3\2\2\2\u0626\u0629\3\2"+ + "\2\2\u0627\u0625\3\2\2\2\u0628\u061e\3\2\2\2\u0628\u0629\3\2\2\2\u0629"+ + "\u0634\3\2\2\2\u062a\u062b\7$\2\2\u062b\u062c\7\34\2\2\u062c\u0631\5\u00c8"+ + "e\2\u062d\u062e\7\u0122\2\2\u062e\u0630\5\u00c8e\2\u062f\u062d\3\2\2\2"+ + "\u0630\u0633\3\2\2\2\u0631\u062f\3\2\2\2\u0631\u0632\3\2\2\2\u0632\u0635"+ + "\3\2\2\2\u0633\u0631\3\2\2\2\u0634\u062a\3\2\2\2\u0634\u0635\3\2\2\2\u0635"+ + "\u0640\3\2\2\2\u0636\u0637\7I\2\2\u0637\u0638\7\34\2\2\u0638\u063d\5\u00c8"+ + "e\2\u0639\u063a\7\u0122\2\2\u063a\u063c\5\u00c8e\2\u063b\u0639\3\2\2\2"+ + "\u063c\u063f\3\2\2\2\u063d\u063b\3\2\2\2\u063d\u063e\3\2\2\2\u063e\u0641"+ + "\3\2\2\2\u063f\u063d\3\2\2\2\u0640\u0636\3\2\2\2\u0640\u0641\3\2\2\2\u0641"+ + "\u064c\3\2\2\2\u0642\u0643\7\u00db\2\2\u0643\u0644\7\34\2\2\u0644\u0649"+ + "\5Z.\2\u0645\u0646\7\u0122\2\2\u0646\u0648\5Z.\2\u0647\u0645\3\2\2\2\u0648"+ + "\u064b\3\2\2\2\u0649\u0647\3\2\2\2\u0649\u064a\3\2\2\2\u064a\u064d\3\2"+ + "\2\2\u064b\u0649\3\2\2\2\u064c\u0642\3\2\2\2\u064c\u064d\3\2\2\2\u064d"+ + "\u064f\3\2\2\2\u064e\u0650\5\u00fe\u0080\2\u064f\u064e\3\2\2\2\u064f\u0650"+ + "\3\2\2\2\u0650\u0656\3\2\2\2\u0651\u0654\7\u0084\2\2\u0652\u0655\7\f\2"+ + "\2\u0653\u0655\5\u00d4k\2\u0654\u0652\3\2\2\2\u0654\u0653\3\2\2\2\u0655"+ + "\u0657\3\2\2\2\u0656\u0651\3\2\2\2\u0656\u0657\3\2\2\2\u0657S\3\2\2\2"+ + "\u0658\u0659\5&\24\2\u0659\u065a\5^\60\2\u065aU\3\2\2\2\u065b\u065c\b"+ + ",\1\2\u065c\u065d\5X-\2\u065d\u0675\3\2\2\2\u065e\u065f\f\5\2\2\u065f"+ + "\u0660\6,\3\2\u0660\u0662\t\21\2\2\u0661\u0663\5\u0090I\2\u0662\u0661"+ + "\3\2\2\2\u0662\u0663\3\2\2\2\u0663\u0664\3\2\2\2\u0664\u0674\5V,\6\u0665"+ + "\u0666\f\4\2\2\u0666\u0667\6,\5\2\u0667\u0669\7w\2\2\u0668\u066a\5\u0090"+ + "I\2\u0669\u0668\3\2\2\2\u0669\u066a\3\2\2\2\u066a\u066b\3\2\2\2\u066b"+ + "\u0674\5V,\5\u066c\u066d\f\3\2\2\u066d\u066e\6,\7\2\u066e\u0670\t\22\2"+ + "\2\u066f\u0671\5\u0090I\2\u0670\u066f\3\2\2\2\u0670\u0671\3\2\2\2\u0671"+ + "\u0672\3\2\2\2\u0672\u0674\5V,\4\u0673\u065e\3\2\2\2\u0673\u0665\3\2\2"+ + "\2\u0673\u066c\3\2\2\2\u0674\u0677\3\2\2\2\u0675\u0673\3\2\2\2\u0675\u0676"+ + "\3\2\2\2\u0676W\3\2\2\2\u0677\u0675\3\2\2\2\u0678\u0682\5`\61\2\u0679"+ + "\u0682\5\\/\2\u067a\u067b\7\u00e5\2\2\u067b\u0682\5\u00b6\\\2\u067c\u0682"+ + "\5\u00acW\2\u067d\u067e\7\3\2\2\u067e\u067f\5$\23\2\u067f\u0680\7\4\2"+ + "\2\u0680\u0682\3\2\2\2\u0681\u0678\3\2\2\2\u0681\u0679\3\2\2\2\u0681\u067a"+ + "\3\2\2\2\u0681\u067c\3\2\2\2\u0681\u067d\3\2\2\2\u0682Y\3\2\2\2\u0683"+ + "\u0685\5\u00c8e\2\u0684\u0686\t\23\2\2\u0685\u0684\3\2\2\2\u0685\u0686"+ + "\3\2\2\2\u0686\u0689\3\2\2\2\u0687\u0688\7\u009a\2\2\u0688\u068a\t\24"+ + "\2\2\u0689\u0687\3\2\2\2\u0689\u068a\3\2\2\2\u068a[\3\2\2\2\u068b\u068d"+ + "\5|?\2\u068c\u068e\5^\60\2\u068d\u068c\3\2\2\2\u068e\u068f\3\2\2\2\u068f"+ + "\u068d\3\2\2\2\u068f\u0690\3\2\2\2\u0690]\3\2\2\2\u0691\u0693\5b\62\2"+ + "\u0692\u0694\5t;\2\u0693\u0692\3\2\2\2\u0693\u0694\3\2\2\2\u0694\u0695"+ + "\3\2\2\2\u0695\u0696\5R*\2\u0696\u06ad\3\2\2\2\u0697\u069b\5d\63\2\u0698"+ + "\u069a\5\u008eH\2\u0699\u0698\3\2\2\2\u069a\u069d\3\2\2\2\u069b\u0699"+ + "\3\2\2\2\u069b\u069c\3\2\2\2\u069c\u069f\3\2\2\2\u069d\u069b\3\2\2\2\u069e"+ + "\u06a0\5t;\2\u069f\u069e\3\2\2\2\u069f\u06a0\3\2\2\2\u06a0\u06a2\3\2\2"+ + "\2\u06a1\u06a3\5~@\2\u06a2\u06a1\3\2\2\2\u06a2\u06a3\3\2\2\2\u06a3\u06a5"+ + "\3\2\2\2\u06a4\u06a6\5v<\2\u06a5\u06a4\3\2\2\2\u06a5\u06a6\3\2\2\2\u06a6"+ + "\u06a8\3\2\2\2\u06a7\u06a9\5\u00fe\u0080\2\u06a8\u06a7\3\2\2\2\u06a8\u06a9"+ + "\3\2\2\2\u06a9\u06aa\3\2\2\2\u06aa\u06ab\5R*\2\u06ab\u06ad\3\2\2\2\u06ac"+ + "\u0691\3\2\2\2\u06ac\u0697\3\2\2\2\u06ad_\3\2\2\2\u06ae\u06b0\5b\62\2"+ + "\u06af\u06b1\5|?\2\u06b0\u06af\3\2\2\2\u06b0\u06b1\3\2\2\2\u06b1\u06b5"+ + "\3\2\2\2\u06b2\u06b4\5\u008eH\2\u06b3\u06b2\3\2\2\2\u06b4\u06b7\3\2\2"+ + "\2\u06b5\u06b3\3\2\2\2\u06b5\u06b6\3\2\2\2\u06b6\u06b9\3\2\2\2\u06b7\u06b5"+ + "\3\2\2\2\u06b8\u06ba\5t;\2\u06b9\u06b8\3\2\2\2\u06b9\u06ba\3\2\2\2\u06ba"+ + "\u06bc\3\2\2\2\u06bb\u06bd\5~@\2\u06bc\u06bb\3\2\2\2\u06bc\u06bd\3\2\2"+ + "\2\u06bd\u06bf\3\2\2\2\u06be\u06c0\5v<\2\u06bf\u06be\3\2\2\2\u06bf\u06c0"+ + "\3\2\2\2\u06c0\u06c2\3\2\2\2\u06c1\u06c3\5\u00fe\u0080\2\u06c2\u06c1\3"+ + "\2\2\2\u06c2\u06c3\3\2\2\2\u06c3\u06db\3\2\2\2\u06c4\u06c6\5d\63\2\u06c5"+ + "\u06c7\5|?\2\u06c6\u06c5\3\2\2\2\u06c6\u06c7\3\2\2\2\u06c7\u06cb\3\2\2"+ + "\2\u06c8\u06ca\5\u008eH\2\u06c9\u06c8\3\2\2\2\u06ca\u06cd\3\2\2\2\u06cb"+ + "\u06c9\3\2\2\2\u06cb\u06cc\3\2\2\2\u06cc\u06cf\3\2\2\2\u06cd\u06cb\3\2"+ + "\2\2\u06ce\u06d0\5t;\2\u06cf\u06ce\3\2\2\2\u06cf\u06d0\3\2\2\2\u06d0\u06d2"+ + "\3\2\2\2\u06d1\u06d3\5~@\2\u06d2\u06d1\3\2\2\2\u06d2\u06d3\3\2\2\2\u06d3"+ + "\u06d5\3\2\2\2\u06d4\u06d6\5v<\2\u06d5\u06d4\3\2\2\2\u06d5\u06d6\3\2\2"+ + "\2\u06d6\u06d8\3\2\2\2\u06d7\u06d9\5\u00fe\u0080\2\u06d8\u06d7\3\2\2\2"+ + "\u06d8\u06d9\3\2\2\2\u06d9\u06db\3\2\2\2\u06da\u06ae\3\2\2\2\u06da\u06c4"+ + "\3\2\2\2\u06dba\3\2\2\2\u06dc\u06dd\7\u00cf\2\2\u06dd\u06de\7\u00f2\2"+ + "\2\u06de\u06e0\7\3\2\2\u06df\u06e1\5\u0090I\2\u06e0\u06df\3\2\2\2\u06e0"+ + "\u06e1\3\2\2\2\u06e1\u06e2\3\2\2\2\u06e2\u06e3\5\u00caf\2\u06e3\u06e4"+ + "\7\4\2\2\u06e4\u06f0\3\2\2\2\u06e5\u06e7\7\u008e\2\2\u06e6\u06e8\5\u0090"+ + "I\2\u06e7\u06e6\3\2\2\2\u06e7\u06e8\3\2\2\2\u06e8\u06e9\3\2\2\2\u06e9"+ + "\u06f0\5\u00caf\2\u06ea\u06ec\7\u00bb\2\2\u06eb\u06ed\5\u0090I\2\u06ec"+ + "\u06eb\3\2\2\2\u06ec\u06ed\3\2\2\2\u06ed\u06ee\3\2\2\2\u06ee\u06f0\5\u00ca"+ + "f\2\u06ef\u06dc\3\2\2\2\u06ef\u06e5\3\2\2\2\u06ef\u06ea\3\2\2\2\u06f0"+ + "\u06f2\3\2\2\2\u06f1\u06f3\5\u00b2Z\2\u06f2\u06f1\3\2\2\2\u06f2\u06f3"+ + "\3\2\2\2\u06f3\u06f6\3\2\2\2\u06f4\u06f5\7\u00b9\2\2\u06f5\u06f7\7\u0125"+ + "\2\2\u06f6\u06f4\3\2\2\2\u06f6\u06f7\3\2\2\2\u06f7\u06f8\3\2\2\2\u06f8"+ + "\u06f9\7\u0103\2\2\u06f9\u0706\7\u0125\2\2\u06fa\u0704\7\24\2\2\u06fb"+ + "\u0705\5\u00a0Q\2\u06fc\u0705\5\u00f4{\2\u06fd\u0700\7\3\2\2\u06fe\u0701"+ + "\5\u00a0Q\2\u06ff\u0701\5\u00f4{\2\u0700\u06fe\3\2\2\2\u0700\u06ff\3\2"+ + "\2\2\u0701\u0702\3\2\2\2\u0702\u0703\7\4\2\2\u0703\u0705\3\2\2\2\u0704"+ + "\u06fb\3\2\2\2\u0704\u06fc\3\2\2\2\u0704\u06fd\3\2\2\2\u0705\u0707\3\2"+ + "\2\2\u0706\u06fa\3\2\2\2\u0706\u0707\3\2\2\2\u0707\u0709\3\2\2\2\u0708"+ + "\u070a\5\u00b2Z\2\u0709\u0708\3\2\2\2\u0709\u070a\3\2\2\2\u070a\u070d"+ + "\3\2\2\2\u070b\u070c\7\u00b8\2\2\u070c\u070e\7\u0125\2\2\u070d\u070b\3"+ + "\2\2\2\u070d\u070e\3\2\2\2\u070ec\3\2\2\2\u070f\u0713\7\u00cf\2\2\u0710"+ + "\u0712\5x=\2\u0711\u0710\3\2\2\2\u0712\u0715\3\2\2\2\u0713\u0711\3\2\2"+ + "\2\u0713\u0714\3\2\2\2\u0714\u0717\3\2\2\2\u0715\u0713\3\2\2\2\u0716\u0718"+ + "\5\u0090I\2\u0717\u0716\3\2\2\2\u0717\u0718\3\2\2\2\u0718\u0719\3\2\2"+ + "\2\u0719\u071a\5\u00be`\2\u071ae\3\2\2\2\u071b\u071c\7\u00d5\2\2\u071c"+ + "\u071d\5p9\2\u071dg\3\2\2\2\u071e\u071f\7\u0107\2\2\u071f\u0722\7\u008f"+ + "\2\2\u0720\u0721\7\17\2\2\u0721\u0723\5\u00ccg\2\u0722\u0720\3\2\2\2\u0722"+ + "\u0723\3\2\2\2\u0723\u0724\3\2\2\2\u0724\u0725\7\u00eb\2\2\u0725\u0726"+ + "\5l\67\2\u0726i\3\2\2\2\u0727\u0728\7\u0107\2\2\u0728\u0729\7\u0098\2"+ + "\2\u0729\u072c\7\u008f\2\2\u072a\u072b\7\17\2\2\u072b\u072d\5\u00ccg\2"+ + "\u072c\u072a\3\2\2\2\u072c\u072d\3\2\2\2\u072d\u072e\3\2\2\2\u072e\u072f"+ + "\7\u00eb\2\2\u072f\u0730\5n8\2\u0730k\3\2\2\2\u0731\u0739\7A\2\2\u0732"+ + "\u0733\7\u0100\2\2\u0733\u0734\7\u00d5\2\2\u0734\u0739\7\u0117\2\2\u0735"+ + "\u0736\7\u0100\2\2\u0736\u0737\7\u00d5\2\2\u0737\u0739\5p9\2\u0738\u0731"+ + "\3\2\2\2\u0738\u0732\3\2\2\2\u0738\u0735\3\2\2\2\u0739m\3\2\2\2\u073a"+ + "\u073b\7v\2\2\u073b\u074d\7\u0117\2\2\u073c\u073d\7v\2\2\u073d\u073e\7"+ + "\3\2\2\u073e\u073f\5\u00b4[\2\u073f\u0740\7\4\2\2\u0740\u0741\7\u0104"+ + "\2\2\u0741\u0742\7\3\2\2\u0742\u0747\5\u00c8e\2\u0743\u0744\7\u0122\2"+ + "\2\u0744\u0746\5\u00c8e\2\u0745\u0743\3\2\2\2\u0746\u0749\3\2\2\2\u0747"+ + "\u0745\3\2\2\2\u0747\u0748\3\2\2\2\u0748\u074a\3\2\2\2\u0749\u0747\3\2"+ + "\2\2\u074a\u074b\7\4\2\2\u074b\u074d\3\2\2\2\u074c\u073a\3\2\2\2\u074c"+ + "\u073c\3\2\2\2\u074do\3\2\2\2\u074e\u0753\5r:\2\u074f\u0750\7\u0122\2"+ + "\2\u0750\u0752\5r:\2\u0751\u074f\3\2\2\2\u0752\u0755\3\2\2\2\u0753\u0751"+ + "\3\2\2\2\u0753\u0754\3\2\2\2\u0754q\3\2\2\2\u0755\u0753\3\2\2\2\u0756"+ + "\u0757\5\u00b6\\\2\u0757\u0758\7\u010d\2\2\u0758\u0759\5\u00c8e\2\u0759"+ + "s\3\2\2\2\u075a\u075b\7\u0108\2\2\u075b\u075c\5\u00ccg\2\u075cu\3\2\2"+ + "\2\u075d\u075e\7k\2\2\u075e\u075f\5\u00ccg\2\u075fw\3\2\2\2\u0760\u0761"+ + "\7\5\2\2\u0761\u0768\5z>\2\u0762\u0764\7\u0122\2\2\u0763\u0762\3\2\2\2"+ + "\u0763\u0764\3\2\2\2\u0764\u0765\3\2\2\2\u0765\u0767\5z>\2\u0766\u0763"+ + "\3\2\2\2\u0767\u076a\3\2\2\2\u0768\u0766\3\2\2\2\u0768\u0769\3\2\2\2\u0769"+ + "\u076b\3\2\2\2\u076a\u0768\3\2\2\2\u076b\u076c\7\6\2\2\u076cy\3\2\2\2"+ + "\u076d\u077b\5\u0112\u008a\2\u076e\u076f\5\u0112\u008a\2\u076f\u0770\7"+ + "\3\2\2\u0770\u0775\5\u00d2j\2\u0771\u0772\7\u0122\2\2\u0772\u0774\5\u00d2"+ + "j\2\u0773\u0771\3\2\2\2\u0774\u0777\3\2\2\2\u0775\u0773\3\2\2\2\u0775"+ + "\u0776\3\2\2\2\u0776\u0778\3\2\2\2\u0777\u0775\3\2\2\2\u0778\u0779\7\4"+ + "\2\2\u0779\u077b\3\2\2\2\u077a\u076d\3\2\2\2\u077a\u076e\3\2\2\2\u077b"+ + "{\3\2\2\2\u077c\u077d\7c\2\2\u077d\u0782\5\u0092J\2\u077e\u077f\7\u0122"+ + "\2\2\u077f\u0781\5\u0092J\2\u0780\u077e\3\2\2\2\u0781\u0784\3\2\2\2\u0782"+ + "\u0780\3\2\2\2\u0782\u0783\3\2\2\2\u0783\u0788\3\2\2\2\u0784\u0782\3\2"+ + "\2\2\u0785\u0787\5\u008eH\2\u0786\u0785\3\2\2\2\u0787\u078a\3\2\2\2\u0788"+ + "\u0786\3\2\2\2\u0788\u0789\3\2\2\2\u0789\u078c\3\2\2\2\u078a\u0788\3\2"+ + "\2\2\u078b\u078d\5\u0088E\2\u078c\u078b\3\2\2\2\u078c\u078d\3\2\2\2\u078d"+ + "}\3\2\2\2\u078e\u078f\7i\2\2\u078f\u0790\7\34\2\2\u0790\u0795\5\u0080"+ + "A\2\u0791\u0792\7\u0122\2\2\u0792\u0794\5\u0080A\2\u0793\u0791\3\2\2\2"+ + "\u0794\u0797\3\2\2\2\u0795\u0793\3\2\2\2\u0795\u0796\3\2\2\2\u0796\u07b6"+ + "\3\2\2\2\u0797\u0795\3\2\2\2\u0798\u0799\7i\2\2\u0799\u079a\7\34\2\2\u079a"+ + "\u079f\5\u00c8e\2\u079b\u079c\7\u0122\2\2\u079c\u079e\5\u00c8e\2\u079d"+ + "\u079b\3\2\2\2\u079e\u07a1\3\2\2\2\u079f\u079d\3\2\2\2\u079f\u07a0\3\2"+ + "\2\2\u07a0\u07b3\3\2\2\2\u07a1\u079f\3\2\2\2\u07a2\u07a3\7\u010a\2\2\u07a3"+ + "\u07b4\7\u00ca\2\2\u07a4\u07a5\7\u010a\2\2\u07a5\u07b4\7\65\2\2\u07a6"+ + "\u07a7\7j\2\2\u07a7\u07a8\7\u00d7\2\2\u07a8\u07a9\7\3\2\2\u07a9\u07ae"+ + "\5\u0086D\2\u07aa\u07ab\7\u0122\2\2\u07ab\u07ad\5\u0086D\2\u07ac\u07aa"+ + "\3\2\2\2\u07ad\u07b0\3\2\2\2\u07ae\u07ac\3\2\2\2\u07ae\u07af\3\2\2\2\u07af"+ + "\u07b1\3\2\2\2\u07b0\u07ae\3\2\2\2\u07b1\u07b2\7\4\2\2\u07b2\u07b4\3\2"+ + "\2\2\u07b3\u07a2\3\2\2\2\u07b3\u07a4\3\2\2\2\u07b3\u07a6\3\2\2\2\u07b3"+ + "\u07b4\3\2\2\2\u07b4\u07b6\3\2\2\2\u07b5\u078e\3\2\2\2\u07b5\u0798\3\2"+ + "\2\2\u07b6\177\3\2\2\2\u07b7\u07ba\5\u0082B\2\u07b8\u07ba\5\u00c8e\2\u07b9"+ + "\u07b7\3\2\2\2\u07b9\u07b8\3\2\2\2\u07ba\u0081\3\2\2\2\u07bb\u07bc\t\25"+ + "\2\2\u07bc\u07bd\7\3\2\2\u07bd\u07c2\5\u0086D\2\u07be\u07bf\7\u0122\2"+ + "\2\u07bf\u07c1\5\u0086D\2\u07c0\u07be\3\2\2\2\u07c1\u07c4\3\2\2\2\u07c2"+ + "\u07c0\3\2\2\2\u07c2\u07c3\3\2\2\2\u07c3\u07c5\3\2\2\2\u07c4\u07c2\3\2"+ + "\2\2\u07c5\u07c6\7\4\2\2\u07c6\u07d5\3\2\2\2\u07c7\u07c8\7j\2\2\u07c8"+ + "\u07c9\7\u00d7\2\2\u07c9\u07ca\7\3\2\2\u07ca\u07cf\5\u0084C\2\u07cb\u07cc"+ + "\7\u0122\2\2\u07cc\u07ce\5\u0084C\2\u07cd\u07cb\3\2\2\2\u07ce\u07d1\3"+ + "\2\2\2\u07cf\u07cd\3\2\2\2\u07cf\u07d0\3\2\2\2\u07d0\u07d2\3\2\2\2\u07d1"+ + "\u07cf\3\2\2\2\u07d2\u07d3\7\4\2\2\u07d3\u07d5\3\2\2\2\u07d4\u07bb\3\2"+ + "\2\2\u07d4\u07c7\3\2\2\2\u07d5\u0083\3\2\2\2\u07d6\u07d9\5\u0082B\2\u07d7"+ + "\u07d9\5\u0086D\2\u07d8\u07d6\3\2\2\2\u07d8\u07d7\3\2\2\2\u07d9\u0085"+ + "\3\2\2\2\u07da\u07e3\7\3\2\2\u07db\u07e0\5\u00c8e\2\u07dc\u07dd\7\u0122"+ + "\2\2\u07dd\u07df\5\u00c8e\2\u07de\u07dc\3\2\2\2\u07df\u07e2\3\2\2\2\u07e0"+ + "\u07de\3\2\2\2\u07e0\u07e1\3\2\2\2\u07e1\u07e4\3\2\2\2\u07e2\u07e0\3\2"+ + "\2\2\u07e3\u07db\3\2\2\2\u07e3\u07e4\3\2\2\2\u07e4\u07e5\3\2\2\2\u07e5"+ + "\u07e8\7\4\2\2\u07e6\u07e8\5\u00c8e\2\u07e7\u07da\3\2\2\2\u07e7\u07e6"+ + "\3\2\2\2\u07e8\u0087\3\2\2\2\u07e9\u07ea\7\u00ae\2\2\u07ea\u07eb\7\3\2"+ + "\2\u07eb\u07ec\5\u00be`\2\u07ec\u07ed\7_\2\2\u07ed\u07ee\5\u008aF\2\u07ee"+ + "\u07ef\7p\2\2\u07ef\u07f0\7\3\2\2\u07f0\u07f5\5\u008cG\2\u07f1\u07f2\7"+ + "\u0122\2\2\u07f2\u07f4\5\u008cG\2\u07f3\u07f1\3\2\2\2\u07f4\u07f7\3\2"+ + "\2\2\u07f5\u07f3\3\2\2\2\u07f5\u07f6\3\2\2\2\u07f6\u07f8\3\2\2\2\u07f7"+ + "\u07f5\3\2\2\2\u07f8\u07f9\7\4\2\2\u07f9\u07fa\7\4\2\2\u07fa\u0089\3\2"+ + "\2\2\u07fb\u0808\5\u0112\u008a\2\u07fc\u07fd\7\3\2\2\u07fd\u0802\5\u0112"+ + "\u008a\2\u07fe\u07ff\7\u0122\2\2\u07ff\u0801\5\u0112\u008a\2\u0800\u07fe"+ + "\3\2\2\2\u0801\u0804\3\2\2\2\u0802\u0800\3\2\2\2\u0802\u0803\3\2\2\2\u0803"+ + "\u0805\3\2\2\2\u0804\u0802\3\2\2\2\u0805\u0806\7\4\2\2\u0806\u0808\3\2"+ + "\2\2\u0807\u07fb\3\2\2\2\u0807\u07fc\3\2\2\2\u0808\u008b\3\2\2\2\u0809"+ + "\u080e\5\u00c8e\2\u080a\u080c\7\24\2\2\u080b\u080a\3\2\2\2\u080b\u080c"+ + "\3\2\2\2\u080c\u080d\3\2\2\2\u080d\u080f\5\u0112\u008a\2\u080e\u080b\3"+ + "\2\2\2\u080e\u080f\3\2\2\2\u080f\u008d\3\2\2\2\u0810\u0811\7\177\2\2\u0811"+ + "\u0813\7\u0105\2\2\u0812\u0814\7\u00a4\2\2\u0813\u0812\3\2\2\2\u0813\u0814"+ + "\3\2\2\2\u0814\u0815\3\2\2\2\u0815\u0816\5\u010c\u0087\2\u0816\u081f\7"+ + "\3\2\2\u0817\u081c\5\u00c8e\2\u0818\u0819\7\u0122\2\2\u0819\u081b\5\u00c8"+ + "e\2\u081a\u0818\3\2\2\2\u081b\u081e\3\2\2\2\u081c\u081a\3\2\2\2\u081c"+ + "\u081d\3\2\2\2\u081d\u0820\3\2\2\2\u081e\u081c\3\2\2\2\u081f\u0817\3\2"+ + "\2\2\u081f\u0820\3\2\2\2\u0820\u0821\3\2\2\2\u0821\u0822\7\4\2\2\u0822"+ + "\u082e\5\u0112\u008a\2\u0823\u0825\7\24\2\2\u0824\u0823\3\2\2\2\u0824"+ + "\u0825\3\2\2\2\u0825\u0826\3\2\2\2\u0826\u082b\5\u0112\u008a\2\u0827\u0828"+ + "\7\u0122\2\2\u0828\u082a\5\u0112\u008a\2\u0829\u0827\3\2\2\2\u082a\u082d"+ + "\3\2\2\2\u082b\u0829\3\2\2\2\u082b\u082c\3\2\2\2\u082c\u082f\3\2\2\2\u082d"+ + "\u082b\3\2\2\2\u082e\u0824\3\2\2\2\u082e\u082f\3\2\2\2\u082f\u008f\3\2"+ + "\2\2\u0830\u0831\t\26\2\2\u0831\u0091\3\2\2\2\u0832\u0834\7\177\2\2\u0833"+ + "\u0832\3\2\2\2\u0833\u0834\3\2\2\2\u0834\u0835\3\2\2\2\u0835\u0839\5\u00aa"+ + "V\2\u0836\u0838\5\u0094K\2\u0837\u0836\3\2\2\2\u0838\u083b\3\2\2\2\u0839"+ + "\u0837\3\2\2\2\u0839\u083a\3\2\2\2\u083a\u0093\3\2\2\2\u083b\u0839\3\2"+ + "\2\2\u083c\u083d\5\u0096L\2\u083d\u083f\7|\2\2\u083e\u0840\7\177\2\2\u083f"+ + "\u083e\3\2\2\2\u083f\u0840\3\2\2\2\u0840\u0841\3\2\2\2\u0841\u0843\5\u00aa"+ + "V\2\u0842\u0844\5\u0098M\2\u0843\u0842\3\2\2\2\u0843\u0844\3\2\2\2\u0844"+ + "\u084e\3\2\2\2\u0845\u0846\7\u0096\2\2\u0846\u0847\5\u0096L\2\u0847\u0849"+ + "\7|\2\2\u0848\u084a\7\177\2\2\u0849\u0848\3\2\2\2\u0849\u084a\3\2\2\2"+ + "\u084a\u084b\3\2\2\2\u084b\u084c\5\u00aaV\2\u084c\u084e\3\2\2\2\u084d"+ + "\u083c\3\2\2\2\u084d\u0845\3\2\2\2\u084e\u0095\3\2\2\2\u084f\u0851\7s"+ + "\2\2\u0850\u084f\3\2\2\2\u0850\u0851\3\2\2"; + private static final String _serializedATNSegment1 = + "\2\u0851\u0868\3\2\2\2\u0852\u0868\7\64\2\2\u0853\u0855\7\u0082\2\2\u0854"+ + "\u0856\7\u00a4\2\2\u0855\u0854\3\2\2\2\u0855\u0856\3\2\2\2\u0856\u0868"+ + "\3\2\2\2\u0857\u0859\7\u0082\2\2\u0858\u0857\3\2\2\2\u0858\u0859\3\2\2"+ + "\2\u0859\u085a\3\2\2\2\u085a\u0868\7\u00d0\2\2\u085b\u085d\7\u00c5\2\2"+ + "\u085c\u085e\7\u00a4\2\2\u085d\u085c\3\2\2\2\u085d\u085e\3\2\2\2\u085e"+ + "\u0868\3\2\2\2\u085f\u0861\7d\2\2\u0860\u0862\7\u00a4\2\2\u0861\u0860"+ + "\3\2\2\2\u0861\u0862\3\2\2\2\u0862\u0868\3\2\2\2\u0863\u0865\7\u0082\2"+ + "\2\u0864\u0863\3\2\2\2\u0864\u0865\3\2\2\2\u0865\u0866\3\2\2\2\u0866\u0868"+ + "\7\20\2\2\u0867\u0850\3\2\2\2\u0867\u0852\3\2\2\2\u0867\u0853\3\2\2\2"+ + "\u0867\u0858\3\2\2\2\u0867\u085b\3\2\2\2\u0867\u085f\3\2\2\2\u0867\u0864"+ + "\3\2\2\2\u0868\u0097\3\2\2\2\u0869\u086a\7\u009d\2\2\u086a\u086e\5\u00cc"+ + "g\2\u086b\u086c\7\u0103\2\2\u086c\u086e\5\u009eP\2\u086d\u0869\3\2\2\2"+ + "\u086d\u086b\3\2\2\2\u086e\u0099\3\2\2\2\u086f\u0870\7\u00e7\2\2\u0870"+ + "\u0872\7\3\2\2\u0871\u0873\5\u009cO\2\u0872\u0871\3\2\2\2\u0872\u0873"+ + "\3\2\2\2\u0873\u0874\3\2\2\2\u0874\u0875\7\4\2\2\u0875\u009b\3\2\2\2\u0876"+ + "\u0878\7\u0116\2\2\u0877\u0876\3\2\2\2\u0877\u0878\3\2\2\2\u0878\u0879"+ + "\3\2\2\2\u0879\u087a\t\27\2\2\u087a\u088f\7\u00ad\2\2\u087b\u087c\5\u00c8"+ + "e\2\u087c\u087d\7\u00cc\2\2\u087d\u088f\3\2\2\2\u087e\u087f\7\32\2\2\u087f"+ + "\u0880\7\u0129\2\2\u0880\u0881\7\u00a3\2\2\u0881\u0882\7\u009b\2\2\u0882"+ + "\u088b\7\u0129\2\2\u0883\u0889\7\u009d\2\2\u0884\u088a\5\u0112\u008a\2"+ + "\u0885\u0886\5\u010c\u0087\2\u0886\u0887\7\3\2\2\u0887\u0888\7\4\2\2\u0888"+ + "\u088a\3\2\2\2\u0889\u0884\3\2\2\2\u0889\u0885\3\2\2\2\u088a\u088c\3\2"+ + "\2\2\u088b\u0883\3\2\2\2\u088b\u088c\3\2\2\2\u088c\u088f\3\2\2\2\u088d"+ + "\u088f\5\u00c8e\2\u088e\u0877\3\2\2\2\u088e\u087b\3\2\2\2\u088e\u087e"+ + "\3\2\2\2\u088e\u088d\3\2\2\2\u088f\u009d\3\2\2\2\u0890\u0891\7\3\2\2\u0891"+ + "\u0892\5\u00a0Q\2\u0892\u0893\7\4\2\2\u0893\u009f\3\2\2\2\u0894\u0899"+ + "\5\u010e\u0088\2\u0895\u0896\7\u0122\2\2\u0896\u0898\5\u010e\u0088\2\u0897"+ + "\u0895\3\2\2\2\u0898\u089b\3\2\2\2\u0899\u0897\3\2\2\2\u0899\u089a\3\2"+ + "\2\2\u089a\u00a1\3\2\2\2\u089b\u0899\3\2\2\2\u089c\u089d\7\3\2\2\u089d"+ + "\u08a2\5\u00a4S\2\u089e\u089f\7\u0122\2\2\u089f\u08a1\5\u00a4S\2\u08a0"+ + "\u089e\3\2\2\2\u08a1\u08a4\3\2\2\2\u08a2\u08a0\3\2\2\2\u08a2\u08a3\3\2"+ + "\2\2\u08a3\u08a5\3\2\2\2\u08a4\u08a2\3\2\2\2\u08a5\u08a6\7\4\2\2\u08a6"+ + "\u00a3\3\2\2\2\u08a7\u08a9\5\u010e\u0088\2\u08a8\u08aa\t\23\2\2\u08a9"+ + "\u08a8\3\2\2\2\u08a9\u08aa\3\2\2\2\u08aa\u00a5\3\2\2\2\u08ab\u08ac\7\3"+ + "\2\2\u08ac\u08b1\5\u00a8U\2\u08ad\u08ae\7\u0122\2\2\u08ae\u08b0\5\u00a8"+ + "U\2\u08af\u08ad\3\2\2\2\u08b0\u08b3\3\2\2\2\u08b1\u08af\3\2\2\2\u08b1"+ + "\u08b2\3\2\2\2\u08b2\u08b4\3\2\2\2\u08b3\u08b1\3\2\2\2\u08b4\u08b5\7\4"+ + "\2\2\u08b5\u00a7\3\2\2\2\u08b6\u08b8\5\u0112\u008a\2\u08b7\u08b9\5\"\22"+ + "\2\u08b8\u08b7\3\2\2\2\u08b8\u08b9\3\2\2\2\u08b9\u00a9\3\2\2\2\u08ba\u08bc"+ + "\5\u00b6\\\2\u08bb\u08bd\5\u009aN\2\u08bc\u08bb\3\2\2\2\u08bc\u08bd\3"+ + "\2\2\2\u08bd\u08be\3\2\2\2\u08be\u08bf\5\u00b0Y\2\u08bf\u08d3\3\2\2\2"+ + "\u08c0\u08c1\7\3\2\2\u08c1\u08c2\5$\23\2\u08c2\u08c4\7\4\2\2\u08c3\u08c5"+ + "\5\u009aN\2\u08c4\u08c3\3\2\2\2\u08c4\u08c5\3\2\2\2\u08c5\u08c6\3\2\2"+ + "\2\u08c6\u08c7\5\u00b0Y\2\u08c7\u08d3\3\2\2\2\u08c8\u08c9\7\3\2\2\u08c9"+ + "\u08ca\5\u0092J\2\u08ca\u08cc\7\4\2\2\u08cb\u08cd\5\u009aN\2\u08cc\u08cb"+ + "\3\2\2\2\u08cc\u08cd\3\2\2\2\u08cd\u08ce\3\2\2\2\u08ce\u08cf\5\u00b0Y"+ + "\2\u08cf\u08d3\3\2\2\2\u08d0\u08d3\5\u00acW\2\u08d1\u08d3\5\u00aeX\2\u08d2"+ + "\u08ba\3\2\2\2\u08d2\u08c0\3\2\2\2\u08d2\u08c8\3\2\2\2\u08d2\u08d0\3\2"+ + "\2\2\u08d2\u08d1\3\2\2\2\u08d3\u00ab\3\2\2\2\u08d4\u08d5\7\u0104\2\2\u08d5"+ + "\u08da\5\u00c8e\2\u08d6\u08d7\7\u0122\2\2\u08d7\u08d9\5\u00c8e\2\u08d8"+ + "\u08d6\3\2\2\2\u08d9\u08dc\3\2\2\2\u08da\u08d8\3\2\2\2\u08da\u08db\3\2"+ + "\2\2\u08db\u08dd\3\2\2\2\u08dc\u08da\3\2\2\2\u08dd\u08de\5\u00b0Y\2\u08de"+ + "\u00ad\3\2\2\2\u08df\u08e0\5\u010a\u0086\2\u08e0\u08e9\7\3\2\2\u08e1\u08e6"+ + "\5\u00c8e\2\u08e2\u08e3\7\u0122\2\2\u08e3\u08e5\5\u00c8e\2\u08e4\u08e2"+ + "\3\2\2\2\u08e5\u08e8\3\2\2\2\u08e6\u08e4\3\2\2\2\u08e6\u08e7\3\2\2\2\u08e7"+ + "\u08ea\3\2\2\2\u08e8\u08e6\3\2\2\2\u08e9\u08e1\3\2\2\2\u08e9\u08ea\3\2"+ + "\2\2\u08ea\u08eb\3\2\2\2\u08eb\u08ec\7\4\2\2\u08ec\u08ed\5\u00b0Y\2\u08ed"+ + "\u00af\3\2\2\2\u08ee\u08f0\7\24\2\2\u08ef\u08ee\3\2\2\2\u08ef\u08f0\3"+ + "\2\2\2\u08f0\u08f1\3\2\2\2\u08f1\u08f3\5\u0114\u008b\2\u08f2\u08f4\5\u009e"+ + "P\2\u08f3\u08f2\3\2\2\2\u08f3\u08f4\3\2\2\2\u08f4\u08f6\3\2\2\2\u08f5"+ + "\u08ef\3\2\2\2\u08f5\u08f6\3\2\2\2\u08f6\u00b1\3\2\2\2\u08f7\u08f8\7\u00cb"+ + "\2\2\u08f8\u08f9\7a\2\2\u08f9\u08fa\7\u00d2\2\2\u08fa\u08fe\7\u0125\2"+ + "\2\u08fb\u08fc\7\u010a\2\2\u08fc\u08fd\7\u00d3\2\2\u08fd\u08ff\5<\37\2"+ + "\u08fe\u08fb\3\2\2\2\u08fe\u08ff\3\2\2\2\u08ff\u0929\3\2\2\2\u0900\u0901"+ + "\7\u00cb\2\2\u0901\u0902\7a\2\2\u0902\u090c\7B\2\2\u0903\u0904\7Z\2\2"+ + "\u0904\u0905\7\u00ea\2\2\u0905\u0906\7\34\2\2\u0906\u090a\7\u0125\2\2"+ + "\u0907\u0908\7O\2\2\u0908\u0909\7\34\2\2\u0909\u090b\7\u0125\2\2\u090a"+ + "\u0907\3\2\2\2\u090a\u090b\3\2\2\2\u090b\u090d\3\2\2\2\u090c\u0903\3\2"+ + "\2\2\u090c\u090d\3\2\2\2\u090d\u0913\3\2\2\2\u090e\u090f\7(\2\2\u090f"+ + "\u0910\7{\2\2\u0910\u0911\7\u00ea\2\2\u0911\u0912\7\34\2\2\u0912\u0914"+ + "\7\u0125\2\2\u0913\u090e\3\2\2\2\u0913\u0914\3\2\2\2\u0914\u091a\3\2\2"+ + "\2\u0915\u0916\7\u008e\2\2\u0916\u0917\7}\2\2\u0917\u0918\7\u00ea\2\2"+ + "\u0918\u0919\7\34\2\2\u0919\u091b\7\u0125\2\2\u091a\u0915\3\2\2\2\u091a"+ + "\u091b\3\2\2\2\u091b\u0920\3\2\2\2\u091c\u091d\7\u0085\2\2\u091d\u091e"+ + "\7\u00ea\2\2\u091e\u091f\7\34\2\2\u091f\u0921\7\u0125\2\2\u0920\u091c"+ + "\3\2\2\2\u0920\u0921\3\2\2\2\u0921\u0926\3\2\2\2\u0922\u0923\7\u0099\2"+ + "\2\u0923\u0924\7@\2\2\u0924\u0925\7\24\2\2\u0925\u0927\7\u0125\2\2\u0926"+ + "\u0922\3\2\2\2\u0926\u0927\3\2\2\2\u0927\u0929\3\2\2\2\u0928\u08f7\3\2"+ + "\2\2\u0928\u0900\3\2\2\2\u0929\u00b3\3\2\2\2\u092a\u092f\5\u00b6\\\2\u092b"+ + "\u092c\7\u0122\2\2\u092c\u092e\5\u00b6\\\2\u092d\u092b\3\2\2\2\u092e\u0931"+ + "\3\2\2\2\u092f\u092d\3\2\2\2\u092f\u0930\3\2\2\2\u0930\u00b5\3\2\2\2\u0931"+ + "\u092f\3\2\2\2\u0932\u0937\5\u010e\u0088\2\u0933\u0934\7\u0121\2\2\u0934"+ + "\u0936\5\u010e\u0088\2\u0935\u0933\3\2\2\2\u0936\u0939\3\2\2\2\u0937\u0935"+ + "\3\2\2\2\u0937\u0938\3\2\2\2\u0938\u00b7\3\2\2\2\u0939\u0937\3\2\2\2\u093a"+ + "\u093b\5\u010e\u0088\2\u093b\u093c\7\u0121\2\2\u093c\u093e\3\2\2\2\u093d"+ + "\u093a\3\2\2\2\u093d\u093e\3\2\2\2\u093e\u093f\3\2\2\2\u093f\u0940\5\u010e"+ + "\u0088\2\u0940\u00b9\3\2\2\2\u0941\u0942\5\u010e\u0088\2\u0942\u0943\7"+ + "\u0121\2\2\u0943\u0945\3\2\2\2\u0944\u0941\3\2\2\2\u0944\u0945\3\2\2\2"+ + "\u0945\u0946\3\2\2\2\u0946\u0947\5\u010e\u0088\2\u0947\u00bb\3\2\2\2\u0948"+ + "\u0950\5\u00c8e\2\u0949\u094b\7\24\2\2\u094a\u0949\3\2\2\2\u094a\u094b"+ + "\3\2\2\2\u094b\u094e\3\2\2\2\u094c\u094f\5\u010e\u0088\2\u094d\u094f\5"+ + "\u009eP\2\u094e\u094c\3\2\2\2\u094e\u094d\3\2\2\2\u094f\u0951\3\2\2\2"+ + "\u0950\u094a\3\2\2\2\u0950\u0951\3\2\2\2\u0951\u00bd\3\2\2\2\u0952\u0957"+ + "\5\u00bc_\2\u0953\u0954\7\u0122\2\2\u0954\u0956\5\u00bc_\2\u0955\u0953"+ + "\3\2\2\2\u0956\u0959\3\2\2\2\u0957\u0955\3\2\2\2\u0957\u0958\3\2\2\2\u0958"+ + "\u00bf\3\2\2\2\u0959\u0957\3\2\2\2\u095a\u095b\7\3\2\2\u095b\u0960\5\u00c2"+ + "b\2\u095c\u095d\7\u0122\2\2\u095d\u095f\5\u00c2b\2\u095e\u095c\3\2\2\2"+ + "\u095f\u0962\3\2\2\2\u0960\u095e\3\2\2\2\u0960\u0961\3\2\2\2\u0961\u0963"+ + "\3\2\2\2\u0962\u0960\3\2\2\2\u0963\u0964\7\4\2\2\u0964\u00c1\3\2\2\2\u0965"+ + "\u0968\5\u00c4c\2\u0966\u0968\5\u00f6|\2\u0967\u0965\3\2\2\2\u0967\u0966"+ + "\3\2\2\2\u0968\u00c3\3\2\2\2\u0969\u0977\5\u010c\u0087\2\u096a\u096b\5"+ + "\u0112\u008a\2\u096b\u096c\7\3\2\2\u096c\u0971\5\u00c6d\2\u096d\u096e"+ + "\7\u0122\2\2\u096e\u0970\5\u00c6d\2\u096f\u096d\3\2\2\2\u0970\u0973\3"+ + "\2\2\2\u0971\u096f\3\2\2\2\u0971\u0972\3\2\2\2\u0972\u0974\3\2\2\2\u0973"+ + "\u0971\3\2\2\2\u0974\u0975\7\4\2\2\u0975\u0977\3\2\2\2\u0976\u0969\3\2"+ + "\2\2\u0976\u096a\3\2\2\2\u0977\u00c5\3\2\2\2\u0978\u097b\5\u010c\u0087"+ + "\2\u0979\u097b\5\u00d6l\2\u097a\u0978\3\2\2\2\u097a\u0979\3\2\2\2\u097b"+ + "\u00c7\3\2\2\2\u097c\u097d\5\u00ccg\2\u097d\u00c9\3\2\2\2\u097e\u0983"+ + "\5\u00c8e\2\u097f\u0980\7\u0122\2\2\u0980\u0982\5\u00c8e\2\u0981\u097f"+ + "\3\2\2\2\u0982\u0985\3\2\2\2\u0983\u0981\3\2\2\2\u0983\u0984\3\2\2\2\u0984"+ + "\u00cb\3\2\2\2\u0985\u0983\3\2\2\2\u0986\u0987\bg\1\2\u0987\u0988\7\u0098"+ + "\2\2\u0988\u0993\5\u00ccg\7\u0989\u098a\7R\2\2\u098a\u098b\7\3\2\2\u098b"+ + "\u098c\5$\23\2\u098c\u098d\7\4\2\2\u098d\u0993\3\2\2\2\u098e\u0990\5\u00d0"+ + "i\2\u098f\u0991\5\u00ceh\2\u0990\u098f\3\2\2\2\u0990\u0991\3\2\2\2\u0991"+ + "\u0993\3\2\2\2\u0992\u0986\3\2\2\2\u0992\u0989\3\2\2\2\u0992\u098e\3\2"+ + "\2\2\u0993\u099c\3\2\2\2\u0994\u0995\f\4\2\2\u0995\u0996\7\17\2\2\u0996"+ + "\u099b\5\u00ccg\5\u0997\u0998\f\3\2\2\u0998\u0999\7\u00a1\2\2\u0999\u099b"+ + "\5\u00ccg\4\u099a\u0994\3\2\2\2\u099a\u0997\3\2\2\2\u099b\u099e\3\2\2"+ + "\2\u099c\u099a\3\2\2\2\u099c\u099d\3\2\2\2\u099d\u00cd\3\2\2\2\u099e\u099c"+ + "\3\2\2\2\u099f\u09a1\7\u0098\2\2\u09a0\u099f\3\2\2\2\u09a0\u09a1\3\2\2"+ + "\2\u09a1\u09a2\3\2\2\2\u09a2\u09a3\7\30\2\2\u09a3\u09a4\5\u00d0i\2\u09a4"+ + "\u09a5\7\17\2\2\u09a5\u09a6\5\u00d0i\2\u09a6\u09f2\3\2\2\2\u09a7\u09a9"+ + "\7\u0098\2\2\u09a8\u09a7\3\2\2\2\u09a8\u09a9\3\2\2\2\u09a9\u09aa\3\2\2"+ + "\2\u09aa\u09ab\7p\2\2\u09ab\u09ac\7\3\2\2\u09ac\u09b1\5\u00c8e\2\u09ad"+ + "\u09ae\7\u0122\2\2\u09ae\u09b0\5\u00c8e\2\u09af\u09ad\3\2\2\2\u09b0\u09b3"+ + "\3\2\2\2\u09b1\u09af\3\2\2\2\u09b1\u09b2\3\2\2\2\u09b2\u09b4\3\2\2\2\u09b3"+ + "\u09b1\3\2\2\2\u09b4\u09b5\7\4\2\2\u09b5\u09f2\3\2\2\2\u09b6\u09b8\7\u0098"+ + "\2\2\u09b7\u09b6\3\2\2\2\u09b7\u09b8\3\2\2\2\u09b8\u09b9\3\2\2\2\u09b9"+ + "\u09ba\7p\2\2\u09ba\u09bb\7\3\2\2\u09bb\u09bc\5$\23\2\u09bc\u09bd\7\4"+ + "\2\2\u09bd\u09f2\3\2\2\2\u09be\u09c0\7\u0098\2\2\u09bf\u09be\3\2\2\2\u09bf"+ + "\u09c0\3\2\2\2\u09c0\u09c1\3\2\2\2\u09c1\u09c2\7\u00c6\2\2\u09c2\u09f2"+ + "\5\u00d0i\2\u09c3\u09c5\7\u0098\2\2\u09c4\u09c3\3\2\2\2\u09c4\u09c5\3"+ + "\2\2\2\u09c5\u09c6\3\2\2\2\u09c6\u09c7\7\u0083\2\2\u09c7\u09d5\t\30\2"+ + "\2\u09c8\u09c9\7\3\2\2\u09c9\u09d6\7\4\2\2\u09ca\u09cb\7\3\2\2\u09cb\u09d0"+ + "\5\u00c8e\2\u09cc\u09cd\7\u0122\2\2\u09cd\u09cf\5\u00c8e\2\u09ce\u09cc"+ + "\3\2\2\2\u09cf\u09d2\3\2\2\2\u09d0\u09ce\3\2\2\2\u09d0\u09d1\3\2\2\2\u09d1"+ + "\u09d3\3\2\2\2\u09d2\u09d0\3\2\2\2\u09d3\u09d4\7\4\2\2\u09d4\u09d6\3\2"+ + "\2\2\u09d5\u09c8\3\2\2\2\u09d5\u09ca\3\2\2\2\u09d6\u09f2\3\2\2\2\u09d7"+ + "\u09d9\7\u0098\2\2\u09d8\u09d7\3\2\2\2\u09d8\u09d9\3\2\2\2\u09d9\u09da"+ + "\3\2\2\2\u09da\u09db\7\u0083\2\2\u09db\u09de\5\u00d0i\2\u09dc\u09dd\7"+ + "N\2\2\u09dd\u09df\7\u0125\2\2\u09de\u09dc\3\2\2\2\u09de\u09df\3\2\2\2"+ + "\u09df\u09f2\3\2\2\2\u09e0\u09e2\7z\2\2\u09e1\u09e3\7\u0098\2\2\u09e2"+ + "\u09e1\3\2\2\2\u09e2\u09e3\3\2\2\2\u09e3\u09e4\3\2\2\2\u09e4\u09f2\7\u0099"+ + "\2\2\u09e5\u09e7\7z\2\2\u09e6\u09e8\7\u0098\2\2\u09e7\u09e6\3\2\2\2\u09e7"+ + "\u09e8\3\2\2\2\u09e8\u09e9\3\2\2\2\u09e9\u09f2\t\31\2\2\u09ea\u09ec\7"+ + "z\2\2\u09eb\u09ed\7\u0098\2\2\u09ec\u09eb\3\2\2\2\u09ec\u09ed\3\2\2\2"+ + "\u09ed\u09ee\3\2\2\2\u09ee\u09ef\7H\2\2\u09ef\u09f0\7c\2\2\u09f0\u09f2"+ + "\5\u00d0i\2\u09f1\u09a0\3\2\2\2\u09f1\u09a8\3\2\2\2\u09f1\u09b7\3\2\2"+ + "\2\u09f1\u09bf\3\2\2\2\u09f1\u09c4\3\2\2\2\u09f1\u09d8\3\2\2\2\u09f1\u09e0"+ + "\3\2\2\2\u09f1\u09e5\3\2\2\2\u09f1\u09ea\3\2\2\2\u09f2\u00cf\3\2\2\2\u09f3"+ + "\u09f4\bi\1\2\u09f4\u09f8\5\u00d2j\2\u09f5\u09f6\t\32\2\2\u09f6\u09f8"+ + "\5\u00d0i\t\u09f7\u09f3\3\2\2\2\u09f7\u09f5\3\2\2\2\u09f8\u0a0e\3\2\2"+ + "\2\u09f9\u09fa\f\b\2\2\u09fa\u09fb\t\33\2\2\u09fb\u0a0d\5\u00d0i\t\u09fc"+ + "\u09fd\f\7\2\2\u09fd\u09fe\t\34\2\2\u09fe\u0a0d\5\u00d0i\b\u09ff\u0a00"+ + "\f\6\2\2\u0a00\u0a01\7\u011b\2\2\u0a01\u0a0d\5\u00d0i\7\u0a02\u0a03\f"+ + "\5\2\2\u0a03\u0a04\7\u011e\2\2\u0a04\u0a0d\5\u00d0i\6\u0a05\u0a06\f\4"+ + "\2\2\u0a06\u0a07\7\u011c\2\2\u0a07\u0a0d\5\u00d0i\5\u0a08\u0a09\f\3\2"+ + "\2\u0a09\u0a0a\5\u00d8m\2\u0a0a\u0a0b\5\u00d0i\4\u0a0b\u0a0d\3\2\2\2\u0a0c"+ + "\u09f9\3\2\2\2\u0a0c\u09fc\3\2\2\2\u0a0c\u09ff\3\2\2\2\u0a0c\u0a02\3\2"+ + "\2\2\u0a0c\u0a05\3\2\2\2\u0a0c\u0a08\3\2\2\2\u0a0d\u0a10\3\2\2\2\u0a0e"+ + "\u0a0c\3\2\2\2\u0a0e\u0a0f\3\2\2\2\u0a0f\u00d1\3\2\2\2\u0a10\u0a0e\3\2"+ + "\2\2\u0a11\u0a12\bj\1\2\u0a12\u0ace\t\35\2\2\u0a13\u0a15\7\37\2\2\u0a14"+ + "\u0a16\5\u00fc\177\2\u0a15\u0a14\3\2\2\2\u0a16\u0a17\3\2\2\2\u0a17\u0a15"+ + "\3\2\2\2\u0a17\u0a18\3\2\2\2\u0a18\u0a1b\3\2\2\2\u0a19\u0a1a\7L\2\2\u0a1a"+ + "\u0a1c\5\u00c8e\2\u0a1b\u0a19\3\2\2\2\u0a1b\u0a1c\3\2\2\2\u0a1c\u0a1d"+ + "\3\2\2\2\u0a1d\u0a1e\7M\2\2\u0a1e\u0ace\3\2\2\2\u0a1f\u0a20\7\37\2\2\u0a20"+ + "\u0a22\5\u00c8e\2\u0a21\u0a23\5\u00fc\177\2\u0a22\u0a21\3\2\2\2\u0a23"+ + "\u0a24\3\2\2\2\u0a24\u0a22\3\2\2\2\u0a24\u0a25\3\2\2\2\u0a25\u0a28\3\2"+ + "\2\2\u0a26\u0a27\7L\2\2\u0a27\u0a29\5\u00c8e\2\u0a28\u0a26\3\2\2\2\u0a28"+ + "\u0a29\3\2\2\2\u0a29\u0a2a\3\2\2\2\u0a2a\u0a2b\7M\2\2\u0a2b\u0ace\3\2"+ + "\2\2\u0a2c\u0a2d\t\36\2\2\u0a2d\u0a2e\7\3\2\2\u0a2e\u0a2f\5\u00c8e\2\u0a2f"+ + "\u0a30\7\24\2\2\u0a30\u0a31\5\u00eex\2\u0a31\u0a32\7\4\2\2\u0a32\u0ace"+ + "\3\2\2\2\u0a33\u0a34\7\u00e1\2\2\u0a34\u0a3d\7\3\2\2\u0a35\u0a3a\5\u00bc"+ + "_\2\u0a36\u0a37\7\u0122\2\2\u0a37\u0a39\5\u00bc_\2\u0a38\u0a36\3\2\2\2"+ + "\u0a39\u0a3c\3\2\2\2\u0a3a\u0a38\3\2\2\2\u0a3a\u0a3b\3\2\2\2\u0a3b\u0a3e"+ + "\3\2\2\2\u0a3c\u0a3a\3\2\2\2\u0a3d\u0a35\3\2\2\2\u0a3d\u0a3e\3\2\2\2\u0a3e"+ + "\u0a3f\3\2\2\2\u0a3f\u0ace\7\4\2\2\u0a40\u0a41\7]\2\2\u0a41\u0a42\7\3"+ + "\2\2\u0a42\u0a45\5\u00c8e\2\u0a43\u0a44\7n\2\2\u0a44\u0a46\7\u009a\2\2"+ + "\u0a45\u0a43\3\2\2\2\u0a45\u0a46\3\2\2\2\u0a46\u0a47\3\2\2\2\u0a47\u0a48"+ + "\7\4\2\2\u0a48\u0ace\3\2\2\2\u0a49\u0a4a\7~\2\2\u0a4a\u0a4b\7\3\2\2\u0a4b"+ + "\u0a4e\5\u00c8e\2\u0a4c\u0a4d\7n\2\2\u0a4d\u0a4f\7\u009a\2\2\u0a4e\u0a4c"+ + "\3\2\2\2\u0a4e\u0a4f\3\2\2\2\u0a4f\u0a50\3\2\2\2\u0a50\u0a51\7\4\2\2\u0a51"+ + "\u0ace\3\2\2\2\u0a52\u0a53\7\u00b0\2\2\u0a53\u0a54\7\3\2\2\u0a54\u0a55"+ + "\5\u00d0i\2\u0a55\u0a56\7p\2\2\u0a56\u0a57\5\u00d0i\2\u0a57\u0a58\7\4"+ + "\2\2\u0a58\u0ace\3\2\2\2\u0a59\u0ace\5\u00d6l\2\u0a5a\u0ace\7\u0117\2"+ + "\2\u0a5b\u0a5c\5\u010c\u0087\2\u0a5c\u0a5d\7\u0121\2\2\u0a5d\u0a5e\7\u0117"+ + "\2\2\u0a5e\u0ace\3\2\2\2\u0a5f\u0a60\7\3\2\2\u0a60\u0a63\5\u00bc_\2\u0a61"+ + "\u0a62\7\u0122\2\2\u0a62\u0a64\5\u00bc_\2\u0a63\u0a61\3\2\2\2\u0a64\u0a65"+ + "\3\2\2\2\u0a65\u0a63\3\2\2\2\u0a65\u0a66\3\2\2\2\u0a66\u0a67\3\2\2\2\u0a67"+ + "\u0a68\7\4\2\2\u0a68\u0ace\3\2\2\2\u0a69\u0a6a\7\3\2\2\u0a6a\u0a6b\5$"+ + "\23\2\u0a6b\u0a6c\7\4\2\2\u0a6c\u0ace\3\2\2\2\u0a6d\u0a6e\5\u010a\u0086"+ + "\2\u0a6e\u0a7a\7\3\2\2\u0a6f\u0a71\5\u0090I\2\u0a70\u0a6f\3\2\2\2\u0a70"+ + "\u0a71\3\2\2\2\u0a71\u0a72\3\2\2\2\u0a72\u0a77\5\u00c8e\2\u0a73\u0a74"+ + "\7\u0122\2\2\u0a74\u0a76\5\u00c8e\2\u0a75\u0a73\3\2\2\2\u0a76\u0a79\3"+ + "\2\2\2\u0a77\u0a75\3\2\2\2\u0a77\u0a78\3\2\2\2\u0a78\u0a7b\3\2\2\2\u0a79"+ + "\u0a77\3\2\2\2\u0a7a\u0a70\3\2\2\2\u0a7a\u0a7b\3\2\2\2\u0a7b\u0a7c\3\2"+ + "\2\2\u0a7c\u0a83\7\4\2\2\u0a7d\u0a7e\7[\2\2\u0a7e\u0a7f\7\3\2\2\u0a7f"+ + "\u0a80\7\u0108\2\2\u0a80\u0a81\5\u00ccg\2\u0a81\u0a82\7\4\2\2\u0a82\u0a84"+ + "\3\2\2\2\u0a83\u0a7d\3\2\2\2\u0a83\u0a84\3\2\2\2\u0a84\u0a87\3\2\2\2\u0a85"+ + "\u0a86\t\37\2\2\u0a86\u0a88\7\u009a\2\2\u0a87\u0a85\3\2\2\2\u0a87\u0a88"+ + "\3\2\2\2\u0a88\u0a8b\3\2\2\2\u0a89\u0a8a\7\u00a6\2\2\u0a8a\u0a8c\5\u0102"+ + "\u0082\2\u0a8b\u0a89\3\2\2\2\u0a8b\u0a8c\3\2\2\2\u0a8c\u0ace\3\2\2\2\u0a8d"+ + "\u0a8e\5\u0112\u008a\2\u0a8e\u0a8f\7\7\2\2\u0a8f\u0a90\5\u00c8e\2\u0a90"+ + "\u0ace\3\2\2\2\u0a91\u0a92\7\3\2\2\u0a92\u0a95\5\u0112\u008a\2\u0a93\u0a94"+ + "\7\u0122\2\2\u0a94\u0a96\5\u0112\u008a\2\u0a95\u0a93\3\2\2\2\u0a96\u0a97"+ + "\3\2\2\2\u0a97\u0a95\3\2\2\2\u0a97\u0a98\3\2\2\2\u0a98\u0a99\3\2\2\2\u0a99"+ + "\u0a9a\7\4\2\2\u0a9a\u0a9b\7\7\2\2\u0a9b\u0a9c\5\u00c8e\2\u0a9c\u0ace"+ + "\3\2\2\2\u0a9d\u0ace\5\u0112\u008a\2\u0a9e\u0a9f\7\3\2\2\u0a9f\u0aa0\5"+ + "\u00c8e\2\u0aa0\u0aa1\7\4\2\2\u0aa1\u0ace\3\2\2\2\u0aa2\u0aa3\7W\2\2\u0aa3"+ + "\u0aa4\7\3\2\2\u0aa4\u0aa5\5\u0112\u008a\2\u0aa5\u0aa6\7c\2\2\u0aa6\u0aa7"+ + "\5\u00d0i\2\u0aa7\u0aa8\7\4\2\2\u0aa8\u0ace\3\2\2\2\u0aa9\u0aaa\t \2\2"+ + "\u0aaa\u0aab\7\3\2\2\u0aab\u0aac\5\u00d0i\2\u0aac\u0aad\t!\2\2\u0aad\u0ab0"+ + "\5\u00d0i\2\u0aae\u0aaf\t\"\2\2\u0aaf\u0ab1\5\u00d0i\2\u0ab0\u0aae\3\2"+ + "\2\2\u0ab0\u0ab1\3\2\2\2\u0ab1\u0ab2\3\2\2\2\u0ab2\u0ab3\7\4\2\2\u0ab3"+ + "\u0ace\3\2\2\2\u0ab4\u0ab5\7\u00f3\2\2\u0ab5\u0ab7\7\3\2\2\u0ab6\u0ab8"+ + "\t#\2\2\u0ab7\u0ab6\3\2\2\2\u0ab7\u0ab8\3\2\2\2\u0ab8\u0aba\3\2\2\2\u0ab9"+ + "\u0abb\5\u00d0i\2\u0aba\u0ab9\3\2\2\2\u0aba\u0abb\3\2\2\2\u0abb\u0abc"+ + "\3\2\2\2\u0abc\u0abd\7c\2\2\u0abd\u0abe\5\u00d0i\2\u0abe\u0abf\7\4\2\2"+ + "\u0abf\u0ace\3\2\2\2\u0ac0\u0ac1\7\u00a8\2\2\u0ac1\u0ac2\7\3\2\2\u0ac2"+ + "\u0ac3\5\u00d0i\2\u0ac3\u0ac4\7\u00af\2\2\u0ac4\u0ac5\5\u00d0i\2\u0ac5"+ + "\u0ac6\7c\2\2\u0ac6\u0ac9\5\u00d0i\2\u0ac7\u0ac8\7_\2\2\u0ac8\u0aca\5"+ + "\u00d0i\2\u0ac9\u0ac7\3\2\2\2\u0ac9\u0aca\3\2\2\2\u0aca\u0acb\3\2\2\2"+ + "\u0acb\u0acc\7\4\2\2\u0acc\u0ace\3\2\2\2\u0acd\u0a11\3\2\2\2\u0acd\u0a13"+ + "\3\2\2\2\u0acd\u0a1f\3\2\2\2\u0acd\u0a2c\3\2\2\2\u0acd\u0a33\3\2\2\2\u0acd"+ + "\u0a40\3\2\2\2\u0acd\u0a49\3\2\2\2\u0acd\u0a52\3\2\2\2\u0acd\u0a59\3\2"+ + "\2\2\u0acd\u0a5a\3\2\2\2\u0acd\u0a5b\3\2\2\2\u0acd\u0a5f\3\2\2\2\u0acd"+ + "\u0a69\3\2\2\2\u0acd\u0a6d\3\2\2\2\u0acd\u0a8d\3\2\2\2\u0acd\u0a91\3\2"+ + "\2\2\u0acd\u0a9d\3\2\2\2\u0acd\u0a9e\3\2\2\2\u0acd\u0aa2\3\2\2\2\u0acd"+ + "\u0aa9\3\2\2\2\u0acd\u0ab4\3\2\2\2\u0acd\u0ac0\3\2\2\2\u0ace\u0ad9\3\2"+ + "\2\2\u0acf\u0ad0\f\n\2\2\u0ad0\u0ad1\7\b\2\2\u0ad1\u0ad2\5\u00d0i\2\u0ad2"+ + "\u0ad3\7\t\2\2\u0ad3\u0ad8\3\2\2\2\u0ad4\u0ad5\f\b\2\2\u0ad5\u0ad6\7\u0121"+ + "\2\2\u0ad6\u0ad8\5\u0112\u008a\2\u0ad7\u0acf\3\2\2\2\u0ad7\u0ad4\3\2\2"+ + "\2\u0ad8\u0adb\3\2\2\2\u0ad9\u0ad7\3\2\2\2\u0ad9\u0ada\3\2\2\2\u0ada\u00d3"+ + "\3\2\2\2\u0adb\u0ad9\3\2\2\2\u0adc\u0add\7\u0129\2\2\u0add\u0adf\7\u0122"+ + "\2\2\u0ade\u0adc\3\2\2\2\u0ade\u0adf\3\2\2\2\u0adf\u0ae0\3\2\2\2\u0ae0"+ + "\u0ae6\7\u0129\2\2\u0ae1\u0ae2\7\u0129\2\2\u0ae2\u0ae3\7\u009c\2\2\u0ae3"+ + "\u0ae6\7\u0129\2\2\u0ae4\u0ae6\5\u00ccg\2\u0ae5\u0ade\3\2\2\2\u0ae5\u0ae1"+ + "\3\2\2\2\u0ae5\u0ae4\3\2\2\2\u0ae6\u00d5\3\2\2\2\u0ae7\u0af4\7\u0099\2"+ + "\2\u0ae8\u0af4\5\u00e0q\2\u0ae9\u0aea\5\u0112\u008a\2\u0aea\u0aeb\7\u0125"+ + "\2\2\u0aeb\u0af4\3\2\2\2\u0aec\u0af4\5\u0118\u008d\2\u0aed\u0af4\5\u00de"+ + "p\2\u0aee\u0af0\7\u0125\2\2\u0aef\u0aee\3\2\2\2\u0af0\u0af1\3\2\2\2\u0af1"+ + "\u0aef\3\2\2\2\u0af1\u0af2\3\2\2\2\u0af2\u0af4\3\2\2\2\u0af3\u0ae7\3\2"+ + "\2\2\u0af3\u0ae8\3\2\2\2\u0af3\u0ae9\3\2\2\2\u0af3\u0aec\3\2\2\2\u0af3"+ + "\u0aed\3\2\2\2\u0af3\u0aef\3\2\2\2\u0af4\u00d7\3\2\2\2\u0af5\u0af6\t$"+ + "\2\2\u0af6\u00d9\3\2\2\2\u0af7\u0af8\t%\2\2\u0af8\u00db\3\2\2\2\u0af9"+ + "\u0afa\t&\2\2\u0afa\u00dd\3\2\2\2\u0afb\u0afc\t\'\2\2\u0afc\u00df\3\2"+ + "\2\2\u0afd\u0b00\7x\2\2\u0afe\u0b01\5\u00e2r\2\u0aff\u0b01\5\u00e6t\2"+ + "\u0b00\u0afe\3\2\2\2\u0b00\u0aff\3\2\2\2\u0b00\u0b01\3\2\2\2\u0b01\u00e1"+ + "\3\2\2\2\u0b02\u0b04\5\u00e4s\2\u0b03\u0b05\5\u00e8u\2\u0b04\u0b03\3\2"+ + "\2\2\u0b04\u0b05\3\2\2\2\u0b05\u00e3\3\2\2\2\u0b06\u0b07\5\u00eav\2\u0b07"+ + "\u0b08\5\u0112\u008a\2\u0b08\u0b0a\3\2\2\2\u0b09\u0b06\3\2\2\2\u0b0a\u0b0b"+ + "\3\2\2\2\u0b0b\u0b09\3\2\2\2\u0b0b\u0b0c\3\2\2\2\u0b0c\u00e5\3\2\2\2\u0b0d"+ + "\u0b10\5\u00e8u\2\u0b0e\u0b11\5\u00e4s\2\u0b0f\u0b11\5\u00e8u\2\u0b10"+ + "\u0b0e\3\2\2\2\u0b10\u0b0f\3\2\2\2\u0b10\u0b11\3\2\2\2\u0b11\u00e7\3\2"+ + "\2\2\u0b12\u0b13\5\u00eav\2\u0b13\u0b14\5\u0112\u008a\2\u0b14\u0b15\7"+ + "\u00ed\2\2\u0b15\u0b16\5\u0112\u008a\2\u0b16\u00e9\3\2\2\2\u0b17\u0b19"+ + "\t(\2\2\u0b18\u0b17\3\2\2\2\u0b18\u0b19\3\2\2\2\u0b19\u0b1a\3\2\2\2\u0b1a"+ + "\u0b1b\t)\2\2\u0b1b\u00eb\3\2\2\2\u0b1c\u0b20\7]\2\2\u0b1d\u0b1e\7\13"+ + "\2\2\u0b1e\u0b20\5\u010e\u0088\2\u0b1f\u0b1c\3\2\2\2\u0b1f\u0b1d\3\2\2"+ + "\2\u0b20\u00ed\3\2\2\2\u0b21\u0b22\7\23\2\2\u0b22\u0b23\7\u0111\2\2\u0b23"+ + "\u0b24\5\u00eex\2\u0b24\u0b25\7\u0113\2\2\u0b25\u0b50\3\2\2\2\u0b26\u0b27"+ + "\7\u008e\2\2\u0b27\u0b28\7\u0111\2\2\u0b28\u0b29\5\u00eex\2\u0b29\u0b2a"+ + "\7\u0122\2\2\u0b2a\u0b2b\5\u00eex\2\u0b2b\u0b2c\7\u0113\2\2\u0b2c\u0b50"+ + "\3\2\2\2\u0b2d\u0b34\7\u00e1\2\2\u0b2e\u0b30\7\u0111\2\2\u0b2f\u0b31\5"+ + "\u00f8}\2\u0b30\u0b2f\3\2\2\2\u0b30\u0b31\3\2\2\2\u0b31\u0b32\3\2\2\2"+ + "\u0b32\u0b35\7\u0113\2\2\u0b33\u0b35\7\u010f\2\2\u0b34\u0b2e\3\2\2\2\u0b34"+ + "\u0b33\3\2\2\2\u0b35\u0b50\3\2\2\2\u0b36\u0b37\7x\2\2\u0b37\u0b3a\t*\2"+ + "\2\u0b38\u0b39\7\u00ed\2\2\u0b39\u0b3b\7\u0092\2\2\u0b3a\u0b38\3\2\2\2"+ + "\u0b3a\u0b3b\3\2\2\2\u0b3b\u0b50\3\2\2\2\u0b3c\u0b3d\7x\2\2\u0b3d\u0b40"+ + "\t+\2\2\u0b3e\u0b3f\7\u00ed\2\2\u0b3f\u0b41\t,\2\2\u0b40\u0b3e\3\2\2\2"+ + "\u0b40\u0b41\3\2\2\2\u0b41\u0b50\3\2\2\2\u0b42\u0b4d\5\u0112\u008a\2\u0b43"+ + "\u0b44\7\3\2\2\u0b44\u0b49\7\u0129\2\2\u0b45\u0b46\7\u0122\2\2\u0b46\u0b48"+ + "\7\u0129\2\2\u0b47\u0b45\3\2\2\2\u0b48\u0b4b\3\2\2\2\u0b49\u0b47\3\2\2"+ + "\2\u0b49\u0b4a\3\2\2\2\u0b4a\u0b4c\3\2\2\2\u0b4b\u0b49\3\2\2\2\u0b4c\u0b4e"+ + "\7\4\2\2\u0b4d\u0b43\3\2\2\2\u0b4d\u0b4e\3\2\2\2\u0b4e\u0b50\3\2\2\2\u0b4f"+ + "\u0b21\3\2\2\2\u0b4f\u0b26\3\2\2\2\u0b4f\u0b2d\3\2\2\2\u0b4f\u0b36\3\2"+ + "\2\2\u0b4f\u0b3c\3\2\2\2\u0b4f\u0b42\3\2\2\2\u0b50\u00ef\3\2\2\2\u0b51"+ + "\u0b56\5\u00f2z\2\u0b52\u0b53\7\u0122\2\2\u0b53\u0b55\5\u00f2z\2\u0b54"+ + "\u0b52\3\2\2\2\u0b55\u0b58\3\2\2\2\u0b56\u0b54\3\2\2\2\u0b56\u0b57\3\2"+ + "\2\2\u0b57\u00f1\3\2\2\2\u0b58\u0b56\3\2\2\2\u0b59\u0b5a\5\u00b6\\\2\u0b5a"+ + "\u0b5d\5\u00eex\2\u0b5b\u0b5c\7\u0098\2\2\u0b5c\u0b5e\7\u0099\2\2\u0b5d"+ + "\u0b5b\3\2\2\2\u0b5d\u0b5e\3\2\2\2\u0b5e\u0b60\3\2\2\2\u0b5f\u0b61\5\""+ + "\22\2\u0b60\u0b5f\3\2\2\2\u0b60\u0b61\3\2\2\2\u0b61\u0b63\3\2\2\2\u0b62"+ + "\u0b64\5\u00ecw\2\u0b63\u0b62\3\2\2\2\u0b63\u0b64\3\2\2\2\u0b64\u00f3"+ + "\3\2\2\2\u0b65\u0b6a\5\u00f6|\2\u0b66\u0b67\7\u0122\2\2\u0b67\u0b69\5"+ + "\u00f6|\2\u0b68\u0b66\3\2\2\2\u0b69\u0b6c\3\2\2\2\u0b6a\u0b68\3\2\2\2"+ + "\u0b6a\u0b6b\3\2\2\2\u0b6b\u00f5\3\2\2\2\u0b6c\u0b6a\3\2\2\2\u0b6d\u0b6e"+ + "\5\u010e\u0088\2\u0b6e\u0b71\5\u00eex\2\u0b6f\u0b70\7\u0098\2\2\u0b70"+ + "\u0b72\7\u0099\2\2\u0b71\u0b6f\3\2\2\2\u0b71\u0b72\3\2\2\2\u0b72\u0b74"+ + "\3\2\2\2\u0b73\u0b75\5\"\22\2\u0b74\u0b73\3\2\2\2\u0b74\u0b75\3\2\2\2"+ + "\u0b75\u00f7\3\2\2\2\u0b76\u0b7b\5\u00fa~\2\u0b77\u0b78\7\u0122\2\2\u0b78"+ + "\u0b7a\5\u00fa~\2\u0b79\u0b77\3\2\2\2\u0b7a\u0b7d\3\2\2\2\u0b7b\u0b79"+ + "\3\2\2\2\u0b7b\u0b7c\3\2\2\2\u0b7c\u00f9\3\2\2\2\u0b7d\u0b7b\3\2\2\2\u0b7e"+ + "\u0b80\5\u0112\u008a\2\u0b7f\u0b81\7\u0123\2\2\u0b80\u0b7f\3\2\2\2\u0b80"+ + "\u0b81\3\2\2\2\u0b81\u0b82\3\2\2\2\u0b82\u0b85\5\u00eex\2\u0b83\u0b84"+ + "\7\u0098\2\2\u0b84\u0b86\7\u0099\2\2\u0b85\u0b83\3\2\2\2\u0b85\u0b86\3"+ + "\2\2\2\u0b86\u0b88\3\2\2\2\u0b87\u0b89\5\"\22\2\u0b88\u0b87\3\2\2\2\u0b88"+ + "\u0b89\3\2\2\2\u0b89\u00fb\3\2\2\2\u0b8a\u0b8b\7\u0107\2\2\u0b8b\u0b8c"+ + "\5\u00c8e\2\u0b8c\u0b8d\7\u00eb\2\2\u0b8d\u0b8e\5\u00c8e\2\u0b8e\u00fd"+ + "\3\2\2\2\u0b8f\u0b90\7\u0109\2\2\u0b90\u0b95\5\u0100\u0081\2\u0b91\u0b92"+ + "\7\u0122\2\2\u0b92\u0b94\5\u0100\u0081\2\u0b93\u0b91\3\2\2\2\u0b94\u0b97"+ + "\3\2\2\2\u0b95\u0b93\3\2\2\2\u0b95\u0b96\3\2\2\2\u0b96\u00ff\3\2\2\2\u0b97"+ + "\u0b95\3\2\2\2\u0b98\u0b99\5\u010e\u0088\2\u0b99\u0b9a\7\24\2\2\u0b9a"+ + "\u0b9b\5\u0102\u0082\2\u0b9b\u0101\3\2\2\2\u0b9c\u0bcb\5\u010e\u0088\2"+ + "\u0b9d\u0b9e\7\3\2\2\u0b9e\u0b9f\5\u010e\u0088\2\u0b9f\u0ba0\7\4\2\2\u0ba0"+ + "\u0bcb\3\2\2\2\u0ba1\u0bc4\7\3\2\2\u0ba2\u0ba3\7$\2\2\u0ba3\u0ba4\7\34"+ + "\2\2\u0ba4\u0ba9\5\u00c8e\2\u0ba5\u0ba6\7\u0122\2\2\u0ba6\u0ba8\5\u00c8"+ + "e\2\u0ba7\u0ba5\3\2\2\2\u0ba8\u0bab\3\2\2\2\u0ba9\u0ba7\3\2\2\2\u0ba9"+ + "\u0baa\3\2\2\2\u0baa\u0bc5\3\2\2\2\u0bab\u0ba9\3\2\2\2\u0bac\u0bad\t-"+ + "\2\2\u0bad\u0bae\7\34\2\2\u0bae\u0bb3\5\u00c8e\2\u0baf\u0bb0\7\u0122\2"+ + "\2\u0bb0\u0bb2\5\u00c8e\2\u0bb1\u0baf\3\2\2\2\u0bb2\u0bb5\3\2\2\2\u0bb3"+ + "\u0bb1\3\2\2\2\u0bb3\u0bb4\3\2\2\2\u0bb4\u0bb7\3\2\2\2\u0bb5\u0bb3\3\2"+ + "\2\2\u0bb6\u0bac\3\2\2\2\u0bb6\u0bb7\3\2\2\2\u0bb7\u0bc2\3\2\2\2\u0bb8"+ + "\u0bb9\t.\2\2\u0bb9\u0bba\7\34\2\2\u0bba\u0bbf\5Z.\2\u0bbb\u0bbc\7\u0122"+ + "\2\2\u0bbc\u0bbe\5Z.\2\u0bbd\u0bbb\3\2\2\2\u0bbe\u0bc1\3\2\2\2\u0bbf\u0bbd"+ + "\3\2\2\2\u0bbf\u0bc0\3\2\2\2\u0bc0\u0bc3\3\2\2\2\u0bc1\u0bbf\3\2\2\2\u0bc2"+ + "\u0bb8\3\2\2\2\u0bc2\u0bc3\3\2\2\2\u0bc3\u0bc5\3\2\2\2\u0bc4\u0ba2\3\2"+ + "\2\2\u0bc4\u0bb6\3\2\2\2\u0bc5\u0bc7\3\2\2\2\u0bc6\u0bc8\5\u0104\u0083"+ + "\2\u0bc7\u0bc6\3\2\2\2\u0bc7\u0bc8\3\2\2\2\u0bc8\u0bc9\3\2\2\2\u0bc9\u0bcb"+ + "\7\4\2\2\u0bca\u0b9c\3\2\2\2\u0bca\u0b9d\3\2\2\2\u0bca\u0ba1\3\2\2\2\u0bcb"+ + "\u0103\3\2\2\2\u0bcc\u0bcd\7\u00b7\2\2\u0bcd\u0bdd\5\u0106\u0084\2\u0bce"+ + "\u0bcf\7\u00cc\2\2\u0bcf\u0bdd\5\u0106\u0084\2\u0bd0\u0bd1\7\u00b7\2\2"+ + "\u0bd1\u0bd2\7\30\2\2\u0bd2\u0bd3\5\u0106\u0084\2\u0bd3\u0bd4\7\17\2\2"+ + "\u0bd4\u0bd5\5\u0106\u0084\2\u0bd5\u0bdd\3\2\2\2\u0bd6\u0bd7\7\u00cc\2"+ + "\2\u0bd7\u0bd8\7\30\2\2\u0bd8\u0bd9\5\u0106\u0084\2\u0bd9\u0bda\7\17\2"+ + "\2\u0bda\u0bdb\5\u0106\u0084\2\u0bdb\u0bdd\3\2\2\2\u0bdc\u0bcc\3\2\2\2"+ + "\u0bdc\u0bce\3\2\2\2\u0bdc\u0bd0\3\2\2\2\u0bdc\u0bd6\3\2\2\2\u0bdd\u0105"+ + "\3\2\2\2\u0bde\u0bdf\7\u00f9\2\2\u0bdf\u0be6\t/\2\2\u0be0\u0be1\7\66\2"+ + "\2\u0be1\u0be6\7\u00cb\2\2\u0be2\u0be3\5\u00c8e\2\u0be3\u0be4\t/\2\2\u0be4"+ + "\u0be6\3\2\2\2\u0be5\u0bde\3\2\2\2\u0be5\u0be0\3\2\2\2\u0be5\u0be2\3\2"+ + "\2\2\u0be6\u0107\3\2\2\2\u0be7\u0bec\5\u010c\u0087\2\u0be8\u0be9\7\u0122"+ + "\2\2\u0be9\u0beb\5\u010c\u0087\2\u0bea\u0be8\3\2\2\2\u0beb\u0bee\3\2\2"+ + "\2\u0bec\u0bea\3\2\2\2\u0bec\u0bed\3\2\2\2\u0bed\u0109\3\2\2\2\u0bee\u0bec"+ + "\3\2\2\2\u0bef\u0bf4\5\u010c\u0087\2\u0bf0\u0bf4\7[\2\2\u0bf1\u0bf4\7"+ + "\u0082\2\2\u0bf2\u0bf4\7\u00c5\2\2\u0bf3\u0bef\3\2\2\2\u0bf3\u0bf0\3\2"+ + "\2\2\u0bf3\u0bf1\3\2\2\2\u0bf3\u0bf2\3\2\2\2\u0bf4\u010b\3\2\2\2\u0bf5"+ + "\u0bfa\5\u0112\u008a\2\u0bf6\u0bf7\7\u0121\2\2\u0bf7\u0bf9\5\u0112\u008a"+ + "\2\u0bf8\u0bf6\3\2\2\2\u0bf9\u0bfc\3\2\2\2\u0bfa\u0bf8\3\2\2\2\u0bfa\u0bfb"+ + "\3\2\2\2\u0bfb\u010d\3\2\2\2\u0bfc\u0bfa\3\2\2\2\u0bfd\u0bfe\5\u0112\u008a"+ + "\2\u0bfe\u0bff\5\u0110\u0089\2\u0bff\u010f\3\2\2\2\u0c00\u0c01\7\u0116"+ + "\2\2\u0c01\u0c03\5\u0112\u008a\2\u0c02\u0c00\3\2\2\2\u0c03\u0c04\3\2\2"+ + "\2\u0c04\u0c02\3\2\2\2\u0c04\u0c05\3\2\2\2\u0c05\u0c08\3\2\2\2\u0c06\u0c08"+ + "\3\2\2\2\u0c07\u0c02\3\2\2\2\u0c07\u0c06\3\2\2\2\u0c08\u0111\3\2\2\2\u0c09"+ + "\u0c0d\5\u0114\u008b\2\u0c0a\u0c0b\6\u008a\22\2\u0c0b\u0c0d\5\u011e\u0090"+ + "\2\u0c0c\u0c09\3\2\2\2\u0c0c\u0c0a\3\2\2\2\u0c0d\u0113\3\2\2\2\u0c0e\u0c15"+ + "\7\u012f\2\2\u0c0f\u0c15\5\u0116\u008c\2\u0c10\u0c11\6\u008b\23\2\u0c11"+ + "\u0c15\5\u011c\u008f\2\u0c12\u0c13\6\u008b\24\2\u0c13\u0c15\5\u0120\u0091"+ + "\2\u0c14\u0c0e\3\2\2\2\u0c14\u0c0f\3\2\2\2\u0c14\u0c10\3\2\2\2\u0c14\u0c12"+ + "\3\2\2\2\u0c15\u0115\3\2\2\2\u0c16\u0c17\7\u0130\2\2\u0c17\u0117\3\2\2"+ + "\2\u0c18\u0c1a\6\u008d\25\2\u0c19\u0c1b\7\u0116\2\2\u0c1a\u0c19\3\2\2"+ + "\2\u0c1a\u0c1b\3\2\2\2\u0c1b\u0c1c\3\2\2\2\u0c1c\u0c44\7\u012a\2\2\u0c1d"+ + "\u0c1f\6\u008d\26\2\u0c1e\u0c20\7\u0116\2\2\u0c1f\u0c1e\3\2\2\2\u0c1f"+ + "\u0c20\3\2\2\2\u0c20\u0c21\3\2\2\2\u0c21\u0c44\7\u012b\2\2\u0c22\u0c24"+ + "\6\u008d\27\2\u0c23\u0c25\7\u0116\2\2\u0c24\u0c23\3\2\2\2\u0c24\u0c25"+ + "\3\2\2\2\u0c25\u0c26\3\2\2\2\u0c26\u0c44\t\60\2\2\u0c27\u0c29\7\u0116"+ + "\2\2\u0c28\u0c27\3\2\2\2\u0c28\u0c29\3\2\2\2\u0c29\u0c2a\3\2\2\2\u0c2a"+ + "\u0c44\7\u0129\2\2\u0c2b\u0c2d\7\u0116\2\2\u0c2c\u0c2b\3\2\2\2\u0c2c\u0c2d"+ + "\3\2\2\2\u0c2d\u0c2e\3\2\2\2\u0c2e\u0c44\7\u0126\2\2\u0c2f\u0c31\7\u0116"+ + "\2\2\u0c30\u0c2f\3\2\2\2\u0c30\u0c31\3\2\2\2\u0c31\u0c32\3\2\2\2\u0c32"+ + "\u0c44\7\u0127\2\2\u0c33\u0c35\7\u0116\2\2\u0c34\u0c33\3\2\2\2\u0c34\u0c35"+ + "\3\2\2\2\u0c35\u0c36\3\2\2\2\u0c36\u0c44\7\u0128\2\2\u0c37\u0c39\7\u0116"+ + "\2\2\u0c38\u0c37\3\2\2\2\u0c38\u0c39\3\2\2\2\u0c39\u0c3a\3\2\2\2\u0c3a"+ + "\u0c44\7\u012d\2\2\u0c3b\u0c3d\7\u0116\2\2\u0c3c\u0c3b\3\2\2\2\u0c3c\u0c3d"+ + "\3\2\2\2\u0c3d\u0c3e\3\2\2\2\u0c3e\u0c44\7\u012c\2\2\u0c3f\u0c41\7\u0116"+ + "\2\2\u0c40\u0c3f\3\2\2\2\u0c40\u0c41\3\2\2\2\u0c41\u0c42\3\2\2\2\u0c42"+ + "\u0c44\7\u012e\2\2\u0c43\u0c18\3\2\2\2\u0c43\u0c1d\3\2\2\2\u0c43\u0c22"+ + "\3\2\2\2\u0c43\u0c28\3\2\2\2\u0c43\u0c2c\3\2\2\2\u0c43\u0c30\3\2\2\2\u0c43"+ + "\u0c34\3\2\2\2\u0c43\u0c38\3\2\2\2\u0c43\u0c3c\3\2\2\2\u0c43\u0c40\3\2"+ + "\2\2\u0c44\u0119\3\2\2\2\u0c45\u0c46\7\u00f7\2\2\u0c46\u0c4d\5\u00eex"+ + "\2\u0c47\u0c4d\5\"\22\2\u0c48\u0c4d\5\u00ecw\2\u0c49\u0c4a\t\61\2\2\u0c4a"+ + "\u0c4b\7\u0098\2\2\u0c4b\u0c4d\7\u0099\2\2\u0c4c\u0c45\3\2\2\2\u0c4c\u0c47"+ + "\3\2\2\2\u0c4c\u0c48\3\2\2\2\u0c4c\u0c49\3\2\2\2\u0c4d\u011b\3\2\2\2\u0c4e"+ + "\u0c4f\t\62\2\2\u0c4f\u011d\3\2\2\2\u0c50\u0c51\t\63\2\2\u0c51\u011f\3"+ + "\2\2\2\u0c52\u0c53\t\64\2\2\u0c53\u0121\3\2\2\2\u01a3\u0126\u013f\u0144"+ + "\u014c\u0154\u0156\u016a\u016e\u0174\u0177\u017a\u0181\u0184\u0188\u018b"+ + "\u0192\u019d\u019f\u01a7\u01aa\u01ae\u01b1\u01b7\u01c2\u01c8\u01cd\u020d"+ + "\u0216\u021a\u0220\u0224\u0229\u022f\u023b\u0243\u0249\u0256\u025b\u026b"+ + "\u0272\u0276\u027c\u028b\u028f\u0295\u029b\u029e\u02a1\u02a7\u02ab\u02b3"+ + "\u02b5\u02be\u02c1\u02ca\u02cf\u02d5\u02dc\u02df\u02e5\u02f0\u02f3\u02f7"+ + "\u02fc\u0301\u0308\u030b\u030e\u0315\u031a\u0323\u032b\u0331\u0334\u0337"+ + "\u033d\u0341\u0345\u0349\u034b\u0353\u035b\u0361\u0367\u036a\u036e\u0371"+ + "\u0375\u0391\u0394\u0398\u039e\u03a1\u03a4\u03aa\u03b2\u03b7\u03bd\u03c3"+ + "\u03cb\u03d2\u03da\u03eb\u03f9\u03fc\u0402\u040b\u0414\u041b\u041e\u042a"+ + "\u042e\u0435\u04a9\u04b1\u04b9\u04c2\u04cc\u04d0\u04d3\u04d9\u04df\u04eb"+ + "\u04f7\u04fc\u0505\u050d\u0514\u0516\u0519\u051e\u0522\u0527\u052a\u052f"+ + "\u0534\u0537\u053c\u0540\u0545\u0547\u054b\u0554\u055c\u0565\u056c\u0575"+ + "\u057a\u057d\u0593\u0595\u059e\u05a5\u05a8\u05af\u05b3\u05b9\u05c1\u05cc"+ + "\u05d7\u05de\u05e4\u05f1\u05f8\u05ff\u060b\u0613\u0619\u061c\u0625\u0628"+ + "\u0631\u0634\u063d\u0640\u0649\u064c\u064f\u0654\u0656\u0662\u0669\u0670"+ + "\u0673\u0675\u0681\u0685\u0689\u068f\u0693\u069b\u069f\u06a2\u06a5\u06a8"+ + "\u06ac\u06b0\u06b5\u06b9\u06bc\u06bf\u06c2\u06c6\u06cb\u06cf\u06d2\u06d5"+ + "\u06d8\u06da\u06e0\u06e7\u06ec\u06ef\u06f2\u06f6\u0700\u0704\u0706\u0709"+ + "\u070d\u0713\u0717\u0722\u072c\u0738\u0747\u074c\u0753\u0763\u0768\u0775"+ + "\u077a\u0782\u0788\u078c\u0795\u079f\u07ae\u07b3\u07b5\u07b9\u07c2\u07cf"+ + "\u07d4\u07d8\u07e0\u07e3\u07e7\u07f5\u0802\u0807\u080b\u080e\u0813\u081c"+ + "\u081f\u0824\u082b\u082e\u0833\u0839\u083f\u0843\u0849\u084d\u0850\u0855"+ + "\u0858\u085d\u0861\u0864\u0867\u086d\u0872\u0877\u0889\u088b\u088e\u0899"+ + "\u08a2\u08a9\u08b1\u08b8\u08bc\u08c4\u08cc\u08d2\u08da\u08e6\u08e9\u08ef"+ + "\u08f3\u08f5\u08fe\u090a\u090c\u0913\u091a\u0920\u0926\u0928\u092f\u0937"+ + "\u093d\u0944\u094a\u094e\u0950\u0957\u0960\u0967\u0971\u0976\u097a\u0983"+ + "\u0990\u0992\u099a\u099c\u09a0\u09a8\u09b1\u09b7\u09bf\u09c4\u09d0\u09d5"+ + "\u09d8\u09de\u09e2\u09e7\u09ec\u09f1\u09f7\u0a0c\u0a0e\u0a17\u0a1b\u0a24"+ + "\u0a28\u0a3a\u0a3d\u0a45\u0a4e\u0a65\u0a70\u0a77\u0a7a\u0a83\u0a87\u0a8b"+ + "\u0a97\u0ab0\u0ab7\u0aba\u0ac9\u0acd\u0ad7\u0ad9\u0ade\u0ae5\u0af1\u0af3"+ + "\u0b00\u0b04\u0b0b\u0b10\u0b18\u0b1f\u0b30\u0b34\u0b3a\u0b40\u0b49\u0b4d"+ + "\u0b4f\u0b56\u0b5d\u0b60\u0b63\u0b6a\u0b71\u0b74\u0b7b\u0b80\u0b85\u0b88"+ + "\u0b95\u0ba9\u0bb3\u0bb6\u0bbf\u0bc2\u0bc4\u0bc7\u0bca\u0bdc\u0be5\u0bec"+ + "\u0bf3\u0bfa\u0c04\u0c07\u0c0c\u0c14\u0c1a\u0c1f\u0c24\u0c28\u0c2c\u0c30"+ + "\u0c34\u0c38\u0c3c\u0c40\u0c43\u0c4c"; + public static final String _serializedATN = Utils.join( + new String[] { + _serializedATNSegment0, + _serializedATNSegment1 + }, + "" + ); + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/sql/SQLVisitor.java b/mypages/src/main/java/io/leego/mypages/sql/SQLVisitor.java new file mode 100644 index 0000000..160210f --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/sql/SQLVisitor.java @@ -0,0 +1,1856 @@ +package io.leego.mypages.sql; +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by {@link SQLParser}. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public interface SQLVisitor extends ParseTreeVisitor { + /** + * Visit a parse tree produced by {@link SQLParser#singleStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleStatement(SQLParser.SingleStatementContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#singleExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleExpression(SQLParser.SingleExpressionContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#singleTableIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleTableIdentifier(SQLParser.SingleTableIdentifierContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#singleMultipartIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleMultipartIdentifier(SQLParser.SingleMultipartIdentifierContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#singleFunctionIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleFunctionIdentifier(SQLParser.SingleFunctionIdentifierContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#singleDataType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleDataType(SQLParser.SingleDataTypeContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#singleTableSchema}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleTableSchema(SQLParser.SingleTableSchemaContext ctx); + /** + * Visit a parse tree produced by the {@code statementDefault} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStatementDefault(SQLParser.StatementDefaultContext ctx); + /** + * Visit a parse tree produced by the {@code dmlStatement} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDmlStatement(SQLParser.DmlStatementContext ctx); + /** + * Visit a parse tree produced by the {@code use} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUse(SQLParser.UseContext ctx); + /** + * Visit a parse tree produced by the {@code createNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateNamespace(SQLParser.CreateNamespaceContext ctx); + /** + * Visit a parse tree produced by the {@code setNamespaceProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetNamespaceProperties(SQLParser.SetNamespacePropertiesContext ctx); + /** + * Visit a parse tree produced by the {@code setNamespaceLocation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetNamespaceLocation(SQLParser.SetNamespaceLocationContext ctx); + /** + * Visit a parse tree produced by the {@code dropNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDropNamespace(SQLParser.DropNamespaceContext ctx); + /** + * Visit a parse tree produced by the {@code showNamespaces} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowNamespaces(SQLParser.ShowNamespacesContext ctx); + /** + * Visit a parse tree produced by the {@code createTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateTable(SQLParser.CreateTableContext ctx); + /** + * Visit a parse tree produced by the {@code createTableLike} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateTableLike(SQLParser.CreateTableLikeContext ctx); + /** + * Visit a parse tree produced by the {@code replaceTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReplaceTable(SQLParser.ReplaceTableContext ctx); + /** + * Visit a parse tree produced by the {@code analyze} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnalyze(SQLParser.AnalyzeContext ctx); + /** + * Visit a parse tree produced by the {@code analyzeTables} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnalyzeTables(SQLParser.AnalyzeTablesContext ctx); + /** + * Visit a parse tree produced by the {@code addTableColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAddTableColumns(SQLParser.AddTableColumnsContext ctx); + /** + * Visit a parse tree produced by the {@code renameTableColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRenameTableColumn(SQLParser.RenameTableColumnContext ctx); + /** + * Visit a parse tree produced by the {@code dropTableColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDropTableColumns(SQLParser.DropTableColumnsContext ctx); + /** + * Visit a parse tree produced by the {@code renameTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRenameTable(SQLParser.RenameTableContext ctx); + /** + * Visit a parse tree produced by the {@code setTableProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetTableProperties(SQLParser.SetTablePropertiesContext ctx); + /** + * Visit a parse tree produced by the {@code unsetTableProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUnsetTableProperties(SQLParser.UnsetTablePropertiesContext ctx); + /** + * Visit a parse tree produced by the {@code alterTableAlterColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAlterTableAlterColumn(SQLParser.AlterTableAlterColumnContext ctx); + /** + * Visit a parse tree produced by the {@code hiveChangeColumn} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitHiveChangeColumn(SQLParser.HiveChangeColumnContext ctx); + /** + * Visit a parse tree produced by the {@code hiveReplaceColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitHiveReplaceColumns(SQLParser.HiveReplaceColumnsContext ctx); + /** + * Visit a parse tree produced by the {@code setTableSerDe} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetTableSerDe(SQLParser.SetTableSerDeContext ctx); + /** + * Visit a parse tree produced by the {@code addTablePartition} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAddTablePartition(SQLParser.AddTablePartitionContext ctx); + /** + * Visit a parse tree produced by the {@code renameTablePartition} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRenameTablePartition(SQLParser.RenameTablePartitionContext ctx); + /** + * Visit a parse tree produced by the {@code dropTablePartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDropTablePartitions(SQLParser.DropTablePartitionsContext ctx); + /** + * Visit a parse tree produced by the {@code setTableLocation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetTableLocation(SQLParser.SetTableLocationContext ctx); + /** + * Visit a parse tree produced by the {@code recoverPartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRecoverPartitions(SQLParser.RecoverPartitionsContext ctx); + /** + * Visit a parse tree produced by the {@code dropTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDropTable(SQLParser.DropTableContext ctx); + /** + * Visit a parse tree produced by the {@code dropView} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDropView(SQLParser.DropViewContext ctx); + /** + * Visit a parse tree produced by the {@code createView} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateView(SQLParser.CreateViewContext ctx); + /** + * Visit a parse tree produced by the {@code createTempViewUsing} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateTempViewUsing(SQLParser.CreateTempViewUsingContext ctx); + /** + * Visit a parse tree produced by the {@code alterViewQuery} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAlterViewQuery(SQLParser.AlterViewQueryContext ctx); + /** + * Visit a parse tree produced by the {@code createFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateFunction(SQLParser.CreateFunctionContext ctx); + /** + * Visit a parse tree produced by the {@code dropFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDropFunction(SQLParser.DropFunctionContext ctx); + /** + * Visit a parse tree produced by the {@code explain} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExplain(SQLParser.ExplainContext ctx); + /** + * Visit a parse tree produced by the {@code showTables} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowTables(SQLParser.ShowTablesContext ctx); + /** + * Visit a parse tree produced by the {@code showTableExtended} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowTableExtended(SQLParser.ShowTableExtendedContext ctx); + /** + * Visit a parse tree produced by the {@code showTblProperties} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowTblProperties(SQLParser.ShowTblPropertiesContext ctx); + /** + * Visit a parse tree produced by the {@code showColumns} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowColumns(SQLParser.ShowColumnsContext ctx); + /** + * Visit a parse tree produced by the {@code showViews} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowViews(SQLParser.ShowViewsContext ctx); + /** + * Visit a parse tree produced by the {@code showPartitions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowPartitions(SQLParser.ShowPartitionsContext ctx); + /** + * Visit a parse tree produced by the {@code showFunctions} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowFunctions(SQLParser.ShowFunctionsContext ctx); + /** + * Visit a parse tree produced by the {@code showCreateTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowCreateTable(SQLParser.ShowCreateTableContext ctx); + /** + * Visit a parse tree produced by the {@code showCurrentNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShowCurrentNamespace(SQLParser.ShowCurrentNamespaceContext ctx); + /** + * Visit a parse tree produced by the {@code describeFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDescribeFunction(SQLParser.DescribeFunctionContext ctx); + /** + * Visit a parse tree produced by the {@code describeNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDescribeNamespace(SQLParser.DescribeNamespaceContext ctx); + /** + * Visit a parse tree produced by the {@code describeRelation} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDescribeRelation(SQLParser.DescribeRelationContext ctx); + /** + * Visit a parse tree produced by the {@code describeQuery} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDescribeQuery(SQLParser.DescribeQueryContext ctx); + /** + * Visit a parse tree produced by the {@code commentNamespace} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCommentNamespace(SQLParser.CommentNamespaceContext ctx); + /** + * Visit a parse tree produced by the {@code commentTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCommentTable(SQLParser.CommentTableContext ctx); + /** + * Visit a parse tree produced by the {@code refreshTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRefreshTable(SQLParser.RefreshTableContext ctx); + /** + * Visit a parse tree produced by the {@code refreshFunction} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRefreshFunction(SQLParser.RefreshFunctionContext ctx); + /** + * Visit a parse tree produced by the {@code refreshResource} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRefreshResource(SQLParser.RefreshResourceContext ctx); + /** + * Visit a parse tree produced by the {@code cacheTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCacheTable(SQLParser.CacheTableContext ctx); + /** + * Visit a parse tree produced by the {@code uncacheTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUncacheTable(SQLParser.UncacheTableContext ctx); + /** + * Visit a parse tree produced by the {@code clearCache} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitClearCache(SQLParser.ClearCacheContext ctx); + /** + * Visit a parse tree produced by the {@code loadData} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLoadData(SQLParser.LoadDataContext ctx); + /** + * Visit a parse tree produced by the {@code truncateTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTruncateTable(SQLParser.TruncateTableContext ctx); + /** + * Visit a parse tree produced by the {@code repairTable} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRepairTable(SQLParser.RepairTableContext ctx); + /** + * Visit a parse tree produced by the {@code manageResource} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitManageResource(SQLParser.ManageResourceContext ctx); + /** + * Visit a parse tree produced by the {@code failNativeCommand} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFailNativeCommand(SQLParser.FailNativeCommandContext ctx); + /** + * Visit a parse tree produced by the {@code setTimeZone} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetTimeZone(SQLParser.SetTimeZoneContext ctx); + /** + * Visit a parse tree produced by the {@code setQuotedConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetQuotedConfiguration(SQLParser.SetQuotedConfigurationContext ctx); + /** + * Visit a parse tree produced by the {@code setConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetConfiguration(SQLParser.SetConfigurationContext ctx); + /** + * Visit a parse tree produced by the {@code resetQuotedConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitResetQuotedConfiguration(SQLParser.ResetQuotedConfigurationContext ctx); + /** + * Visit a parse tree produced by the {@code resetConfiguration} + * labeled alternative in {@link SQLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitResetConfiguration(SQLParser.ResetConfigurationContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#configKey}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConfigKey(SQLParser.ConfigKeyContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#configValue}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConfigValue(SQLParser.ConfigValueContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#unsupportedHiveNativeCommands}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUnsupportedHiveNativeCommands(SQLParser.UnsupportedHiveNativeCommandsContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#createTableHeader}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateTableHeader(SQLParser.CreateTableHeaderContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#replaceTableHeader}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReplaceTableHeader(SQLParser.ReplaceTableHeaderContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#bucketSpec}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBucketSpec(SQLParser.BucketSpecContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#skewSpec}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSkewSpec(SQLParser.SkewSpecContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#locationSpec}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLocationSpec(SQLParser.LocationSpecContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#commentSpec}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCommentSpec(SQLParser.CommentSpecContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#query}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQuery(SQLParser.QueryContext ctx); + /** + * Visit a parse tree produced by the {@code insertOverwriteTable} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInsertOverwriteTable(SQLParser.InsertOverwriteTableContext ctx); + /** + * Visit a parse tree produced by the {@code insertIntoTable} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInsertIntoTable(SQLParser.InsertIntoTableContext ctx); + /** + * Visit a parse tree produced by the {@code insertOverwriteHiveDir} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInsertOverwriteHiveDir(SQLParser.InsertOverwriteHiveDirContext ctx); + /** + * Visit a parse tree produced by the {@code insertOverwriteDir} + * labeled alternative in {@link SQLParser#insertInto}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInsertOverwriteDir(SQLParser.InsertOverwriteDirContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#partitionSpecLocation}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPartitionSpecLocation(SQLParser.PartitionSpecLocationContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#partitionSpec}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPartitionSpec(SQLParser.PartitionSpecContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#partitionVal}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPartitionVal(SQLParser.PartitionValContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#namespace}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNamespace(SQLParser.NamespaceContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#describeFuncName}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDescribeFuncName(SQLParser.DescribeFuncNameContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#describeColName}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDescribeColName(SQLParser.DescribeColNameContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#ctes}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCtes(SQLParser.CtesContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#namedQuery}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNamedQuery(SQLParser.NamedQueryContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#tableProvider}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTableProvider(SQLParser.TableProviderContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#createTableClauses}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateTableClauses(SQLParser.CreateTableClausesContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#tablePropertyList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTablePropertyList(SQLParser.TablePropertyListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#tableProperty}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTableProperty(SQLParser.TablePropertyContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#tablePropertyKey}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTablePropertyKey(SQLParser.TablePropertyKeyContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#tablePropertyValue}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTablePropertyValue(SQLParser.TablePropertyValueContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#constantList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConstantList(SQLParser.ConstantListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#nestedConstantList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNestedConstantList(SQLParser.NestedConstantListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#createFileFormat}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateFileFormat(SQLParser.CreateFileFormatContext ctx); + /** + * Visit a parse tree produced by the {@code tableFileFormat} + * labeled alternative in {@link SQLParser#fileFormat}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTableFileFormat(SQLParser.TableFileFormatContext ctx); + /** + * Visit a parse tree produced by the {@code genericFileFormat} + * labeled alternative in {@link SQLParser#fileFormat}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGenericFileFormat(SQLParser.GenericFileFormatContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#storageHandler}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStorageHandler(SQLParser.StorageHandlerContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#resource}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitResource(SQLParser.ResourceContext ctx); + /** + * Visit a parse tree produced by the {@code singleInsertQuery} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleInsertQuery(SQLParser.SingleInsertQueryContext ctx); + /** + * Visit a parse tree produced by the {@code multiInsertQuery} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMultiInsertQuery(SQLParser.MultiInsertQueryContext ctx); + /** + * Visit a parse tree produced by the {@code deleteFromTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeleteFromTable(SQLParser.DeleteFromTableContext ctx); + /** + * Visit a parse tree produced by the {@code updateTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUpdateTable(SQLParser.UpdateTableContext ctx); + /** + * Visit a parse tree produced by the {@code mergeIntoTable} + * labeled alternative in {@link SQLParser#dmlStatementNoWith}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMergeIntoTable(SQLParser.MergeIntoTableContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#queryOrganization}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQueryOrganization(SQLParser.QueryOrganizationContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#multiInsertQueryBody}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMultiInsertQueryBody(SQLParser.MultiInsertQueryBodyContext ctx); + /** + * Visit a parse tree produced by the {@code queryTermDefault} + * labeled alternative in {@link SQLParser#queryTerm}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQueryTermDefault(SQLParser.QueryTermDefaultContext ctx); + /** + * Visit a parse tree produced by the {@code setOperation} + * labeled alternative in {@link SQLParser#queryTerm}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetOperation(SQLParser.SetOperationContext ctx); + /** + * Visit a parse tree produced by the {@code queryPrimaryDefault} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQueryPrimaryDefault(SQLParser.QueryPrimaryDefaultContext ctx); + /** + * Visit a parse tree produced by the {@code fromStmt} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFromStmt(SQLParser.FromStmtContext ctx); + /** + * Visit a parse tree produced by the {@code table} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTable(SQLParser.TableContext ctx); + /** + * Visit a parse tree produced by the {@code inlineTableDefault1} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInlineTableDefault1(SQLParser.InlineTableDefault1Context ctx); + /** + * Visit a parse tree produced by the {@code subquery} + * labeled alternative in {@link SQLParser#queryPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSubquery(SQLParser.SubqueryContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#sortItem}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSortItem(SQLParser.SortItemContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#fromStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFromStatement(SQLParser.FromStatementContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#fromStatementBody}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFromStatementBody(SQLParser.FromStatementBodyContext ctx); + /** + * Visit a parse tree produced by the {@code transformQuerySpecification} + * labeled alternative in {@link SQLParser#querySpecification}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTransformQuerySpecification(SQLParser.TransformQuerySpecificationContext ctx); + /** + * Visit a parse tree produced by the {@code regularQuerySpecification} + * labeled alternative in {@link SQLParser#querySpecification}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRegularQuerySpecification(SQLParser.RegularQuerySpecificationContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#transformClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTransformClause(SQLParser.TransformClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#selectClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSelectClause(SQLParser.SelectClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#setClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetClause(SQLParser.SetClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#matchedClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchedClause(SQLParser.MatchedClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#notMatchedClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNotMatchedClause(SQLParser.NotMatchedClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#matchedAction}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchedAction(SQLParser.MatchedActionContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#notMatchedAction}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNotMatchedAction(SQLParser.NotMatchedActionContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#assignmentList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAssignmentList(SQLParser.AssignmentListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#assignment}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAssignment(SQLParser.AssignmentContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#whereClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitWhereClause(SQLParser.WhereClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#havingClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitHavingClause(SQLParser.HavingClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#hint}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitHint(SQLParser.HintContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#hintStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitHintStatement(SQLParser.HintStatementContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#fromClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFromClause(SQLParser.FromClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#aggregationClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAggregationClause(SQLParser.AggregationClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#groupByClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGroupByClause(SQLParser.GroupByClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#groupingAnalytics}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGroupingAnalytics(SQLParser.GroupingAnalyticsContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#groupingElement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGroupingElement(SQLParser.GroupingElementContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#groupingSet}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGroupingSet(SQLParser.GroupingSetContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#pivotClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPivotClause(SQLParser.PivotClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#pivotColumn}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPivotColumn(SQLParser.PivotColumnContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#pivotValue}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPivotValue(SQLParser.PivotValueContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#lateralView}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLateralView(SQLParser.LateralViewContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#setQuantifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetQuantifier(SQLParser.SetQuantifierContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#relation}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRelation(SQLParser.RelationContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#joinRelation}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitJoinRelation(SQLParser.JoinRelationContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#joinType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitJoinType(SQLParser.JoinTypeContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#joinCriteria}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitJoinCriteria(SQLParser.JoinCriteriaContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#sample}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSample(SQLParser.SampleContext ctx); + /** + * Visit a parse tree produced by the {@code sampleByPercentile} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSampleByPercentile(SQLParser.SampleByPercentileContext ctx); + /** + * Visit a parse tree produced by the {@code sampleByRows} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSampleByRows(SQLParser.SampleByRowsContext ctx); + /** + * Visit a parse tree produced by the {@code sampleByBucket} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSampleByBucket(SQLParser.SampleByBucketContext ctx); + /** + * Visit a parse tree produced by the {@code sampleByBytes} + * labeled alternative in {@link SQLParser#sampleMethod}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSampleByBytes(SQLParser.SampleByBytesContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#identifierList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdentifierList(SQLParser.IdentifierListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#identifierSeq}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdentifierSeq(SQLParser.IdentifierSeqContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#orderedIdentifierList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOrderedIdentifierList(SQLParser.OrderedIdentifierListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#orderedIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOrderedIdentifier(SQLParser.OrderedIdentifierContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#identifierCommentList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdentifierCommentList(SQLParser.IdentifierCommentListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#identifierComment}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdentifierComment(SQLParser.IdentifierCommentContext ctx); + /** + * Visit a parse tree produced by the {@code tableName} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTableName(SQLParser.TableNameContext ctx); + /** + * Visit a parse tree produced by the {@code aliasedQuery} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAliasedQuery(SQLParser.AliasedQueryContext ctx); + /** + * Visit a parse tree produced by the {@code aliasedRelation} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAliasedRelation(SQLParser.AliasedRelationContext ctx); + /** + * Visit a parse tree produced by the {@code inlineTableDefault2} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInlineTableDefault2(SQLParser.InlineTableDefault2Context ctx); + /** + * Visit a parse tree produced by the {@code tableValuedFunction} + * labeled alternative in {@link SQLParser#relationPrimary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTableValuedFunction(SQLParser.TableValuedFunctionContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#inlineTable}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInlineTable(SQLParser.InlineTableContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#functionTable}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionTable(SQLParser.FunctionTableContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#tableAlias}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTableAlias(SQLParser.TableAliasContext ctx); + /** + * Visit a parse tree produced by the {@code rowFormatSerde} + * labeled alternative in {@link SQLParser#rowFormat}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRowFormatSerde(SQLParser.RowFormatSerdeContext ctx); + /** + * Visit a parse tree produced by the {@code rowFormatDelimited} + * labeled alternative in {@link SQLParser#rowFormat}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRowFormatDelimited(SQLParser.RowFormatDelimitedContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#multipartIdentifierList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMultipartIdentifierList(SQLParser.MultipartIdentifierListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#multipartIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMultipartIdentifier(SQLParser.MultipartIdentifierContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#tableIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTableIdentifier(SQLParser.TableIdentifierContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#functionIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionIdentifier(SQLParser.FunctionIdentifierContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#namedExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNamedExpression(SQLParser.NamedExpressionContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#namedExpressionSeq}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNamedExpressionSeq(SQLParser.NamedExpressionSeqContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#partitionFieldList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPartitionFieldList(SQLParser.PartitionFieldListContext ctx); + /** + * Visit a parse tree produced by the {@code partitionTransform} + * labeled alternative in {@link SQLParser#partitionField}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPartitionTransform(SQLParser.PartitionTransformContext ctx); + /** + * Visit a parse tree produced by the {@code partitionColumn} + * labeled alternative in {@link SQLParser#partitionField}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPartitionColumn(SQLParser.PartitionColumnContext ctx); + /** + * Visit a parse tree produced by the {@code identityTransform} + * labeled alternative in {@link SQLParser#transform}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdentityTransform(SQLParser.IdentityTransformContext ctx); + /** + * Visit a parse tree produced by the {@code applyTransform} + * labeled alternative in {@link SQLParser#transform}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitApplyTransform(SQLParser.ApplyTransformContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#transformArgument}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTransformArgument(SQLParser.TransformArgumentContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpression(SQLParser.ExpressionContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#expressionSeq}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpressionSeq(SQLParser.ExpressionSeqContext ctx); + /** + * Visit a parse tree produced by the {@code logicalNot} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLogicalNot(SQLParser.LogicalNotContext ctx); + /** + * Visit a parse tree produced by the {@code predicated} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPredicated(SQLParser.PredicatedContext ctx); + /** + * Visit a parse tree produced by the {@code exists} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExists(SQLParser.ExistsContext ctx); + /** + * Visit a parse tree produced by the {@code logicalBinary} + * labeled alternative in {@link SQLParser#booleanExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLogicalBinary(SQLParser.LogicalBinaryContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#predicate}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPredicate(SQLParser.PredicateContext ctx); + /** + * Visit a parse tree produced by the {@code valueExpressionDefault} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitValueExpressionDefault(SQLParser.ValueExpressionDefaultContext ctx); + /** + * Visit a parse tree produced by the {@code comparison} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitComparison(SQLParser.ComparisonContext ctx); + /** + * Visit a parse tree produced by the {@code arithmeticBinary} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArithmeticBinary(SQLParser.ArithmeticBinaryContext ctx); + /** + * Visit a parse tree produced by the {@code arithmeticUnary} + * labeled alternative in {@link SQLParser#valueExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArithmeticUnary(SQLParser.ArithmeticUnaryContext ctx); + /** + * Visit a parse tree produced by the {@code struct} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStruct(SQLParser.StructContext ctx); + /** + * Visit a parse tree produced by the {@code dereference} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDereference(SQLParser.DereferenceContext ctx); + /** + * Visit a parse tree produced by the {@code simpleCase} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSimpleCase(SQLParser.SimpleCaseContext ctx); + /** + * Visit a parse tree produced by the {@code currentLike} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCurrentLike(SQLParser.CurrentLikeContext ctx); + /** + * Visit a parse tree produced by the {@code columnReference} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitColumnReference(SQLParser.ColumnReferenceContext ctx); + /** + * Visit a parse tree produced by the {@code rowConstructor} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRowConstructor(SQLParser.RowConstructorContext ctx); + /** + * Visit a parse tree produced by the {@code last} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLast(SQLParser.LastContext ctx); + /** + * Visit a parse tree produced by the {@code star} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStar(SQLParser.StarContext ctx); + /** + * Visit a parse tree produced by the {@code overlay} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOverlay(SQLParser.OverlayContext ctx); + /** + * Visit a parse tree produced by the {@code subscript} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSubscript(SQLParser.SubscriptContext ctx); + /** + * Visit a parse tree produced by the {@code subqueryExpression} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSubqueryExpression(SQLParser.SubqueryExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code substring} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSubstring(SQLParser.SubstringContext ctx); + /** + * Visit a parse tree produced by the {@code cast} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCast(SQLParser.CastContext ctx); + /** + * Visit a parse tree produced by the {@code constantDefault} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConstantDefault(SQLParser.ConstantDefaultContext ctx); + /** + * Visit a parse tree produced by the {@code lambda} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLambda(SQLParser.LambdaContext ctx); + /** + * Visit a parse tree produced by the {@code parenthesizedExpression} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitParenthesizedExpression(SQLParser.ParenthesizedExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code extract} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExtract(SQLParser.ExtractContext ctx); + /** + * Visit a parse tree produced by the {@code trim} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTrim(SQLParser.TrimContext ctx); + /** + * Visit a parse tree produced by the {@code functionCall} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionCall(SQLParser.FunctionCallContext ctx); + /** + * Visit a parse tree produced by the {@code searchedCase} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSearchedCase(SQLParser.SearchedCaseContext ctx); + /** + * Visit a parse tree produced by the {@code position} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPosition(SQLParser.PositionContext ctx); + /** + * Visit a parse tree produced by the {@code first} + * labeled alternative in {@link SQLParser#primaryExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFirst(SQLParser.FirstContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#limitExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLimitExpression(SQLParser.LimitExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code nullLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNullLiteral(SQLParser.NullLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code intervalLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIntervalLiteral(SQLParser.IntervalLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code typeConstructor} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeConstructor(SQLParser.TypeConstructorContext ctx); + /** + * Visit a parse tree produced by the {@code numericLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNumericLiteral(SQLParser.NumericLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code booleanLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBooleanLiteral(SQLParser.BooleanLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code stringLiteral} + * labeled alternative in {@link SQLParser#constant}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStringLiteral(SQLParser.StringLiteralContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#comparisonOperator}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitComparisonOperator(SQLParser.ComparisonOperatorContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#arithmeticOperator}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArithmeticOperator(SQLParser.ArithmeticOperatorContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#predicateOperator}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPredicateOperator(SQLParser.PredicateOperatorContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#booleanValue}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBooleanValue(SQLParser.BooleanValueContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#interval}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInterval(SQLParser.IntervalContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#errorCapturingMultiUnitsInterval}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitErrorCapturingMultiUnitsInterval(SQLParser.ErrorCapturingMultiUnitsIntervalContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#multiUnitsInterval}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMultiUnitsInterval(SQLParser.MultiUnitsIntervalContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#errorCapturingUnitToUnitInterval}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitErrorCapturingUnitToUnitInterval(SQLParser.ErrorCapturingUnitToUnitIntervalContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#unitToUnitInterval}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUnitToUnitInterval(SQLParser.UnitToUnitIntervalContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#intervalValue}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIntervalValue(SQLParser.IntervalValueContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#colPosition}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitColPosition(SQLParser.ColPositionContext ctx); + /** + * Visit a parse tree produced by the {@code complexDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitComplexDataType(SQLParser.ComplexDataTypeContext ctx); + /** + * Visit a parse tree produced by the {@code yearMonthIntervalDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitYearMonthIntervalDataType(SQLParser.YearMonthIntervalDataTypeContext ctx); + /** + * Visit a parse tree produced by the {@code dayTimeIntervalDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDayTimeIntervalDataType(SQLParser.DayTimeIntervalDataTypeContext ctx); + /** + * Visit a parse tree produced by the {@code primitiveDataType} + * labeled alternative in {@link SQLParser#dataType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPrimitiveDataType(SQLParser.PrimitiveDataTypeContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#qualifiedColTypeWithPositionList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQualifiedColTypeWithPositionList(SQLParser.QualifiedColTypeWithPositionListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#qualifiedColTypeWithPosition}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQualifiedColTypeWithPosition(SQLParser.QualifiedColTypeWithPositionContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#colTypeList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitColTypeList(SQLParser.ColTypeListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#colType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitColType(SQLParser.ColTypeContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#complexColTypeList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitComplexColTypeList(SQLParser.ComplexColTypeListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#complexColType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitComplexColType(SQLParser.ComplexColTypeContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#whenClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitWhenClause(SQLParser.WhenClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#windowClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitWindowClause(SQLParser.WindowClauseContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#namedWindow}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNamedWindow(SQLParser.NamedWindowContext ctx); + /** + * Visit a parse tree produced by the {@code windowRef} + * labeled alternative in {@link SQLParser#windowSpec}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitWindowRef(SQLParser.WindowRefContext ctx); + /** + * Visit a parse tree produced by the {@code windowDef} + * labeled alternative in {@link SQLParser#windowSpec}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitWindowDef(SQLParser.WindowDefContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#windowFrame}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitWindowFrame(SQLParser.WindowFrameContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#frameBound}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFrameBound(SQLParser.FrameBoundContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#qualifiedNameList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQualifiedNameList(SQLParser.QualifiedNameListContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#functionName}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionName(SQLParser.FunctionNameContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#qualifiedName}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQualifiedName(SQLParser.QualifiedNameContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#errorCapturingIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitErrorCapturingIdentifier(SQLParser.ErrorCapturingIdentifierContext ctx); + /** + * Visit a parse tree produced by the {@code errorIdent} + * labeled alternative in {@link SQLParser#errorCapturingIdentifierExtra}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitErrorIdent(SQLParser.ErrorIdentContext ctx); + /** + * Visit a parse tree produced by the {@code realIdent} + * labeled alternative in {@link SQLParser#errorCapturingIdentifierExtra}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRealIdent(SQLParser.RealIdentContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#identifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdentifier(SQLParser.IdentifierContext ctx); + /** + * Visit a parse tree produced by the {@code unquotedIdentifier} + * labeled alternative in {@link SQLParser#strictIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUnquotedIdentifier(SQLParser.UnquotedIdentifierContext ctx); + /** + * Visit a parse tree produced by the {@code quotedIdentifierAlternative} + * labeled alternative in {@link SQLParser#strictIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQuotedIdentifierAlternative(SQLParser.QuotedIdentifierAlternativeContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#quotedIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQuotedIdentifier(SQLParser.QuotedIdentifierContext ctx); + /** + * Visit a parse tree produced by the {@code exponentLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExponentLiteral(SQLParser.ExponentLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code decimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDecimalLiteral(SQLParser.DecimalLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code legacyDecimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLegacyDecimalLiteral(SQLParser.LegacyDecimalLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code integerLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIntegerLiteral(SQLParser.IntegerLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code bigIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBigIntLiteral(SQLParser.BigIntLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code smallIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSmallIntLiteral(SQLParser.SmallIntLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code tinyIntLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTinyIntLiteral(SQLParser.TinyIntLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code doubleLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDoubleLiteral(SQLParser.DoubleLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code floatLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFloatLiteral(SQLParser.FloatLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code bigDecimalLiteral} + * labeled alternative in {@link SQLParser#number}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBigDecimalLiteral(SQLParser.BigDecimalLiteralContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#alterColumnAction}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAlterColumnAction(SQLParser.AlterColumnActionContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#ansiNonReserved}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnsiNonReserved(SQLParser.AnsiNonReservedContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#strictNonReserved}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStrictNonReserved(SQLParser.StrictNonReservedContext ctx); + /** + * Visit a parse tree produced by {@link SQLParser#nonReserved}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNonReserved(SQLParser.NonReservedContext ctx); +} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/util/BeanUtils.java b/mypages/src/main/java/io/leego/mypages/util/BeanUtils.java deleted file mode 100644 index f061265..0000000 --- a/mypages/src/main/java/io/leego/mypages/util/BeanUtils.java +++ /dev/null @@ -1,488 +0,0 @@ -package io.leego.mypages.util; - -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Supplier; - -/** - * @author Yihleego - */ -public final class BeanUtils { - private static final String GET_PREFIX = "get"; - private static final String SET_PREFIX = "set"; - private static final String IS_PREFIX = "is"; - - private BeanUtils() { - } - - /** - * Returns read-method name. - *

Example:

-     * String methodName = getReadMethodName("name"); // The method name is "getName".
-     * 
- * @param fieldName The name of the property. - * @return read-method name. - */ - public static String getReadMethodName(String fieldName) { - return buildMethodName(GET_PREFIX, fieldName); - } - - /** - * Returns read-method name. - *

Example 1:

-     * String methodName = getReadMethodName("name", false); // The method name is "getName".
-     * 
- *

Example 2:

-     * String methodName = getReadMethodName("success", true); // The method name is "isSuccess".
-     * 
- * @param fieldName The name of the property. - * @param primitiveBoolean Whether the field type is primitive boolean. - * @return read-method name. - */ - public static String getReadMethodName(String fieldName, boolean primitiveBoolean) { - return buildMethodName((primitiveBoolean ? IS_PREFIX : GET_PREFIX), fieldName); - } - - /** - * Returns read-method name. - *

Example:

-     * String methodName = getPrimitiveBooleanReadMethodName("success"); // The method name is "isSuccess".
-     * 
- * @param fieldName The name of the property. - * @return read-method name. - */ - public static String getPrimitiveBooleanReadMethodName(String fieldName) { - return buildMethodName(IS_PREFIX, fieldName); - } - - /** - * Returns read-method name. - *

Example 1:

-     * Field field = Foo.class.getDeclaredField("name"); // Assume that the field type is not boolean.
-     * String methodName = getReadMethodName(field); // The method name is "getName".
-     * 
- *

Example 2:

-     * Field field = Foo.class.getDeclaredField("success"); // Assume that the field type is boolean.
-     * String methodName = getReadMethodName(field); // The method name is "isSuccess".
-     * 
- * @param field {@link Field} - * @return read-method name. - */ - public static String getReadMethodName(Field field) { - return getReadMethodName(field.getName(), field.getType() == boolean.class); - } - - /** - * Returns read-method name. - *

Example 1:

-     * Field field = Foo.class.getDeclaredField("name"); // Assume that the field type is not boolean./code>
-     * String methodName = getReadMethodName(field, false); // The method name is "getName".
-     * 
- *

Example 2:

-     * Field field = Foo.class.getDeclaredField("success"); // Assume that the field type is boolean.
-     * String methodName = getReadMethodName(field, true); // The method name is "isSuccess".
-     * 
- * @param field {@link Field} - * @param primitiveBoolean Whether the field type is primitive boolean. - * @return read-method name. - */ - public static String getReadMethodName(Field field, boolean primitiveBoolean) { - return getReadMethodName(field.getName(), primitiveBoolean); - } - - /** - * Returns write-method name. - *

Example:

-     * String methodName = getWriteMethodName("name"); // The method name is "setName".
-     * 
- * @param fieldName The name of the property. - * @return write-method name. - */ - public static String getWriteMethodName(String fieldName) { - return buildMethodName(SET_PREFIX, fieldName); - } - - /** - * Returns write-method name. - *

Example:

-     * Field field = Foo.class.getDeclaredField("name");
-     * String methodName = getWriteMethodName(field); // The method name is "setName".
-     * 
- * @param field {@link Field} - * @return write-method name. - */ - public static String getWriteMethodName(Field field) { - return buildMethodName(SET_PREFIX, field.getName()); - } - - /** - * Returns read-method. - *

Example:

-     * Method method = getReadMethod(Foo.class, "name");
-     * 
- * @param type The Class object for the target bean. - * @param fieldName The name of the property. - * @return read-method - * @throws IntrospectionException if an exception occurs during introspection. - */ - public static Method getReadMethod(Class type, String fieldName) throws IntrospectionException { - return getPropertyDescriptor(fieldName, type).getReadMethod(); - } - - /** - * Returns read-method. - *

Example:

-     * Field field = Foo.class.getDeclaredField("name");
-     * Method method = getReadMethod(field);
-     * 
- * @param field {@link Field} - * @return read-method - * @throws IntrospectionException if an exception occurs during introspection. - */ - public static Method getReadMethod(Field field) throws IntrospectionException { - return getReadMethod(field.getDeclaringClass(), field.getName()); - } - - /** - * Returns write-method. - *

Example:

-     * String methodName = getWriteMethod(Foo.class, "name");
-     * 
- * @param type The Class object for the target bean - * @param fieldName The name of the property - * @return write-method - * @throws IntrospectionException if an exception occurs during introspection. - */ - public static Method getWriteMethod(Class type, String fieldName) throws IntrospectionException { - return getPropertyDescriptor(fieldName, type).getWriteMethod(); - } - - /** - * Returns write-method. - *

Example:

-     * Field field = Foo.class.getDeclaredField("name");
-     * Method method = getWriteMethod(field);
-     * 
- * @param field {@link Field} - * @return read-method - * @throws IntrospectionException if an exception occurs during introspection. - */ - public static Method getWriteMethod(Field field) throws IntrospectionException { - return getWriteMethod(field.getDeclaringClass(), field.getName()); - } - - /** - * Returns value of the field of the object. - * @param o Target bean - * @param fieldName The name of the property - * @return value - * @throws IntrospectionException if an exception occurs during introspection. - * @throws NoSuchMethodException if method is not found. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Object read(Object o, String fieldName) throws IntrospectionException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - Method method = getReadMethod(o.getClass(), fieldName); - if (method == null) { - throw new NoSuchMethodException(); - } - if (!Modifier.isPublic(method.getModifiers())) { - method.setAccessible(true); - } - return method.invoke(o); - } - - /** - * Returns value of the field of the object. - * @param o Target bean - * @param field {@link Field} - * @return value - * @throws IntrospectionException if an exception occurs during introspection. - * @throws NoSuchMethodException if method is not found. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Object read(Object o, Field field) throws IntrospectionException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - Method method = getReadMethod(o.getClass(), field.getName()); - if (method == null) { - throw new NoSuchMethodException(); - } - if (!Modifier.isPublic(method.getModifiers())) { - method.setAccessible(true); - } - return method.invoke(o); - } - - /** - * Invokes method. - * @param o Target bean - * @param method {@link Method} - * @return value - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Object read(Object o, Method method) throws IllegalAccessException, InvocationTargetException { - if (!Modifier.isPublic(method.getModifiers())) { - method.setAccessible(true); - } - return method.invoke(o); - } - - /** - * Returns value of the field of the object. - * @param o Target bean - * @param fieldName The name of the property - * @param returnType The return type - * @return value - * @throws IntrospectionException if an exception occurs during introspection. - * @throws NoSuchMethodException if method is not found. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static T read(Object o, String fieldName, Class returnType) throws IntrospectionException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - Object value = read(o, fieldName); - if (value != null) { - return returnType.cast(value); - } - return null; - } - - /** - * Returns value of the field of the object. - * @param o Target bean - * @param field {@link Field} - * @param returnType The return type - * @return value - * @throws IntrospectionException if an exception occurs during introspection. - * @throws NoSuchMethodException if method is not found. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static T read(Object o, Field field, Class returnType) throws IntrospectionException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - Object value = read(o, field); - if (value != null) { - return returnType.cast(value); - } - return null; - } - - /** - * Invokes method. - * @param o Target bean - * @param method {@link Method} - * @param returnType The return type - * @return value - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static T read(Object o, Method method, Class returnType) throws IllegalAccessException, InvocationTargetException { - Object value = read(o, method); - if (value != null) { - return returnType.cast(value); - } - return null; - } - - /** - * Returns values of all fields of the object. - * @param o Target bean - * @return values - * @throws IntrospectionException if an exception occurs during introspection. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Map readAll(Object o) throws IntrospectionException, IllegalAccessException, InvocationTargetException { - return readAll(o, HashMap::new); - } - - /** - * Returns values of all fields of the object. - * @param o Target bean - * @param mapFactory The map factory - * @return values - * @throws IntrospectionException if an exception occurs during introspection. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Map readAll(Object o, Supplier> mapFactory) throws IllegalAccessException, InvocationTargetException, IntrospectionException { - PropertyDescriptor[] descriptors = getPropertyDescriptors(o.getClass()); - Map map = mapFactory.get(); - for (PropertyDescriptor descriptor : descriptors) { - map.put(descriptor.getName(), read(o, descriptor.getReadMethod())); - } - return map; - } - - /** - * Returns values of all fields of the object. - * @param o Target bean - * @param mapFactory The map factory - * @param keyMapper The mapping function to produce keys - * @param valueMapper The mapping function to produce values - * @return values - * @throws IntrospectionException if an exception occurs during introspection. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Map readAll(Object o, Supplier> mapFactory, Function keyMapper, Function valueMapper) throws IllegalAccessException, InvocationTargetException, IntrospectionException { - PropertyDescriptor[] descriptors = getPropertyDescriptors(o.getClass()); - Map map = mapFactory.get(); - for (PropertyDescriptor descriptor : descriptors) { - String key = descriptor.getName(); - Object value = read(o, descriptor.getReadMethod()); - if (key != null && value != null) { - map.put(keyMapper.apply(key), valueMapper.apply(value)); - } - } - return map; - } - - /** - * Returns an object of the specified type by a map。 - * @param map The map - * @param beanFactory The bean factory - * @return object - */ - public static T fromMap(Map map, Supplier beanFactory) { - T bean = beanFactory.get(); - for (Map.Entry entry : map.entrySet()) { - if (entry.getKey() == null || entry.getValue() == null) { - continue; - } - try { - write(bean, String.valueOf(entry.getKey()), entry.getValue()); - } catch (Exception ignored) { - // ignored - } - } - return bean; - } - - /** - * Invokes the underlying method represented by field name. - * @param o Target bean - * @param fieldName The name of the property - * @param arg The argument used for the method call - * @return result - * @throws IntrospectionException if an exception occurs during introspection. - * @throws NoSuchMethodException if method is not found. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Object write(Object o, String fieldName, Object arg) throws IntrospectionException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - Method method = getWriteMethod(o.getClass(), fieldName); - if (method == null) { - throw new NoSuchMethodException(); - } - if (!Modifier.isPublic(method.getModifiers())) { - method.setAccessible(true); - } - return method.invoke(o, arg); - } - - /** - * Invokes the underlying method represented by field. - * @param o Target bean - * @param field {@link Field} - * @param arg The argument used for the method call - * @return result - * @throws IntrospectionException if an exception occurs during introspection. - * @throws NoSuchMethodException if method is not found. - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Object write(Object o, Field field, Object arg) throws IntrospectionException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - Method method = getWriteMethod(o.getClass(), field.getName()); - if (method == null) { - throw new NoSuchMethodException(); - } - if (!Modifier.isPublic(method.getModifiers())) { - method.setAccessible(true); - } - return method.invoke(o, arg); - } - - /** - * Invokes method. - * @param o Target bean - * @param method {@link Method} - * @param arg The argument used for the method call - * @return result - * @throws IllegalAccessException if the method is not accessible. - * @throws InvocationTargetException if the underlying method throws an exception. - */ - public static Object write(Object o, Method method, Object arg) throws IllegalAccessException, InvocationTargetException { - if (!Modifier.isPublic(method.getModifiers())) { - method.setAccessible(true); - } - return method.invoke(o, arg); - } - - /** - * Returns a {@link PropertyDescriptor} for a property that follows - * the standard Java convention. - * @param propertyName The programmatic name of the property - * @param beanClass The Class object for the target bean - * @throws IntrospectionException if an exception occurs during introspection. - */ - public static PropertyDescriptor getPropertyDescriptor(String propertyName, Class beanClass) throws IntrospectionException { - return new PropertyDescriptor(propertyName, beanClass); - } - - /** - * Returns a {@link PropertyDescriptor} of a simple property, and method - * names for reading and writing the property. - * @param propertyName The programmatic name of the property. - * @param beanClass The Class object for the target bean. - * @param readMethodName The name of the method used for reading the property value. - * @param writeMethodName The name of the method used for writing the property value. - * @throws IntrospectionException if an exception occurs during introspection. - */ - public static PropertyDescriptor getPropertyDescriptor(String propertyName, Class beanClass, String readMethodName, String writeMethodName) throws IntrospectionException { - return new PropertyDescriptor(propertyName, beanClass, readMethodName, writeMethodName); - } - - /** - * Returns a {@link PropertyDescriptor} of a simple property, and Method - * objects for reading and writing the property. - * @param propertyName The programmatic name of the property. - * @param readMethod The method used for reading the property value. - * @param writeMethod The method used for writing the property value. - * @throws IntrospectionException if an exception occurs during introspection. - */ - public static PropertyDescriptor getPropertyDescriptor(String propertyName, Method readMethod, Method writeMethod) throws IntrospectionException { - return new PropertyDescriptor(propertyName, readMethod, writeMethod); - } - - /** - * Returns descriptors for all properties of the bean. - * @param beanClass The bean class to be analyzed - * @return an array of {@code PropertyDescriptor} objects - * @throws IntrospectionException if an exception occurs during introspection. - */ - public static PropertyDescriptor[] getPropertyDescriptors(Class beanClass) throws IntrospectionException { - return Introspector.getBeanInfo(beanClass).getPropertyDescriptors(); - } - - /** - * Returns a {@link String} which capitalizes the first letter of the string. - */ - private static String buildMethodName(String prefix, String s) { - if (s == null || s.length() == 0) { - return null; - } - if (Character.isUpperCase(s.charAt(0)) || s.length() > 1 && Character.isUpperCase(s.charAt(1))) { - return prefix + s; - } - return prefix + s.substring(0, 1).toUpperCase() + s.substring(1); - } - -} diff --git a/mypages/src/main/java/io/leego/mypages/util/Page.java b/mypages/src/main/java/io/leego/mypages/util/Page.java index 031bfac..926c43d 100644 --- a/mypages/src/main/java/io/leego/mypages/util/Page.java +++ b/mypages/src/main/java/io/leego/mypages/util/Page.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Objects; +import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -188,7 +188,6 @@ public static Page transfer(Collection source, Collection target } private static List mapping(Collection source, Function mapper) { - Objects.requireNonNull(mapper); if (source == null || source.isEmpty()) { return new ArrayList<>(); } @@ -210,6 +209,13 @@ public Page map(Function converter) { page, size, total, pages, next, previous, extra); } + public Page peek(Consumer action) { + if (list != null) { + list.forEach(action); + } + return this; + } + public List getList() { return list; } @@ -346,4 +352,16 @@ public Page build() { } + @Override + public String toString() { + return "{page=" + page + + ", size=" + size + + ", total=" + total + + ", pages=" + pages + + ", next=" + next + + ", previous=" + previous + + ", extra=" + extra + + ", list=" + list + + '}'; + } } diff --git a/mypages/src/main/java/io/leego/mypages/util/Pageable.java b/mypages/src/main/java/io/leego/mypages/util/Pageable.java index 29661e1..d34056a 100644 --- a/mypages/src/main/java/io/leego/mypages/util/Pageable.java +++ b/mypages/src/main/java/io/leego/mypages/util/Pageable.java @@ -12,10 +12,14 @@ public interface Pageable { Integer getSize(); /** Returns zero-based row index. */ - Integer getOffset(); + default Long getOffset() { + return null; + } /** Returns the rows of the page to be returned. */ - Integer getRows(); + default Integer getRows() { + return null; + } /** Returns the column name or expression. */ default String getCountExpr() { diff --git a/mypages/src/main/java/io/leego/mypages/util/PaginationUnrefinedParam.java b/mypages/src/main/java/io/leego/mypages/util/PaginationDefinition.java similarity index 56% rename from mypages/src/main/java/io/leego/mypages/util/PaginationUnrefinedParam.java rename to mypages/src/main/java/io/leego/mypages/util/PaginationDefinition.java index 52bbb29..bbdced5 100644 --- a/mypages/src/main/java/io/leego/mypages/util/PaginationUnrefinedParam.java +++ b/mypages/src/main/java/io/leego/mypages/util/PaginationDefinition.java @@ -1,59 +1,64 @@ package io.leego.mypages.util; +import java.lang.reflect.Field; import java.lang.reflect.Method; /** * @author Yihleego */ -public class PaginationUnrefinedParam { - private static final PaginationUnrefinedParam INVALIDATION = new PaginationUnrefinedParam(false); +public class PaginationDefinition { + public static final PaginationDefinition INVALID = new PaginationDefinition(false); private int defaultPage; private int defaultSize; private int maxPage; private int maxSize; private String countExpr; + private Field pageField; + private Field sizeField; + private Field offsetField; + private Field rowsField; + private Field countExprField; + private Field countMethodNameField; private Method pageReadMethod; private Method sizeReadMethod; private Method offsetReadMethod; private Method rowsReadMethod; private Method countExprReadMethod; private Method countMethodNameReadMethod; - private boolean mapType; + private String nestedMapKey; private final boolean valid; - public PaginationUnrefinedParam(boolean valid) { + public PaginationDefinition(boolean valid) { this.valid = valid; } - public PaginationUnrefinedParam(int defaultPage, int defaultSize, int maxPage, int maxSize, String countExpr, boolean mapType, boolean valid) { + public PaginationDefinition(int defaultPage, int defaultSize, int maxPage, int maxSize, String countExpr) { this.defaultPage = defaultPage; this.defaultSize = defaultSize; this.maxPage = maxPage; this.maxSize = maxSize; this.countExpr = countExpr; - this.mapType = mapType; - this.valid = valid; + this.valid = true; } - public static PaginationUnrefinedParam invalidation() { - return INVALIDATION; + public PaginationDefinition setFields(Field pageField, Field sizeField, Field offsetField, Field rowsField, Field countExprField, Field countMethodNameField) { + this.pageField = pageField; + this.sizeField = sizeField; + this.offsetField = offsetField; + this.rowsField = rowsField; + this.countExprField = countExprField; + this.countMethodNameField = countMethodNameField; + return this; } - public void setMethods(Method pageReadMethod, Method sizeReadMethod, Method offsetReadMethod, Method rowsReadMethod, Method countExprReadMethod, Method countMethodNameReadMethod) { + public PaginationDefinition setMethods(Method pageReadMethod, Method sizeReadMethod, Method offsetReadMethod, Method rowsReadMethod, Method countExprReadMethod, Method countMethodNameReadMethod) { this.pageReadMethod = pageReadMethod; this.sizeReadMethod = sizeReadMethod; this.offsetReadMethod = offsetReadMethod; this.rowsReadMethod = rowsReadMethod; this.countExprReadMethod = countExprReadMethod; this.countMethodNameReadMethod = countMethodNameReadMethod; - } - - public boolean isValid() { - return valid; - } - - public boolean isInvalid() { - return !valid; + return this; } public int getDefaultPage() { @@ -96,6 +101,54 @@ public void setCountExpr(String countExpr) { this.countExpr = countExpr; } + public Field getPageField() { + return pageField; + } + + public void setPageField(Field pageField) { + this.pageField = pageField; + } + + public Field getSizeField() { + return sizeField; + } + + public void setSizeField(Field sizeField) { + this.sizeField = sizeField; + } + + public Field getOffsetField() { + return offsetField; + } + + public void setOffsetField(Field offsetField) { + this.offsetField = offsetField; + } + + public Field getRowsField() { + return rowsField; + } + + public void setRowsField(Field rowsField) { + this.rowsField = rowsField; + } + + public Field getCountExprField() { + return countExprField; + } + + public void setCountExprField(Field countExprField) { + this.countExprField = countExprField; + } + + public Field getCountMethodNameField() { + return countMethodNameField; + } + + public void setCountMethodNameField(Field countMethodNameField) { + this.countMethodNameField = countMethodNameField; + } + public Method getPageReadMethod() { return pageReadMethod; } @@ -144,12 +197,15 @@ public void setCountMethodNameReadMethod(Method countMethodNameReadMethod) { this.countMethodNameReadMethod = countMethodNameReadMethod; } - public boolean isMapType() { - return mapType; + public String getNestedMapKey() { + return nestedMapKey; } - public void setMapType(boolean mapType) { - this.mapType = mapType; + public void setNestedMapKey(String nestedMapKey) { + this.nestedMapKey = nestedMapKey; } + public boolean isValid() { + return valid; + } } diff --git a/mypages/src/main/java/io/leego/mypages/util/PaginationParam.java b/mypages/src/main/java/io/leego/mypages/util/PaginationParameter.java similarity index 68% rename from mypages/src/main/java/io/leego/mypages/util/PaginationParam.java rename to mypages/src/main/java/io/leego/mypages/util/PaginationParameter.java index 49d8297..ecac768 100644 --- a/mypages/src/main/java/io/leego/mypages/util/PaginationParam.java +++ b/mypages/src/main/java/io/leego/mypages/util/PaginationParameter.java @@ -3,43 +3,27 @@ /** * @author Yihleego */ -public class PaginationParam { - private static final PaginationParam NON = new PaginationParam(false); +public class PaginationParameter { /** One-based page index */ protected Integer page; /** The size of the page to be returned */ protected Integer size; /** Zero-based row index */ - protected Integer offset; + protected Long offset; /** The rows of the page to be returned */ protected Integer rows; /** The column name or expression, the default value is "*". */ protected String countExpr; /** The count method name. */ protected String countMethodName; - /** Whether to paging */ - protected final boolean pageable; - public PaginationParam(boolean pageable) { - this.pageable = pageable; - } - - public PaginationParam(Integer page, Integer size, Integer offset, Integer rows, String countExpr, String countMethodName, boolean pageable) { + public PaginationParameter(Integer page, Integer size, Long offset, Integer rows, String countExpr, String countMethodName) { this.page = page; this.size = size; this.offset = offset; this.rows = rows; this.countExpr = countExpr; this.countMethodName = countMethodName; - this.pageable = pageable; - } - - public static PaginationParam nonPagination() { - return NON; - } - - public boolean isPageable() { - return pageable; } public Integer getPage() { @@ -58,11 +42,11 @@ public void setSize(Integer size) { this.size = size; } - public Integer getOffset() { + public Long getOffset() { return offset; } - public void setOffset(Integer offset) { + public void setOffset(Long offset) { this.offset = offset; } @@ -89,5 +73,4 @@ public String getCountMethodName() { public void setCountMethodName(String countMethodName) { this.countMethodName = countMethodName; } - } diff --git a/mypages/src/main/java/io/leego/mypages/util/ReflectUtils.java b/mypages/src/main/java/io/leego/mypages/util/ReflectUtils.java deleted file mode 100644 index 95588ff..0000000 --- a/mypages/src/main/java/io/leego/mypages/util/ReflectUtils.java +++ /dev/null @@ -1,489 +0,0 @@ -package io.leego.mypages.util; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * @author Yihleego - */ -public final class ReflectUtils { - private static final Field[] EMPTY_FIELDS = new Field[0]; - private static final Method[] EMPTY_METHODS = new Method[0]; - - private ReflectUtils() { - } - - public static Field getField(Object o, String fieldName) throws NoSuchFieldException { - return o.getClass().getField(fieldName); - } - - public static Field getField(Class clazz, String fieldName) throws NoSuchFieldException { - return clazz.getField(fieldName); - } - - public static Field[] getFields(Object o) { - return o.getClass().getFields(); - } - - public static Field[] getFields(Class clazz) { - return clazz.getFields(); - } - - public static Field[] getFields(Object o, boolean excludeStatic) { - return getFields(o.getClass(), excludeStatic); - } - - public static Field[] getFields(Class clazz, boolean excludeStatic) { - if (!excludeStatic) { - return clazz.getFields(); - } - Field[] fields = clazz.getFields(); - if (fields.length == 0) { - return EMPTY_FIELDS; - } - List list = new ArrayList<>(fields.length); - for (Field field : fields) { - if (!isStatic(field)) { - list.add(field); - } - } - return list.toArray(EMPTY_FIELDS); - } - - public static Field getDeclaredField(Object o, String fieldName) throws NoSuchFieldException { - return o.getClass().getDeclaredField(fieldName); - } - - public static Field getDeclaredField(Class clazz, String fieldName) throws NoSuchFieldException { - return clazz.getDeclaredField(fieldName); - } - - public static Field[] getDeclaredFields(Object o) { - return o.getClass().getDeclaredFields(); - } - - public static Field[] getDeclaredFields(Class clazz) { - return clazz.getDeclaredFields(); - } - - public static Field[] getDeclaredFields(Object o, boolean excludeStatic) { - return getDeclaredFields(o.getClass(), excludeStatic); - } - - public static Field[] getDeclaredFields(Class clazz, boolean excludeStatic) { - if (!excludeStatic) { - return clazz.getDeclaredFields(); - } - Field[] fields = clazz.getDeclaredFields(); - if (fields.length == 0) { - return EMPTY_FIELDS; - } - List list = new ArrayList<>(fields.length); - for (Field field : fields) { - if (!isStatic(field)) { - list.add(field); - } - } - return list.toArray(EMPTY_FIELDS); - } - - public static Field getDeepField(Object o, String fieldName) throws NoSuchFieldException { - return getDeepField(o.getClass(), fieldName); - } - - public static Field getDeepField(Class clazz, String fieldName) throws NoSuchFieldException { - if (fieldName == null) { - throw new NullPointerException(); - } - Class targetClass = clazz; - while (targetClass != null && targetClass != Object.class) { - Field[] fields = targetClass.getDeclaredFields(); - for (Field field : fields) { - if (field.getName().equals(fieldName)) { - return field; - } - } - targetClass = targetClass.getSuperclass(); - } - throw new NoSuchFieldException(fieldName); - } - - public static Field[] getDeepFields(Object o) { - return getDeepFields(o.getClass(), false); - } - - public static Field[] getDeepFields(Class clazz) { - return getDeepFields(clazz, false); - } - - public static Field[] getDeepFields(Object o, boolean excludeStatic) { - return getDeepFields(o.getClass(), excludeStatic); - } - - public static Field[] getDeepFields(Class clazz, boolean excludeStatic) { - List list = new ArrayList<>(); - Class targetClass = clazz; - while (targetClass != null && targetClass != Object.class) { - Field[] fields = targetClass.getDeclaredFields(); - if (excludeStatic) { - for (Field field : fields) { - if (!isStatic(field)) { - list.add(field); - } - } - } else { - Collections.addAll(list, fields); - } - targetClass = targetClass.getSuperclass(); - } - return list.toArray(EMPTY_FIELDS); - } - - public static Object getFieldValue(Object o, Field field) throws IllegalAccessException { - return field.get(o); - } - - public static Object getFieldValue(Object o, Field field, boolean accessible) throws IllegalAccessException { - setAccessible(field, accessible); - return field.get(o); - } - - public static Object getFieldValue(Object o, String fieldName) throws NoSuchFieldException, IllegalAccessException { - return getDeepField(o, fieldName).get(o); - } - - public static Object getFieldValue(Object o, String fieldName, boolean accessible) throws NoSuchFieldException, IllegalAccessException { - Field field = getDeepField(o, fieldName); - setAccessible(field, accessible); - return field.get(o); - } - - public static void setFieldValue(Object o, Field field, Object value) throws IllegalAccessException { - field.set(o, value); - } - - public static void setFieldValue(Object o, Field field, Object value, boolean accessible) throws IllegalAccessException { - setAccessible(field, accessible); - field.set(o, value); - } - - public static void setFieldValue(Object o, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException { - getDeepField(o, fieldName).set(o, value); - } - - public static void setFieldValue(Object o, String fieldName, Object value, boolean accessible) throws NoSuchFieldException, IllegalAccessException { - Field field = getDeepField(o, fieldName); - setAccessible(field, accessible); - field.set(o, value); - } - - - public static Method getMethod(Object o, String methodName, Class... parameterTypes) throws NoSuchMethodException { - return o.getClass().getMethod(methodName, parameterTypes); - } - - public static Method getMethod(Class clazz, String methodName, Class... parameterTypes) throws NoSuchMethodException { - return clazz.getMethod(methodName, parameterTypes); - } - - public static Method[] getMethods(Object o) { - return o.getClass().getMethods(); - } - - public static Method[] getMethods(Class clazz) { - return clazz.getMethods(); - } - - public static Method[] getMethods(Object o, boolean excludeStatic) { - return getMethods(o.getClass(), excludeStatic); - } - - public static Method[] getMethods(Class clazz, boolean excludeStatic) { - if (!excludeStatic) { - return clazz.getMethods(); - } - Method[] methods = clazz.getMethods(); - if (methods.length == 0) { - return EMPTY_METHODS; - } - List list = new ArrayList<>(methods.length); - for (Method method : methods) { - if (!isStatic(method)) { - list.add(method); - } - } - return list.toArray(EMPTY_METHODS); - } - - public static Method getDeclaredMethod(Object o, String methodName, Class... parameterTypes) throws NoSuchMethodException { - return o.getClass().getDeclaredMethod(methodName, parameterTypes); - } - - public static Method getDeclaredMethod(Class clazz, String methodName, Class... parameterTypes) throws NoSuchMethodException { - return clazz.getDeclaredMethod(methodName, parameterTypes); - } - - public static Method[] getDeclaredMethods(Object o) { - return o.getClass().getDeclaredMethods(); - } - - public static Method[] getDeclaredMethods(Class clazz) { - return clazz.getDeclaredMethods(); - } - - public static Method[] getDeclaredMethods(Object o, boolean excludeStatic) { - return getDeclaredMethods(o.getClass(), excludeStatic); - } - - public static Method[] getDeclaredMethods(Class clazz, boolean excludeStatic) { - if (!excludeStatic) { - return clazz.getDeclaredMethods(); - } - Method[] methods = clazz.getDeclaredMethods(); - if (methods.length == 0) { - return EMPTY_METHODS; - } - List list = new ArrayList<>(methods.length); - for (Method method : methods) { - if (!isStatic(method)) { - list.add(method); - } - } - return list.toArray(EMPTY_METHODS); - } - - public static Method getDeepMethod(Object o, String methodName, Class... parameterTypes) throws NoSuchMethodException { - return getDeepMethod(o.getClass(), methodName, parameterTypes); - } - - public static Method getDeepMethod(Class clazz, String methodName, Class... parameterTypes) throws NoSuchMethodException { - if (methodName == null) { - throw new NullPointerException(); - } - NoSuchMethodException exception = null; - Class targetClass = clazz; - while (targetClass != null && targetClass != Object.class) { - try { - return targetClass.getDeclaredMethod(methodName, parameterTypes); - } catch (NoSuchMethodException e) { - if (exception == null) { - exception = e; - } - } - targetClass = targetClass.getSuperclass(); - } - if (exception == null) { - throw new NoSuchMethodException(methodName); - } else { - throw exception; - } - } - - public static Method[] getDeepMethods(Object o) { - return getDeepMethods(o.getClass(), false); - } - - public static Method[] getDeepMethods(Class clazz) { - return getDeepMethods(clazz, false); - } - - public static Method[] getDeepMethods(Object o, boolean excludeStatic) { - return getDeepMethods(o.getClass(), excludeStatic); - } - - public static Method[] getDeepMethods(Class clazz, boolean excludeStatic) { - List list = new ArrayList<>(); - Class targetClass = clazz; - while (targetClass != null && targetClass != Object.class) { - Method[] methods = targetClass.getDeclaredMethods(); - if (excludeStatic) { - for (Method method : methods) { - if (!isStatic(method)) { - list.add(method); - } - } - } else { - Collections.addAll(list, methods); - } - targetClass = targetClass.getSuperclass(); - } - return list.toArray(EMPTY_METHODS); - } - - public static Object invoke(Object o, Method method) throws IllegalAccessException, InvocationTargetException { - return method.invoke(o); - } - - public static Object invoke(Object o, Method method, Object... args) throws IllegalAccessException, InvocationTargetException { - return method.invoke(o, args); - } - - - public static A getDeclaredAnnotation(Object o, Class annotationClass) { - return o.getClass().getDeclaredAnnotation(annotationClass); - } - - public static A getDeclaredAnnotation(Class clazz, Class annotationClass) { - return clazz.getDeclaredAnnotation(annotationClass); - } - - public static Annotation[] getDeclaredAnnotations(Object o) { - return o.getClass().getDeclaredAnnotations(); - } - - public static Annotation[] getDeclaredAnnotations(Class clazz) { - return clazz.getDeclaredAnnotations(); - } - - public static A getAnnotation(Object o, Class annotationClass) { - return o.getClass().getAnnotation(annotationClass); - } - - public static A getAnnotation(Class clazz, Class annotationClass) { - return clazz.getAnnotation(annotationClass); - } - - public static Annotation[] getAnnotations(Object o) { - return o.getClass().getAnnotations(); - } - - public static Annotation[] getAnnotations(Class clazz) { - return clazz.getAnnotations(); - } - - public static A getDeclaredAnnotation(Field field, Class annotationClass) { - return field.getDeclaredAnnotation(annotationClass); - } - - public static Annotation[] getDeclaredAnnotations(Field field) { - return field.getDeclaredAnnotations(); - } - - public static A getAnnotation(Field field, Class annotationClass) { - return field.getAnnotation(annotationClass); - } - - public static Annotation[] getAnnotations(Field field) { - return field.getAnnotations(); - } - - public static A getDeclaredAnnotation(Method method, Class annotationClass) { - return method.getDeclaredAnnotation(annotationClass); - } - - public static Annotation[] getDeclaredAnnotations(Method method) { - return method.getDeclaredAnnotations(); - } - - public static A getAnnotation(Method method, Class annotationClass) { - return method.getAnnotation(annotationClass); - } - - public static Annotation[] getAnnotations(Method method) { - return method.getAnnotations(); - } - - - public static boolean isInterface(Class clazz) { - return Modifier.isInterface(clazz.getModifiers()); - } - - public static boolean isAbstract(Class clazz) { - return Modifier.isAbstract(clazz.getModifiers()); - } - - public static boolean isPublic(Class clazz) { - return Modifier.isPublic(clazz.getModifiers()); - } - - public static boolean isPublic(Field field) { - return Modifier.isPublic(field.getModifiers()); - } - - public static boolean isPublic(Method method) { - return Modifier.isPublic(method.getModifiers()); - } - - public static boolean isPrivate(Class clazz) { - return Modifier.isPrivate(clazz.getModifiers()); - } - - public static boolean isPrivate(Field field) { - return Modifier.isPrivate(field.getModifiers()); - } - - public static boolean isPrivate(Method method) { - return Modifier.isPrivate(method.getModifiers()); - } - - public static boolean isProtected(Class clazz) { - return Modifier.isProtected(clazz.getModifiers()); - } - - public static boolean isProtected(Field field) { - return Modifier.isProtected(field.getModifiers()); - } - - public static boolean isProtected(Method method) { - return Modifier.isProtected(method.getModifiers()); - } - - public static boolean isStatic(Class clazz) { - return Modifier.isStatic(clazz.getModifiers()); - } - - public static boolean isStatic(Field field) { - return Modifier.isStatic(field.getModifiers()); - } - - public static boolean isStatic(Method method) { - return Modifier.isStatic(method.getModifiers()); - } - - public static boolean isFinal(Class clazz) { - return Modifier.isFinal(clazz.getModifiers()); - } - - public static boolean isFinal(Field field) { - return Modifier.isFinal(field.getModifiers()); - } - - public static boolean isFinal(Method method) { - return Modifier.isFinal(method.getModifiers()); - } - - public static boolean isVolatile(Field field) { - return Modifier.isVolatile(field.getModifiers()); - } - - public static boolean isTransient(Field field) { - return Modifier.isTransient(field.getModifiers()); - } - - public static boolean isSynchronized(Method method) { - return Modifier.isSynchronized(method.getModifiers()); - } - - public static boolean isNative(Method method) { - return Modifier.isNative(method.getModifiers()); - } - - public static void setAccessible(Method method, boolean flag) { - if (!isPublic(method)) { - method.setAccessible(flag); - } - } - - public static void setAccessible(Field field, boolean flag) { - if (!isPublic(field)) { - field.setAccessible(flag); - } - } - -} \ No newline at end of file diff --git a/mypages/src/main/java/io/leego/mypages/util/Replacement.java b/mypages/src/main/java/io/leego/mypages/util/Replacement.java new file mode 100644 index 0000000..979dd36 --- /dev/null +++ b/mypages/src/main/java/io/leego/mypages/util/Replacement.java @@ -0,0 +1,39 @@ +package io.leego.mypages.util; + +/** + * @author Yihleego + */ +public class Replacement implements Comparable { + private final int begin; + private final int end; + private final String value; + + public Replacement(int begin, int end) { + this.begin = begin; + this.end = end; + this.value = null; + } + + public Replacement(int begin, int end, String value) { + this.begin = begin; + this.end = end; + this.value = value; + } + + public int getBegin() { + return begin; + } + + public int getEnd() { + return end; + } + + public String getValue() { + return value; + } + + @Override + public int compareTo(Replacement o) { + return Integer.compare(this.begin, o.begin); + } +} diff --git a/mypages/src/main/java/io/leego/mypages/util/SqlUtils.java b/mypages/src/main/java/io/leego/mypages/util/SqlUtils.java index f89f065..4ea8ec5 100644 --- a/mypages/src/main/java/io/leego/mypages/util/SqlUtils.java +++ b/mypages/src/main/java/io/leego/mypages/util/SqlUtils.java @@ -1,209 +1,219 @@ package io.leego.mypages.util; -import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause; -import com.alibaba.druid.sql.ast.statement.SQLSelectItem; -import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; -import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; -import com.alibaba.druid.util.JdbcConstants; -import io.leego.mypages.dialect.SqlDialect; -import io.leego.mypages.exception.IllegalSqlException; - -import java.util.Arrays; -import java.util.Collections; +import io.leego.mypages.sql.SQLLexer; +import io.leego.mypages.sql.SQLParser; +import io.leego.mypages.sql.SQLParser.AggregationClauseContext; +import io.leego.mypages.sql.SQLParser.ColumnReferenceContext; +import io.leego.mypages.sql.SQLParser.ConstantDefaultContext; +import io.leego.mypages.sql.SQLParser.CurrentLikeContext; +import io.leego.mypages.sql.SQLParser.DereferenceContext; +import io.leego.mypages.sql.SQLParser.ExpressionContext; +import io.leego.mypages.sql.SQLParser.HavingClauseContext; +import io.leego.mypages.sql.SQLParser.IdentifierContext; +import io.leego.mypages.sql.SQLParser.NamedExpressionContext; +import io.leego.mypages.sql.SQLParser.NamedExpressionSeqContext; +import io.leego.mypages.sql.SQLParser.OverlayContext; +import io.leego.mypages.sql.SQLParser.PredicatedContext; +import io.leego.mypages.sql.SQLParser.QueryContext; +import io.leego.mypages.sql.SQLParser.QueryOrganizationContext; +import io.leego.mypages.sql.SQLParser.QueryPrimaryContext; +import io.leego.mypages.sql.SQLParser.QueryPrimaryDefaultContext; +import io.leego.mypages.sql.SQLParser.QuerySpecificationContext; +import io.leego.mypages.sql.SQLParser.QueryTermContext; +import io.leego.mypages.sql.SQLParser.QueryTermDefaultContext; +import io.leego.mypages.sql.SQLParser.RegularQuerySpecificationContext; +import io.leego.mypages.sql.SQLParser.SelectClauseContext; +import io.leego.mypages.sql.SQLParser.SetQuantifierContext; +import io.leego.mypages.sql.SQLParser.SingleStatementContext; +import io.leego.mypages.sql.SQLParser.StarContext; +import io.leego.mypages.sql.SQLParser.StatementDefaultContext; +import io.leego.mypages.sql.SQLParser.SubqueryContext; +import io.leego.mypages.sql.SQLParser.SubstringContext; +import io.leego.mypages.sql.SQLParser.TrimContext; +import io.leego.mypages.sql.SQLParser.ValueExpressionContext; +import io.leego.mypages.sql.SQLParser.ValueExpressionDefaultContext; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.TerminalNode; + +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; /** * @author Yihleego */ public final class SqlUtils { - public static final String ASTERISK = "*"; - private static final String DEFAULT_TABLE_ALIAS = "DTA"; - private static final char OPENING_PARENTHESIS = '('; - private static final char CLOSING_PARENTHESIS = ')'; - private static final SQLExpr COUNT_EXPR = SQLUtils.toSQLExpr("COUNT(*)"); - /** Aggregate functions */ - private static final String[] AGGREGATE_FUNCTION_NAMES = { - "avg", - "binary_checksum", "bit_and", "bit_or", "bit_xor", - "checksum", "checksum_agg", "count", "count_big", - "first", - "group_concat", "grouping", - "last", - "max", "median", "min", - "rank", - "std", "stddev", "stddev_pop", "stddev_samp", "stdev", "stdevp", "sum", - "var", "var_pop", "var_samp", "variance", "varp", - }; - private static final Map> AGGREGATE_FUNCTION_MAP = buildAggregateMap(AGGREGATE_FUNCTION_NAMES); + private static final String ASTERISK = "*"; private SqlUtils() { } - public static String toCountSql(String sql, String alias) { - return toCountSql(sql, null, alias, null); + public static String toCountSql(String sql) { + return toCountSql(sql, ASTERISK, false); } - public static String toCountSql(String sql, String expr, String alias) { - return toCountSql(sql, expr, alias, null); + public static String toCountSql(String sql, boolean keepSorting) { + return toCountSql(sql, ASTERISK, keepSorting); } - public static String toCountSql(String sql, String alias, SqlDialect sqlDialect) { - return toCountSql(sql, null, alias, sqlDialect); + public static String toCountSql(String sql, String expr) { + return toCountSql(sql, expr, false); } - public static String toCountSql(String sql, String expr, String alias, SqlDialect sqlDialect) { - try { - // Parse statement with db type. - SQLStatement sqlStatement = SQLUtils.parseSingleStatement(sql, getDbType(sqlDialect)); - if (!(sqlStatement instanceof SQLSelectStatement)) { - throw new IllegalSqlException("Unsupported non-query SQL"); - } - SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) sqlStatement; - SQLSelectQuery sqlSelectQuery = sqlSelectStatement.getSelect().getQuery(); - if (!(sqlSelectQuery instanceof SQLSelectQueryBlock)) { - return toSimpleCountSql(sql, expr, alias); - } - // Return simple count SQL if it is a distinct query. - SQLSelectQueryBlock sqlSelectQueryBlock = (SQLSelectQueryBlock) sqlSelectQuery; - if (sqlSelectQueryBlock.isDistinct()) { - return toSimpleCountSql(sql, expr, alias); - } - // Return simple count SQL if there is "GROUP BY". - SQLSelectGroupByClause sqlSelectGroupByClause = sqlSelectQueryBlock.getGroupBy(); - if (sqlSelectGroupByClause != null) { - return toSimpleCountSql(sql, expr, alias); - } - // Return simple count SQL if there are aggregate functions. - List sqlSelectItems = sqlSelectQueryBlock.getSelectList(); - if (hasAnyAggregate(sqlSelectItems)) { - return toSimpleCountSql(sql, expr, alias); - } - if (sqlSelectItems != null && !sqlSelectItems.isEmpty()) { - // Remove select items. - sqlSelectItems.clear(); + public static String toCountSql(String sql, String expr, boolean keepSorting) { + SQLParser parser = getParser(sql); + SingleStatementContext context = parser.singleStatement(); + return convert(sql, expr, keepSorting, context); + } + + private static String convert(String sql, String expr, boolean keepSorting, SingleStatementContext singleStatementContext) { + if (singleStatementContext.exception != null || singleStatementContext.getChildCount() <= 0) { + return null; + } + for (int i = 1; i < singleStatementContext.getChildCount(); i++) { + if (!(singleStatementContext.getChild(i) instanceof TerminalNode) || (singleStatementContext.getChild(i) instanceof ErrorNode)) { + return null; } - // Remove "ORDER BY". - sqlSelectQueryBlock.setOrderBy(null); - // Set count function. - SQLUtils.addSelectItem(sqlStatement, buildCountExpr(expr), null, true); - return sqlStatement.toString(); - } catch (Exception ignored) { - return toSimpleCountSql(sql, expr, alias); } + StatementDefaultContext statementDefaultContext = singleStatementContext.getChild(StatementDefaultContext.class, 0); + if (statementDefaultContext == null) { + return null; + } + QueryContext queryContext = statementDefaultContext.getChild(QueryContext.class, 0); + if (queryContext == null) { + return null; + } + List replacements = new ArrayList<>(); + if (!validateQuery(queryContext, expr, keepSorting, replacements)) { + return null; + } + if (replacements.isEmpty()) { + return sql; + } + StringBuilder sb = new StringBuilder(sql); + replacements.stream() + .sorted(Comparator.reverseOrder()) + .forEach(replacement -> { + if (replacement.getValue() == null) { + sb.delete(replacement.getBegin(), replacement.getEnd()); + } else { + sb.replace(replacement.getBegin(), replacement.getEnd(), replacement.getValue()); + } + }); + return sb.toString(); } - public static String toSimpleCountSql(String sql, String alias) { - return "SELECT COUNT(" + ASTERISK + ") FROM (" + sql + ") " - + (StringUtils.isNotBlank(alias) ? alias : DEFAULT_TABLE_ALIAS); + private static boolean validateQuery(QueryContext queryContext, String expr, boolean keepSorting, List replacements) { + return validateQueryTerm(queryContext.getChild(QueryTermDefaultContext.class, 0), expr, keepSorting, replacements) + && removeQueryOrganization(queryContext.getChild(QueryOrganizationContext.class, 0), keepSorting, replacements); } - public static String toSimpleCountSql(String sql, String expr, String alias) { - if (StringUtils.isBlank(expr)) { - expr = ASTERISK; + private static boolean validateQueryTerm(QueryTermContext queryTermContext, String expr, boolean keepSorting, List replacements) { + if (queryTermContext == null) { + return false; } - return "SELECT COUNT(" + expr + ") FROM (" + sql + ") " - + (StringUtils.isNotBlank(alias) ? alias : DEFAULT_TABLE_ALIAS); - } - - public static SQLExpr buildCountExpr(String expr) { - if (StringUtils.isBlank(expr) || expr.equals(ASTERISK)) { - return COUNT_EXPR; + QueryPrimaryContext queryPrimaryContext = queryTermContext.getChild(QueryPrimaryDefaultContext.class, 0); + if (queryPrimaryContext == null) { + SubqueryContext subqueryContext = queryTermContext.getChild(SubqueryContext.class, 0); + QueryContext innerQueryContext = subqueryContext.getChild(QueryContext.class, 0); + return validateQuery(innerQueryContext, expr, keepSorting, replacements); } - return SQLUtils.toSQLExpr("COUNT(" + expr + ")"); - } - - public static boolean hasAnyAggregate(List sqlSelectItems) { - if (sqlSelectItems == null || sqlSelectItems.isEmpty()) { + QuerySpecificationContext querySpecificationContext = queryPrimaryContext.getChild(RegularQuerySpecificationContext.class, 0); + if (querySpecificationContext == null) { return false; } - for (SQLSelectItem item : sqlSelectItems) { - SQLExpr expr = item.getExpr(); - String exprString = expr != null ? expr.toString() : null; - if (expr == null - || StringUtils.isEmpty(exprString) - || ASTERISK.equals(exprString)) { + SelectClauseContext selectClauseContext = querySpecificationContext.getChild(SelectClauseContext.class, 0); + AggregationClauseContext aggregationClauseContext = querySpecificationContext.getChild(AggregationClauseContext.class, 0); + HavingClauseContext havingClauseContext = querySpecificationContext.getChild(HavingClauseContext.class, 0); + if (selectClauseContext == null || aggregationClauseContext != null || havingClauseContext != null) { + return false; + } + SetQuantifierContext setQuantifierContext = selectClauseContext.getChild(SetQuantifierContext.class, 0); + if (setQuantifierContext != null) { + return false; + } + NamedExpressionSeqContext namedExpressionSeqContext = selectClauseContext.getChild(NamedExpressionSeqContext.class, 0); + if (namedExpressionSeqContext == null) { + return false; + } + for (int i = 0; i < namedExpressionSeqContext.getChildCount(); i++) { + ParseTree child = namedExpressionSeqContext.getChild(i); + if (!(child instanceof NamedExpressionContext)) { continue; } - if (expr instanceof SQLAggregateExpr) { - return true; + NamedExpressionContext namedExpressionContext = (NamedExpressionContext) child; + ExpressionContext expressionContext = namedExpressionContext.getChild(ExpressionContext.class, 0); + PredicatedContext predicatedContext = expressionContext.getChild(PredicatedContext.class, 0); + if (predicatedContext == null) { + return false; + } + ValueExpressionContext valueExpressionContext = predicatedContext.getChild(ValueExpressionDefaultContext.class, 0); + if (valueExpressionContext == null) { + return false; } - if (isAggregate(exprString)) { - return true; + ParseTree primaryExpressionContext = valueExpressionContext.getChild(0); + if (isSimpleExpression(primaryExpressionContext)) { + continue; } + return false; } - return false; + if (namedExpressionSeqContext.children != null) { + replacements.add(new Replacement( + namedExpressionSeqContext.getStart().getStartIndex(), + namedExpressionSeqContext.getStop().getStopIndex() + 1, + toCountFunction(expr))); + } + return true; } - private static boolean isAggregate(String expr) { - if (expr.indexOf(OPENING_PARENTHESIS) == -1) { - return false; + private static boolean isSimpleExpression(ParseTree primaryExpressionContext) { + if (primaryExpressionContext instanceof IdentifierContext + || primaryExpressionContext instanceof CurrentLikeContext + || primaryExpressionContext instanceof ConstantDefaultContext + || primaryExpressionContext instanceof StarContext + || primaryExpressionContext instanceof ColumnReferenceContext + || primaryExpressionContext instanceof SubstringContext + || primaryExpressionContext instanceof TrimContext + || primaryExpressionContext instanceof OverlayContext) { + return true; + } else if (primaryExpressionContext instanceof DereferenceContext) { + DereferenceContext dereferenceContext = (DereferenceContext) primaryExpressionContext; + return isSimpleExpression(dereferenceContext.base) + && isSimpleExpression(dereferenceContext.fieldName); } - String lowerCaseExpr = expr.toLowerCase(); - Set aggregateFunctions = AGGREGATE_FUNCTION_MAP.get(lowerCaseExpr.charAt(0)); - if (aggregateFunctions != null && !aggregateFunctions.isEmpty()) { - for (String aggregateFunction : aggregateFunctions) { - if (lowerCaseExpr.startsWith(aggregateFunction)) { - return true; + return false; + } + + private static boolean removeQueryOrganization(QueryOrganizationContext queryOrganizationContext, boolean keepSorting, List replacements) { + if (queryOrganizationContext != null && queryOrganizationContext.children != null) { + if (keepSorting) { + TerminalNode limit = queryOrganizationContext.getToken(SQLLexer.LIMIT, 0); + if (limit != null) { + replacements.add(new Replacement( + limit.getSymbol().getStartIndex(), + queryOrganizationContext.getStop().getStopIndex() + 1)); } + } else { + replacements.add(new Replacement( + queryOrganizationContext.getStart().getStartIndex(), + queryOrganizationContext.getStop().getStopIndex() + 1)); } } - return false; + return true; } - private static Map> buildAggregateMap(String[] array) { - if (array == null || array.length == 0) { - return Collections.emptyMap(); - } - return Collections.unmodifiableMap( - Arrays.stream(array) - .map(o -> o.toLowerCase() + OPENING_PARENTHESIS) - .collect(Collectors.groupingBy(o -> o.charAt(0), Collectors.toSet()))); + private static String toCountFunction(String expr) { + return expr == null || expr.isEmpty() || ASTERISK.equals(expr) ? "COUNT(*)" : "COUNT(" + expr + ")"; } - private static String getDbType(SqlDialect sqlDialect) { - if (sqlDialect == null) { - return JdbcConstants.MYSQL; - } - switch (sqlDialect) { - case DB2: - return JdbcConstants.DB2; - case DERBY: - return JdbcConstants.DERBY; - case H2: - return JdbcConstants.H2; - case HIVE: - return JdbcConstants.HIVE; - case HSQLDB: - return JdbcConstants.HSQL; - case INFORMIX: - return JdbcConstants.INFORMIX; - case MARIADB: - return JdbcConstants.MARIADB; - case MYSQL: - return JdbcConstants.MYSQL; - case ORACLE: - return JdbcConstants.ORACLE; - case PHOENIX: - return JdbcConstants.PHOENIX; - case POSTGRESQL: - return JdbcConstants.POSTGRESQL; - case SQLITE: - return JdbcConstants.SQLITE; - case SQLSERVER: - return JdbcConstants.SQL_SERVER; - case TIDB: - return JdbcConstants.MYSQL; - default: - return JdbcConstants.MYSQL; - } + private static SQLParser getParser(String s) { + SQLLexer lexer = new SQLLexer(CharStreams.fromString(s)); + SQLParser parser = new SQLParser(new CommonTokenStream(lexer)); + parser.removeErrorListeners(); + parser.removeParseListeners(); + return parser; } - } diff --git a/mypages/src/main/java/io/leego/mypages/util/StringUtils.java b/mypages/src/main/java/io/leego/mypages/util/StringUtils.java deleted file mode 100644 index 7c76462..0000000 --- a/mypages/src/main/java/io/leego/mypages/util/StringUtils.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.leego.mypages.util; - -/** - * @author Yihleego - */ -public final class StringUtils { - public static final String EMPTY = ""; - public static final String NULL = null; - public static final String LINE_BREAK = "[\n\r]"; - - private StringUtils() { - } - - public static boolean isNull(CharSequence text) { - return text == null; - } - - public static boolean isNotNull(CharSequence text) { - return text != null; - } - - public static boolean isEmpty(CharSequence text) { - return text == null || text.length() == 0; - } - - public static boolean isNotEmpty(CharSequence text) { - return !isEmpty(text); - } - - public static boolean isBlank(CharSequence text) { - if (isEmpty(text)) { - return true; - } - for (int i = 0, len = text.length(); i < len; ++i) { - if (!Character.isWhitespace(text.charAt(i))) { - return false; - } - } - return true; - } - - public static boolean isNotBlank(CharSequence text) { - return isNotEmpty(text) && !isBlank(text); - } - - public static String trim(String text) { - return text == null ? null : text.trim(); - } - -} diff --git a/pom.xml b/pom.xml index 8b0a429..e7918d1 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ io.leego mypages-parent - 1.1.2 + 2.0.0 pom ${project.artifactId} MyPages is a java based, open source pagination plugin for MyBatis that simplifies database paging queries. @@ -17,7 +17,7 @@ The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt + https://www.apache.org/licenses/LICENSE-2.0.txt repo @@ -54,21 +54,26 @@ mypages + mypages-samples + mypages-spring-boot-autoconfigure mypages-spring-boot-starter + mypages-test 1.8 - UTF-8 + UTF-8 3.8.1 + 3.2.0 3.2.1 3.2.0 1.6 1.6.8 - 3.5.6 - 2.1.3 - 1.1.23 - 2.3.1.RELEASE + 3.5.7 + 2.2.0 + 2.2.0 + 4.9.2 + 2.5.3 @@ -86,7 +91,15 @@ ${java.version} ${java.version} - ${project.build.sourceEncoding} + ${encoding} + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + ${encoding} @@ -103,7 +116,15 @@ ${java.version} ${java.version} - ${project.build.sourceEncoding} + ${encoding} + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + ${encoding} @@ -169,6 +190,16 @@ mypages ${project.version} + + io.leego + mypages-spring-boot-autoconfigure + ${project.version} + + + io.leego + mypages-spring-boot-starter + ${project.version} + org.mybatis mybatis @@ -180,19 +211,21 @@ ${mybatis-spring-boot-autoconfigure.version} - com.alibaba - druid - ${druid.version} + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot-starter.version} - org.springframework.boot - spring-boot-autoconfigure - ${spring-boot.version} + org.antlr + antlr4 + ${antlr4.version} org.springframework.boot - spring-boot-configuration-processor + spring-boot-dependencies ${spring-boot.version} + pom + import